我正在阅读Luna的DirectX 11 3D游戏编程简介.总是为Linux命令行编程,我决定先阅读附录A,一个win32编程入门,我不明白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是一个库级调用.规范示例是隐藏在操作系统内的"编辑"和"列表框"类.使用字符串或原子是一种非常简单的方法,可以避免依赖于依赖于实现的结构.
比较WNDCLASS和WNDCLASSEX,看看为什么这是一个好主意.