我目前正在大量使用这样的代码来确定控件在窗口客户区中的位置:
CRect rect;
GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect);
ScreenToClient(&rect);
一切工作正常,但我担心此代码的安全性。具体来说,如果由于包含上述代码的线程被Windows挂起而导致用户在
GetWindowRect
和ScreenToClient
之间移动窗口,会产生错误的结果吗?如果是这样,还有更好的方法吗? 最佳答案
当您在消息处理程序函数内的代码执行时,用户将根本无法移动窗口。所以不,这将不是问题。
用户界面在运行代码时基本上被暂时冻结或暂停。从技术上讲,这是因为Windows在您返回之前无法处理其他消息。从消息处理程序函数返回后,消息循环将再次开始运行,从而返回控件。
当然,这就是为什么您不应该在消息处理程序中执行需要很长时间才能运行的代码(例如,复杂的计算)的原因,因为UI会一直冻结直到完成。
相反,您应该剥离一个单独的线程来运行这种东西。由于您在这里不是多线程的(并且不需要,因为此代码花费的时间可以忽略不计),因此不会出现重新输入问题。