1

我有个问题。我在一个线程中创建了一个窗口。我创建了一个互斥锁,以便窗口句柄不能通过函数检索,直到它不为 0。

我还使用了一个while循环来确保句柄不为0。

事实是,句柄永远不会为 0,因为 CreateWindowEx 在窗口甚至显示在屏幕上之前返回窗口的句柄。

所以我的互斥锁和while循环失败了。我需要知道窗口何时完全显示并完成它必须做的任何事情,以便我可以从另一个线程上绘制它。

Handle 不是 0,DC 不是 0。但是当我画的时候,它什么也没画。如果我在执行 CreateWindowEx 和 ShowWindow 之后立即放置 Sleep(100),则会显示窗口并正确绘制图像。我也在循环 IsWindowVisisble(WindowHandle) 时尝试过。那也失败了。

我不想睡​​觉(100),我该怎么办?

4

2 回答 2

7

不要尝试从另一个线程在窗口上绘图。

将一些数据发布到窗口并让它根据该数据绘制自己。无论如何,它需要准备好绘制自己以响应 WM_PAINT,并且在任何情况下都需要任何必要的数据。跳过箍以不同的方式进行初始绘图将增加大量工作,并且基本上不会给您任何回报。

于 2012-12-25T17:18:58.587 回答
0

另请注意,在您对消息队列执行某些操作之前,不会发生任何事情(不会显示窗口);即PeekMessage/GetMessageDispatchMessage。而且,正如其他人所说,如果您使用 GDI 绘图,则必须在WM_PAINT. 如果要强制更新,请使用InvalidateRect. 请记住,如果您尝试使用由其他线程创建的窗口,则会有很多问题。

于 2012-12-25T23:34:46.467 回答