那麼你當然不能等待他們關閉,你至少需要pump messages,以便他們能夠接收和處理WM_CLOSE
。我想你怎麼做到這一點取決於你。但我看到你在做PostMessage
。爲什麼不改爲SendMessage
- 這將在窗口的窗口過程中同步運行。或者你想退出應用程序?那麼你應該真的使用PostQuitMessage
然後以正常的方式泵送消息,直到GetMessage
返回0.許多選項。
Pumping messages意味着在代碼中有一個循環,看起來像這樣。您不必撥打AfxPumpMessages
,但這可能會做類似的事情。實際上有許多不同的方式來取決於你想要做什麼來傳遞信息。另外還有相當多的功能可以爲你提供信息。
BOOL bRet;
// note that GetMessage returns 0 when WM_QUIT is received - this is how PostQuitMessage
// would work to get us to shut down
// We are passing NULL for the hWnd parameter - this means receive all window and
// thread messages for this thread
while((bRet = GetMessage(&msg, NULL /* hWnd */, 0, 0)) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
如果您發佈的消息發佈到窗口或窗口,那麼你就需要抽取消息。會發生什麼情況是消息進入與該窗口相關的線程(此線程)的隊列 - 消息泵會將它們提取出來並將它們分發到正確的窗口過程。
如果您發送了消息而不是發佈消息,那麼該窗口的窗口過程將直接調用 - 而不是進入隊列。您不需要泵送消息,因爲一旦SendMessage返回消息已完全處理。
方式PostQuitMessageworks是通過上指示應用程序應該退出消息隊列中設置標誌。 WM_QUIT消息不是真正的窗口消息,你會發送 - 會發生什麼GetMessage
將在所有其他發佈的窗口消息處理完畢後檢查此標誌,並且如果設置返回0。這將導致所有窗口正確關閉,並且您不需要將它自己發送到窗口。
是的,當然... WM_DESTROY對我來說太晚了,但SendMessage是我所需要的 - 有時候顯而易見的東西在你面前:)謝謝。 – dennisV 2009-06-11 14:20:11