4

これが私のコードです。WinMain エントリ ポイントで、クラスを登録してウィンドウを作成しようとしましたが、CreateWindow() 関数は常に NULL を返します。ただし、RegisterClass() 関数は成功しました。私は何を間違えましたか?

#include <Windows.h>
#include <stdio.h>


LRESULT CALLBACK event(HWND, UINT, WPARAM, LPARAM)
{


    return 0;
}

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
    )
{
    WNDCLASS wndClass;
    wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpszMenuName = NULL;
    wndClass.lpfnWndProc = event;
    wndClass.lpszClassName = L"ME";
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;

    int err = RegisterClass(&wndClass);
    if (err < 0)
    {
        MessageBox(NULL, L"Can not register window class!", L"Error", 0);
        return -1;
    }
    HWND hwnd;
    hwnd = CreateWindow(L"ME",
    L"Test",
    WS_OVERLAPPEDWINDOW, 
    100,
    100, 
    300, 
    300, 
    NULL,
    NULL,
    hInstance, 
    NULL);
    if (hwnd == NULL)
    {
        MessageBox(NULL, L"Can not create window!", L"Error", 0);
        return -1;
    }
    ShowWindow(hwnd, SW_NORMAL);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
4

1 に答える 1

10
LRESULT CALLBACK event(HWND, UINT, WPARAM, LPARAM)
{
    return 0;
}

これは根本的に壊れたウィンドウ プロシージャです。自分で処理しないメッセージに対して DefWindowProc() を呼び出すことはオプションではありません

WM_NCCREATE メッセージに対して FALSE を返すため、現時点ではウィンドウは作成されません。ウィンドウの作成を許可するには、TRUE を返す必要があります。OS に関する限り、ウィンドウの作成を意図的に拒否したため、GetLastError() からもエラー コードは返されません。修理:

LRESULT CALLBACK event(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    return DefWindowProc(hwnd, msg, wparam, lparam);
}
于 2015-07-18T16:46:30.527 に答える