【问题标题】:C++ windows.h - window doesnt openC++ windows.h - 窗口没有打开
【发布时间】:2022-01-01 18:42:27
【问题描述】:
#include<windows.h>
#include<iostream>
#include<tchar.h>

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

TCHAR szClassName[ ] = _T("ClassName");

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hThisInstance;
    wincl.lpszMenuName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);
    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    if (!RegisterClassEx(&wincl))
        return 0;
    hwnd = CreateWindowEx(0, szClassName, _T("ClassName"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL);
    ShowWindow(hwnd, nCmdShow);
    while(GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

窗口不显示/打开。我已经尝试了 6 个小时直接找到问题,它不会在控制台中给我一个错误,它只是创建 .exe 窗口而不是另一个窗口。我是新手,所以不知道该怎么做或如何回复。

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    这个说法是错误的:

    wincl.lpszMenuName = szClassName;

    应该是这样的:

    wincl.lpszClassName = szClassName;

    您没有检查 CreateWindowEx() 是否失败(返回 NULL):

    hwnd = CreateWindowEx(...);
    if (hWnd == NULL) ... // <-- ADD THIS
    

    在这种情况下,它确实会失败,因为您没有正确注册类名,所以创建窗口会从GetLastError() 报告ERROR_CANNOT_FIND_WND_CLASS (1407) 错误。

    【讨论】:

    • 别忘了将wincl.lpszMenuName 设置为NULL
    • @MartinRosenau 最好在使用 Win32 结构之前将其清零,仅填充您实际需要的字段。
    • 我一直这样做,但 OP 似乎缺少 memsetZeroMemory 调用...
    • 不需要memset,只要声明为WNDCLASSEX wincl {};,它会自动归零。
    • 非常感谢 Alan Birtles、Martin Rosenau、Remy Lebeau 和 rustyx !!,我真的很感激,我是堆栈溢出的新手,人们的反应速度让我感到惊讶。再次,ty (:
    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2014-02-12
    相关资源
    最近更新 更多