我现在经常使用这样的代码来确定控件在窗口客户区中的位置:
CRect rect;
GetDlgItem(IDC_CONTROL_ID)->GetWindowRect(&rect);
ScreenToClient(&rect);一切正常,但我担心这段代码的安全性。具体地说,如果用户由于包含上述代码的线程被GetWindowRect挂起而将窗口移动到ScreenToClient和window之间,是否会产生错误的结果?如果是这样,有没有更好的方法呢?
发布于 2012-02-23 13:05:11
当您的消息处理函数中的代码正在执行时,用户将根本无法移动窗口。所以不,这不是问题。
在代码运行期间,UI基本上是暂时冻结或挂起的。从技术上讲,这是因为在您返回之前,Windows无法处理其他消息。一旦您从消息处理程序函数返回,消息循环就会再次开始运行,从而返回控制权。
当然,这就是为什么你不应该在消息处理程序中执行需要很长时间运行的代码(例如,复杂的计算),因为UI将被冻结,直到它完成。
相反,你应该分离出一个单独的线程来运行这类东西。因为您在这里不是多线程(并且不需要多线程,因为这段代码的执行时间可以忽略不计),所以不会出现可重入性问题。
https://stackoverflow.com/questions/9407413
复制相似问题