如何使用 Win32 在与 C++ 中的主函数不同的 类 中创建多个 windows
How do I create multiple windows in different classes than the main function in C++ with Win32
如何在 C++ 和 Win32 中以不同于 类 的 WinMain 函数创建多个 windows?
我想做什么:
我的源文件:
- FileThatContainsMainFunction.cpp
- Window1.cpp
- Window2.cpp
在 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_CREATE
或 WM_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;
}
如何在 C++ 和 Win32 中以不同于 类 的 WinMain 函数创建多个 windows?
我想做什么:
我的源文件:
- FileThatContainsMainFunction.cpp
- Window1.cpp
- Window2.cpp
在 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_CREATE
或 WM_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;
}