C++ 检测窗口是否已完成绘制并显示在屏幕上(WINAPI)

C++ 检测窗口是否已完成绘制并显示在屏幕上(WINAPI),c++,winapi,C++,Winapi,我有个问题。我在线程中创建了一个窗口。我创建了一个互斥锁,因此在窗口句柄不是0之前,无法通过函数检索它 我还使用了while循环来确保句柄不是0 事实上,句柄永远不会是0,因为CreateWindowEx在窗口显示在屏幕上之前就将句柄返回给窗口 所以我的互斥和while循环失败了。我需要知道窗口何时完全显示并完成它必须完成的任何操作,以便我可以从另一个线程中绘制它 句柄不是0,DC不是0。但当我画的时候,它什么也没画。如果在执行CreateWindowEx和ShowWindow之后立即设置睡眠(

我有个问题。我在线程中创建了一个窗口。我创建了一个互斥锁,因此在窗口句柄不是0之前,无法通过函数检索它

我还使用了while循环来确保句柄不是0

事实上,句柄永远不会是0,因为CreateWindowEx在窗口显示在屏幕上之前就将句柄返回给窗口

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

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


我不想睡觉(100),我能做什么?

不要试图从另一个线程在窗口上画画


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

不要试图从其他线程在窗口上绘制


将一些数据发布到窗口,让它根据这些数据绘制自己。无论如何,它都需要准备好根据WM_绘画绘制自己,并且在任何情况下都需要任何必要的数据。跳转以不同的方式完成初始绘图将增加大量工作,并且基本上不会给您带来任何回报。

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

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

Ehm,只需处理
WM\u SHOWWINDOW
?什么是“处理”WM\u SHOWWINDOW?如果您可以从窗口过程中执行此操作,我相信初始化完成后它将接收
WM\u SETWINDOWPOS
。Raymod Chen曾经提到过,我认为这就是结果。当它显示时,信息会发送到您的窗口,特别是您应该根据
WM\u PAINT
进行绘图。当然,当您的窗口接收到
WM\u SHOWWINDOW
WM\u PAINT
时,您也可以通知另一个线程(例如通过消息)。嗯,只需处理
WM\u SHOWWINDOW
?什么是“处理”WM\u SHOWWINDOW?如果您可以从窗口过程中执行此操作,我相信在初始化完成后,它会收到
WM_SETWINDOWPOS
。Raymod Chen曾经提到过,我认为这就是结果。当它显示时,信息会发送到您的窗口,特别是您应该根据
WM\u PAINT
进行绘图。当然,当您的窗口接收到
WM_SHOWWINDOW
WM_PAINT
时,您也可以通知另一个线程(例如通过消息)。我不明白:S窗口是这样创建的:然后我使用main中的另一个类绘制到它。我不想在窗口上画按钮或任何东西。我只是想用一个钢笔类,我把画圆和矩形到空白窗口只是为了看看他们的外观。我不想编辑WM_PAINT,但正确的做法是将您的绘图添加到屏幕中,在WM_PAINT中进行-这就是它的工作方式,也是系统中其他所有内容所期望的。不好的事情(通常很难追踪、奇怪,并且对环境中的各种变化很敏感-在不同类型的机器上运行代码,它的行为会有所不同,图形卡、处理器等会发生变化,事情也会发生变化)。如果您有需要很长时间才能绘制的内容,请将其绘制到屏幕外位图,然后将位图blit显示到屏幕上。我不明白:S窗口的创建方式是:然后我使用main中的另一个类绘制到它。我不想在窗口上画按钮或任何东西。我只是想用一个钢笔类,我把画圆和矩形到空白窗口只是为了看看他们的外观。我不想编辑WM_PAINT,但正确的做法是将您的绘图添加到屏幕中,在WM_PAINT中进行-这就是它的工作方式,也是系统中其他所有内容所期望的。不好的事情(通常很难追踪、奇怪,并且对环境中的各种变化很敏感-在不同类型的机器上运行代码,它的行为会有所不同,图形卡、处理器等会发生变化,事情也会发生变化)。如果您有需要很长时间才能绘制的内容,请将其绘制到屏幕外位图,然后将位图blit显示到屏幕上。