2

C++ を使用して単純なウィンドウをセットアップしようとしていますが、への呼び出しがCreateWindowEx返されますNULL。私が使用しているコードのほとんどは、MSDN Web サイトの例に基づいています。私が試したことは何もありませんでした。助けていただければ幸いです。

コードは次のとおりです。

//Include the windows header
#include <Windows.h>

//Forward declaration of the WndProc function
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

//Main entry point
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
    //Window class name
    const wchar_t windowName[] = L"Window Class";

    //Set up window class
    WNDCLASS wnd;
    wnd.lpfnWndProc = WndProc;
    wnd.hInstance = hInstance;
    wnd.lpszClassName = windowName;

    //Register window class
    RegisterClass(&wnd);

    //Create window
    //! This returns NULL
    HWND hWnd = CreateWindowEx(
        0,
        windowName,
        L"Windows Programming",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
        );

    //Simple check to see if window creation failed
    if(hWnd == NULL) {
            //Pause
        system("PAUSE");
        return -1;
    }

    //Show the window
    ShowWindow(hWnd, nCmdShow);

    //Main message loop
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

//WndProc function
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch(msg) {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hDc = BeginPaint(hWnd, &ps);

            FillRect(hDc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW + 1));

            EndPaint(hWnd, &ps);

            return 0;
        }
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}
4

2 に答える 2

9

MSDNのサンプルでは、​​気になるフィールドを設定する前に、WNDCLASSのすべてのフィールドがゼロになっていることに注意してください。

WNDCLASS wnd = { };  // from MSDN example

空の中括弧は、構造全体を0に初期化するためのCおよびC ++の省略形です。これをと書くことも一般{ 0 }的です。これは技術的には少し異なりますが、正味の効果は同じです。

コードで、初期化を削除しました。

WNDCLASS wnd;  // your code

cbClsExtraしたがって、またはなどの他の重要なフィールドの1つでcbWndExtra、クラスの登録を不可能にするガベージ値を取得している可能性があります。クラスが登録されていないため、そのクラスのウィンドウを作成できませんでした。

于 2012-12-01T18:16:43.850 に答える
8

私はあなたのコードを機能させました。基本的に、WNDCLASS (または WNDCLASSEX) 構造体を使用するときに行うことは、すべてのパラメーターを使用して、何かを見逃さないようにすることです。

//Include the windows header
#include <Windows.h>

//Forward declaration of the WndProc function
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

//Main entry point
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
    //Window class name
    const wchar_t windowName[] = L"Window Class";

    //Set up window class
    WNDCLASS wnd;
    wnd.cbClsExtra = 0;
    wnd.cbWndExtra = 0;
    wnd.hCursor = LoadCursor(0, IDC_ARROW);
    wnd.hIcon = LoadIcon(0, IDI_WINLOGO);
    wnd.lpszMenuName = 0;
    wnd.style = 0;
    wnd.hbrBackground = 0;
    wnd.lpfnWndProc = WndProc;
    wnd.hInstance = hInstance;
    wnd.lpszClassName = windowName;

    //Register window class
    RegisterClass(&wnd);

    //Create window
    //! This returns NULL
    HWND hWnd = CreateWindowEx(
        0,
        windowName,
        L"Windows Programming",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL
        );

    //Simple check to see if window creation failed
    if(hWnd == NULL) {
            //Pause
        system("PAUSE");
        return -1;
    }

    //Show the window
    ShowWindow(hWnd, nCmdShow);

    //Main message loop
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

//WndProc function
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch(msg) {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hDc = BeginPaint(hWnd, &ps);

            FillRect(hDc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW + 1));

            EndPaint(hWnd, &ps);

            return 0;
        }
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}
于 2012-12-01T17:58:26.573 に答える