2014-03-26 91 views
0

我試圖破壞我目前使用的HWND,並打開一個新窗口後dissapearing第二...窗口中顯示出來,然後

這是我的代碼:

PostMessage(MainHwnd, WM_DESTROY, NULL, NULL); // Destroy the window 
getClient() -> StartClient(); // Opening the client 

在StartClient在那裏我有:

RegisterMainClass(MainInstance); // Registaring the class 
//Creating the Window 
MainHwnd = CreateWindowEx(WS_EX_CLIENTEDGE ,"MainClient", "Client", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 600, 500, NULL, NULL, MainInstance, NULL); 

ShowWindow(MainHwnd, SW_SHOW); 
UpdateWindow(MainHwnd); 

所以窗口被破壞,客戶端窗口顯示了..但客戶端窗口只顯示了大約一秒鐘,然後再自敗!這是爲什麼?我已經檢查了幾次,它實際上創建了客戶端窗口,但它以某種方式隱藏它...

此外,我檢查了客戶端窗口的WndProc,它確實到達return DefWindowProc(hwnd, msg, wParam, lParam);

那麼是怎麼回事?爲什麼窗戶馬上消失?

我也有這2段在我RoomProc:

 case WM_CLOSE: 
     PostQuitMessage(1); 
    break; 

    case WM_DESTROY: 
     DestroyWindow(hwnd); 
+1

答案在於我們看不到的代碼。現在是SSCCE的時候了。 –

+0

正如其他人指出的,發送'WM_DESTROY'不正確。事實上,從你的'WM_DESTROY'處理程序中調用'DestroyWindow'創建了一個無限循環。最終你得到堆棧溢出並且進程終止。 –

+0

@RaymondChen在我見過的所有例子中,他們一直在調用WM_DESTROY處理程序中的DestroyWindow ......那麼我真的應該如何去做呢? – Amit

回答

0

我在線程中使用了兩行(銷燬窗口並創建一個新窗口),因此,它對我造成了問題。一旦我正常地調用函數,而不是在不同的線程中,一切都順利...

2

不要手動發佈WM_DESTROY。使用DestroyWindow()代替:

//PostMessage(MainHwnd, WM_DESTROY, NULL, NULL); 
DestroyWindow(MainHwnd); // Destroy the window 

因爲你要通過消息隊列,您WM_DESTROY消息被延遲,直到新的消息在稍後的時間處理,但那時你的MainHwnd變量發生了變化值,在新的窗口指向。此外,張貼WM_DESTROY並不實際銷燬窗口,它只是通知窗口它正在被銷燬。

+0

實際上,當我使用'DestroyWindow(MainHwnd)'時,它不會銷燬它... – Amit

+0

另外,在我的wm_destroy大小寫窗口proc,我已經破壞窗戶內... – Amit

+0

@Amit你需要回到基礎。當您調用DestroyWindow時,系統會向您發送WM_DESTROY消息。隱藏代碼令人失望。 –