2010-05-25 89 views
1

我在創建主窗口後創建了一個窗口,但在其句柄上調用DestroyWindow關閉了整個應用程序,我該如何擺脫它?爲什麼DestroyWindow關閉我的應用程序?

它看起來像這樣:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    HWND fakehandle; 


    hInst = hInstance; // Store instance handle in our global variable 

    hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_EX_LAYERED, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

    fakehandle = CreateWindow(szWindowClass, "FAKE WINDOW", WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

    if (!hWnd || !fakehandle) 
    { 
     return FALSE; 
    } 
//some code 
    DestroyWindow(fakehandle); 


    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    return TRUE; 
} 

我怎麼能摧毀這個窗口不會破壞我的主嗎?我正在創建一個虛擬窗口來檢查OpenGL中的多重採樣。

感謝

+0

你是否檢查過「hWnd」和「fakehandle」是不同的? – ChrisF 2010-05-25 21:29:38

+0

是的,他們是不同的根據調試... – jmasterx 2010-05-25 21:30:09

+0

不要故意批評你,因爲我相信你也有一個很好的理由。 Justo想要了解爲什麼要開發一個Windows應用Petzold風格? – 2010-05-25 21:38:26

回答

4

我剛剛發現了這個評論:

如果指定的窗口是父母或所有者窗口,當DestroyWindow而它破壞了父母或所有者窗口自動銷燬相關的兒童或擁有的窗口。該函數首先銷燬子窗口或擁有的窗口,然後銷燬父窗口或所有者窗口。

on the DestroyWindow MSDN page

這可能對您的問題有一些影響?你可以設置hWnd的父母,你有//some code

2

我懷疑指定的父(從末四PARAM)的「fakehandle」窗口,而不是NULL,可能會有幫助。

此外,您可能會檢查是否引用此引用「如果被銷燬的窗口是沒有WS_EX_NOPARENTNOTIFY樣式的子窗口,則會向父級發送WM_PARENTNOTIFY消息。」 (來自:msdn.microsoft.com)適用於您的案例。

2

在收到WM_CLOSEWM_DESTROY後,szWindowClass提及PostQuitMessage所指的等級?這應該會在第一時間停止你的消息循環,我應該想。 (但是如果你使用的是調試器,大概你已經發現了這個?)

在任何情況下,爲了達到最佳效果,你需要第二個帶有啞WndProc的窗口類。 (我認爲DefWindowProc將是合適的。)

3

DestroyWindow()發送WM_DESTROY到有問題的窗口。如果WndProc將WM_DESTROY傳遞給DefWindowProc(),那麼DefWindowProc()將會終止你的應用程序。

因此,在你的WndProc中,爲WM_DESTROY創建一個處理程序(如果你還沒有的話),並檢查窗口句柄。你應該能夠區分這兩者並從那裏採取行動。

// assuming you have the two window handles as hwnd1 and hwnd2 
case WM_DESTROY: 
    if(hwnd == hwnd1) { 
     // this will kill the app 
     PostQuitMessage(0); 
    } else if(hwnd == hwnd2) { 
     // chucking WM_DESTROY on the floor 
     // means this window will just close, 
     // and the other one will stay up. 
     return; 
    } 
    break; 

請注意,如果你代表要麼窗口做PostQuitMessage(),它會記下你的應用程序,因爲PostQuitMessage()將終止消息循環。

相關問題