2

我正在尝试使用 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;
    }
4

1 回答 1

8

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

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

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

请注意,根据文档,您还可以调用该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;
}
于 2012-01-08T04:52:55.797 回答