如何使用 Win32 在与 C++ 中的主函数不同的 类 中创建多个 windows

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

如何在 C++ 和 Win32 中以不同于 类 的 WinMain 函数创建多个 windows?

我想做什么:

我的源文件:

在 Main 函数中,我想创建两个对象(一个用于 Window1,一个用于 Window2),在它们的构造函数中创建 Win32 Windows。 例如:

Window1 w1;
Window2 w2;

注意:此问题针对 C++ 类,而非 Win32 类。

Win API 和一些 C++ 一切皆有可能。但这并不那么容易:在创建 window 之前,必须注册其 WNDCLASS。由于 C++ 对静态初始化不是很友善,因此您必须在创建任何 window 之前在主程序中执行此操作。之后,您将能够使用@RemyLebeau 的解决方案创建您的windows。

如果你想使用 C++ classes 来包装一个 WNDCLASS,你需要一个 WndProc 的静态函数,并通过 SetWindowsLong 在Windows 本身。唯一安全的地方是 WM_CREATEWM_NCCREATE 通知消息。但是一旦完成,您可以简单地在 class 中创建许多 windows,并且您将能够从(静态)WndProc 访问 c++ 对象。

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

  • 首先使用 API 直接创建你的 windows 并忘记 C++ classes 目前
  • 一旦成功,重构您的应用程序但识别 classes 和对象,并可选择使用 WM_CREATE 技巧以允许 WndProc 直接访问 c++ 对象
  • 如果您想走得更远,请将 WndProc 更改为一个包装器,该包装器仅查找正确的 C++ 对象,所有调用对象的非静态方法。

您可以将 WTL 视为在 C Windows API 之上使用 C++ 的示例,但遗憾的是文档非常糟糕。

它的工作方式与您在问题中描述的方式非常相似:

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;
}