2011-09-20 102 views
0

我正在开发一个Windows应用程序,我正在实现整个事件循环以及类似于我自己的一切(这是有原因的)。在一个地方,我需要在显示一个窗口后执行一些代码。通常,当窗口被创建时,我会在收到WM_CREATE消息时进行一些初始化。 WM_SHOWWINDOW只是在窗口显示之前发送。不过,我需要在第一次显示窗口后执行一些代码。我似乎无法找到窗口显示后发送的通知消息。难道是没有一个?在窗口显示后执行代码

当然,我可以保留一个布尔值 - FirstRun - 指示我是否执行了我的逻辑,然后在接收到WM_ACTIVATE时执行代码,只要布尔值为TRUE,然后将FirstRun设置为FALSE,以便代码下一次我收到WM_ACTIVATE时不会执行,但这对我来说似乎有点不自然。

自从我在这个级别上做了win32编程以来,这已经过时了,所以不记得它。这里最好的方法是什么?

+0

你能听'WM_WINDOWPOSCHANGED'消息和测试的'SWP_SHOWWINDOW'标志? –

+0

这不会起作用,因为窗口可以在整个应用程序中多次显示和隐藏 - 但此代码只需在第一个“显示”中执行。 –

+0

好吧,记下你是否曾对此作出过反应,只反应过一次。 –

回答

3

没有特别的通知,但在很多情况下,你可以使用这一招:

LRESULT CALLBACK MainWndProc(
HWND hwnd,  // handle to window 
UINT uMsg,  // message identifier 
WPARAM wParam, // first message parameter 
LPARAM lParam) // second message parameter 
{ 
switch (uMsg) 
{ 
    case WM_USER + 100: 
     //window is just displayed, do some actions 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    case WM_CREATE: 
     PostMessage(hwnd, WM_USER + 100, 0, 0); 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    default: 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 
return 0; 
} 
+0

+1:我过去成功地做到了这一点。虽然在理论上,应该记住WM使用一些优先级从队列中退出。 IIRC WM_PAINT具有低优先级。但是这个技巧无论如何都适用。 –

+0

完美 - 工作一种享受!非常感谢! –

0

没有一个,因为这是WM_SHOWWINDOW的用途。一旦该消息传递给默认的消息处理过程,该窗口将显示。你可以做的最好的事情是通过某种计时器轮询IsWindowVisible

你的程序设计似乎有缺陷,但必须依赖于这样的事情。你想做什么?

相关问题