2017-06-06 5 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を呼び出しますが、実際に結果を返す、とあなたはそのため未定義の動作をしているされていません。戻り値は重要であり、OSがウィンドウへの連続メッセージをどのように処理するかを制御することができます。たとえば、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

関連する問題