Win32 API - RegisterClassEx错误

zeb*_*und 2 winapi visual-c++ registerclass

我正在尝试使用VC++编译器和Visual Studio在Win32 API中打开一个简单的窗口.我想知道课程失败的原因; 我已经尝试在没有指针的情况下分配它,并将其作为指针分配并将其作为参考发送给函数.然而,无论我尝试什么,该RegisterClassEx函数都拒绝返回true.

为什么会这样,可以做些什么呢?

WinMain

WNDCLASSEX* wc = new WNDCLASSEX;
    HWND hwnd;
    MSG     msg;
    bool    done;

    wc->style = CS_HREDRAW | CS_VREDRAW;
    wc->lpfnWndProc = WndProc;
    wc->cbClsExtra = 0;
    wc->cbWndExtra = 0;
    wc->hInstance = hInstance;
    wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc->hCursor = LoadCursor(NULL, IDC_ARROW);
    wc->hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc->lpszClassName = L"someclass";

    if (!RegisterClassEx(wc)) {
        MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 7

您必须WNDCLASSEX通过填写cbSize成员来告诉Windows您的结构有多大.您在调用之前未能初始化此成员RegisterClassEx,这可能是该函数失败的原因.该sizeof操作是你所需要的.

您也无法初始化结构的其他一些成员,例如lpszMenuName.如果没有显式初始化它们,它们包含垃圾数据,这可能导致RegisterClassEx函数失败.如果您不使用它们,则需要将它们显式设置为0.

此外,仅仅因为RegisterClassEx参数接受指向WNDCLASSEX结构的指针并不意味着您必须将结构创建为指针.您可以在堆栈上创建常规对象,并使用address-of运算符(&)传递指向该函数的指针.

请注意,根据文档,您还可以调用该GetLastError函数以获取有关调用RegisterClassEx函数时出错的更多详细信息.这将帮助您在遇到问题时调试问题.

工作示例代码:

WNDCLASSEX wc    = {0};  // make sure all the members are zero-ed out to start
wc.cbSize        = sizeof(wc);
wc.style         = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc   = WndProc;
wc.hInstance     = hInstance;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = L"someclass";

if (!RegisterClassEx(&wc)) {
    MessageBox(NULL, L"Class registration has failed!",
               L"Error!", MB_OK | MB_ICONERROR);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)