c++ - 为什么 CreateWindowEx() 返回 NULL

标签 c++ createwindow

我在 MSDN 上学习了这个例子,但是当我编码时,我在使用 CreateWindowEx() 时遇到了很大的麻烦。它返回 NULL,因此无法创建窗口。我不明白为什么它会返回那个。此代码遵循 MSDN 示例。这是我的代码:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hIns, HINSTANCE hPreIns, PWSTR pCmdLine, int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPreIns);
    UNREFERENCED_PARAMETER(pCmdLine);
    HWND hWnd;
    TCHAR ClassName[] = L"Learn";
    TCHAR Title[] = L"My Window";
    WNDCLASSEX wcx;
    wcx.cbSize = sizeof(WNDCLASSEX);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.hInstance = hIns;
    wcx.lpszClassName = ClassName;
    wcx.lpfnWndProc = WndProc;
    wcx.cbClsExtra = 0;
    wcx.cbWndExtra = 0;
    wcx.hbrBackground = CreateSolidBrush(RGB(238,201,0));
    wcx.hIcon = LoadIcon(hIns, IDI_APPLICATION);
    wcx.lpszMenuName = NULL;
    wcx.hCursor = LoadCursor(hIns, IDC_WAIT);
    wcx.hIconSm = LoadIcon(hIns, IDI_INFORMATION);
    // Register
    RegisterClassEx(&wcx);

    hWnd = CreateWindowEx(0, ClassName, Title, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 1024, 768,
    NULL, NULL, hIns, NULL);
    if(hWnd == NULL)
    {
        MessageBox(hWnd, L"Fail!", L"Warning!", MB_OK);
        return 1;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG msg;
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hWnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }
    default: DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}

非常感谢。

最佳答案

  default: DefWindowProc(hWnd, msg, wParam, lParam);

这是错误的,返回 DefWindowProc() 返回的值非常重要。如果您不这样做,那么您的消息处理程序将为 WM_NCCREATE message 返回 FALSE .记录为强制 CreateWindowEx() 返回 NULL,Windows 放弃了创建窗口的尝试。修复:

  default: return DefWindowProc(hWnd, msg, wParam, lParam);

关于c++ - 为什么 CreateWindowEx() 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27213478/

相关文章:

android - 应用程序在 native 代码中的外部存储路径

c++ - 如何正确销毁从另一个线程运行的窗口?

c++ - 检测特定虚函数的 vtable 索引/序号(使用 Visual C++)

c++ - 如何动态链接grpc库c++?

c++ - 在游戏中显示帧的最快方法

c++ - 控制 Internet Explorer 以输入用户名/密码

c++ - 对话框窗口重新初始化问题

c++ - 如何仅根据屏幕大小创建一个窗口,不包括使用 C++/Windows 的窗口边框?

c++ - 获取准确的窗口区域大小 - CreateWindow 窗口大小不是正确的窗口大小