如何在不同的类中创建多个窗口,而不是在Win32的c++中使用main函数

How do I create multiple windows in different classes than the main function in C++ with Win32

本文关键字:c++ Win32 函数 main 创建 窗口      更新时间:2023-10-16

如何在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_CREATEWM_NCCREATE通知消息中。但是,一旦这样做了,你可以简单地在这个类中创建许多窗口,并且你将能够从(静态)WndProc中访问c++对象。

由于WinAPI不是特别简单,也不是c++友好,我的建议是:

  • 首先直接使用API创建窗口,忘记使用c++类暂时
  • 一旦这工作,重构你的应用程序,但识别类和对象,并可选择使用WM_CREATE技巧来允许WndProc直接访问c++对象
  • 如果你想更进一步,把WndProc改成一个包装器,它只寻找合适的c++对象,并在其上调用非静态方法。

您可以将WTL视为在C Windows API之上使用c++的示例,但不幸的是文档相当糟糕。