如何在Win32中使用c++中的WinMain函数创建不同类的多个窗口?
我想做什么:
My Source Files:
- FileThatContainsMainFunction.cpp
- Window1.cpp
- Window2.cpp
在Main函数中,我想创建两个对象(一个用于Window1,一个用于Window2),在它们的构造函数中创建Win32 Windows。如:
Window1 w1;
Window2 w2;
注意:这个问题是针对c++类的,而不是Win32类。
它的工作方式和你在问题中描述的差不多:
Window1.h
#ifndef Window1H
#include <windows.h>
class Window1
{
private:
HWND hWnd;
public:
Window1();
~Window1();
};
#endif
Window1.cpp
#include "Window1.h"
Window1::Window1()
{
// register and create window as needed
hWnd = CreateWindowEx(...);
}
Window1::~Window1()
{
DestroyWindow(hWnd);
}
Window2.h
#ifndef Window2H
#include <windows.h>
class Window2
{
private:
HWND hWnd;
public:
Window2();
~Window2();
};
#endif
Window2.cpp
#include "Window2.h"
Window2::Window2()
{
// register and create window as needed
hWnd = CreateWindowEx(...);
}
Window2::~Window2()
{
DestroyWindow(hWnd);
}
FileThatContainsMainFunction.cpp
#include "Window1.h"
#include "Window2.h"
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Window1 w1;
Window2 w2;
//...
return 0;
}
有了Win API和一些c++,一切皆有可能。但这并不容易:在创建窗口之前,必须注册它的WNDCLASS。由于c++对静态初始化不太友好,因此必须在创建任何窗口之前在主程序中进行初始化。之后,您将能够使用@RemyLebeau的解决方案创建您的窗口。
如果你想使用c++类来包装一个WNDCLASS,你需要一个WndProc的静态函数,并在Windows本身通过SetWindowsLong
存储一个指向c++对象的指针。唯一安全的地方是在WM_CREATE
或WM_NCCREATE
通知消息中。但是,一旦这样做了,你可以简单地在这个类中创建许多窗口,并且你将能够从(静态)WndProc中访问c++对象。
由于WinAPI不是特别简单,也不是c++友好,我的建议是:
- 首先直接使用API创建窗口,忘记使用c++类暂时
- 一旦这工作,重构你的应用程序,但识别类和对象,并可选择使用WM_CREATE技巧来允许WndProc直接访问c++对象
- 如果你想更进一步,把WndProc改成一个包装器,它只寻找合适的c++对象,并在其上调用非静态方法。
您可以将WTL视为在C Windows API之上使用c++的示例,但不幸的是文档相当糟糕。