为什么 CreateWindow() 函数需要 WindowClass 的名称成员,而不是指向类本身的指针?
Why does the CreateWindow() function want the WindowClass's name member and not a pointer to the class itself?
我正在阅读Luna关于使用DirectX 11进行3D游戏编程的介绍。由于一直都是为Linux命令行编程的,我决定从阅读win32编程入门教程附录A开始,但我不理解CreateWindow()函数的某些行为。它的第一个参数是您想要创建的窗口类的名称,因此您必须首先声明一个窗口类,然后"注册"它(我认为这意味着将该类添加到神秘的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"answers"Listbox"类。使用字符串或原子是一种非常简单的方法,可以避免依赖于依赖于实现的结构。
比较WNDCLASS和WNDCLASSEX,看看为什么这是个好主意。
RegisterClass或RegisterClassEx返回Window内部使用的ATOM。因此,您传递的是名称中对该ATOM的内部引用,此外,您还可以创建多个类似的窗口,而无需重新执行RegisterClass部分。有时,人们还会在代码的不同部分进行RegisterClass和CreateWindow(Ex)调用。
您编辑过的关于使用wc.lpszClassName的问题在技术上是好的,如果您在WNDCLASS部分更改名称,您就不会有问题,尽管我使用了std::string,并将其分配给wc.lpsz ClassName=string.c_str();然后创建窗口(string.c_str(),…);
希望这有帮助:)
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队