CWnd :: ScreenToClient安全吗?

时间:2012-02-23 04:56:15

标签: c++ windows winapi mfc

我目前正在大量使用这样的代码来确定控件在窗口客户区域内的位置:

CRect rect;
GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect);
ScreenToClient(&rect);

一切正常,但我担心这段代码的安全性。具体来说,如果用户在GetWindowRectScreenToClient之间移动窗口,因为包含上述代码的线程被Windows暂停,它会产生错误的结果吗?如果是这样,有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

当您的消息处理函数内的代码正在执行时,用户根本无法移动窗口。所以不,这不会是一个问题。

在代码运行时,UI基本上会暂时冻结或暂停。从技术上讲,这是因为Windows在您返回之前无法处理其他消息。从消息处理函数返回后,消息循环再次开始运行,从而返回控制。

这当然是为什么你不应该在消息处理程序中执行需要很长时间才能运行的代码(例如,复杂的计算),因为UI将被冻结直到完成为止。
相反,你应该剥离一个单独的线程来运行这种东西。由于您不是多线程(并且不需要,因为此代码执行的时间可以忽略不计),因此不存在重新入侵问题。