我正在阅读 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/