2011-09-20 87 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

你的程序設計似乎有缺陷,但必須依賴於這樣的事情。你想做什麼?

相關問題