2017-06-06 58 views
0

我沒有太多的Windows編程經驗,但無法明確地看到這段代碼有什麼問題,但窗口沒有打開。儘管有時並不總是,它會在任務管理器中打開,所以我猜測它是註冊類並創建窗口,但是問題出在ShowWindow()函數上。但是,我不積極。Windows編程,窗口沒有打開,沒有生成錯誤

我的理解程序的流程是: 窗口創建與註冊類。 顯示窗口。 連續查找在Proc窗口中處理的消息。

我覺得我已經完成了所有這些事情,所以我的理解錯誤,或者是我的代碼丟失了什麼?

謝謝。

源代碼:

#include <Windows.h> 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    if (uMsg == WM_DESTROY) 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
    DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 

int WINAPI wWinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 
{ 
    //Variable for message loop. 
    MSG msg; 

    //Setting up the window class. 
    WNDCLASSEX windowClass; 
    windowClass.cbSize = sizeof(windowClass); 
    windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_PARENTDC; 
    windowClass.lpfnWndProc = WindowProc; 
    windowClass.hInstance = hinstance; 
    windowClass.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    windowClass.lpszClassName = "WindowClass"; 

    RegisterClassEx(&windowClass); 

    HWND windowHandle = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, "WindowClass", "My Program", WS_OVERLAPPEDWINDOW, 500, 200, 800, 500, NULL, NULL, hinstance, 0); 

    if (!windowHandle) 
     return FALSE; 

    ShowWindow(windowHandle, nCmdShow); 


    // Start the message loop. 
    while (GetMessage(&msg, NULL, 0, 0) != 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    // Return the exit code to the system. 
    return msg.wParam; 
} 
+0

檢查API調用失敗並查看GetLastError說什麼。 –

+1

我會使用WNDCLASSEX windowClass = {};'以確保結構的所有元素都被初始化爲零。 –

+0

謝謝。我這樣做,它的工作。 – kazama

回答

1

你的窗口過程調用DefWindowProc但實際上沒有返回結果,並且您已經未定義因爲這種行爲。返回值很重要,它可以控制操作系統如何處理連續的消息到窗口。例如,響應WM_CREATE消息返回正確的值很重要。

你的窗口過程更改爲:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    if (uMsg == WM_DESTROY) 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 

此外,馬克贖金的評論部分確定的,你應該零初始化WNDCLASSEX結構,以確保您不會在任何成員得到的垃圾,你沒有明確初始化。

+0

謝謝。這工作。另外,我沒有意識到不調零內存會產生如此大的影響。我認爲這並不重要。猜猜這是一個愚蠢的假設。 – kazama

+0

沒問題。想一想的一個好方法是:如果你不記憶零,那不是零。 – paddy