c++ - 为什么 CreateWindow() 函数需要 WindowClass 的名称成员而不是指向类本身的指针?

标签 c++ winapi

我正在阅读 Luna 的《使用 DirectX 11 进行 3D 游戏编程的介绍》。我一直为 Linux 命令行编程,所以我决定从阅读附录 A 开始,这是一本 win32 编程入门书,但我不了解创建窗口()函数。它的第一个参数是您要创建的窗口类的名称 - 所以您首先必须声明一个窗口类,然后“注册”它(我假设这意味着将类添加到神秘的 win32 API 中某处的某个类堆栈),然后将窗口类的 lpszClassName 成员传递给函数,如下所示:

WNDCLASS wc;
//set all the various members of wc
wc.lpszClassName = L"BasicWndClass";
RegisterClass(&wc);
ghMainWindow = CreateWindow(L"BasicWndClass", L"LOL", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, instanceHandle, 0);

我不明白为什么最后一行不是

ghMainWindow = CreateWindow(&wc, L"LOL", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, instanceHandle, 0);

是否有一些我不知道的历史或实际原因?

编辑:另外,做这样的事情是不好的做法吗?

ghMainWindow = CreateWindow(wc.lpszClassName, L"LOL", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, instanceHandle, 0);

最佳答案

因为CreateWindow和RegisterClass的调用一般不在同一个模块中。 CreateWindow 是应用程序级调用,RegisterClass 是库级调用。典型的例子是隐藏在操作系统中的“Edit”和“Listbox”类。使用字符串或原子是避免依赖依赖于实现的结构的一种非常简单的方法。

比较 WNDCLASS 与 WNDCLASSEX,看看为什么这是个好主意。

关于c++ - 为什么 CreateWindow() 函数需要 WindowClass 的名称成员而不是指向类本身的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34008358/

相关文章:

c++ - 使用具有 2 个数组作为参数的合并函数进行合并排序

c++ - 模板问题: Can compiler deduce template type in static method

c - Win32api 传递结构来创建线程

c++ - Win32 C++ Alphablend 位图部分透明

winapi - 为什么 LoadResource/LockResource 有时会返回串联的资源数据?

c++ - 我怎样才能制作一个 C++ 程序来找到任何大小矩阵的行列式和逆矩阵?

c++ - 如何使用 boost 异常将信息添加到 std::exception

c++ - 如何部分禁用 cmake C/C++ 自定义编译器检查

c++ - WinHTTP 异步回调

c++ - DirectDraw使用GetProcAddress获取程序地址