目前我正在学习Win32和C ++,我完成了第一个应用程序。现在我想将代码从功能样式转换为OOP。这是我的代码的缩短版本:
#include <Windows.h>
class BaseWindow {
public:
BaseWindow ();
virtual LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) abstract;
bool Register ();
};
BaseWindow::BaseWindow () {}
bool BaseWindow::Register () {
WNDCLASSEXW wnd = {0};
wnd.lpfnWndProc = &BaseWindow::WndProc; // Error | How to point to the derived class's WndProc
// Some other properties
return RegisterClassExW(&wnd) != NULL;
}
class MainWindow : BaseWindow {
using BaseWindow::Register;
public:
MainWindow();
bool Register ();
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
};
MainWindow::MainWindow () : BaseWindow () {}
LRESULT CALLBACK MainWindow::WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
// Handling messages
}
如何将派生类的WndProc
绑定到wnd.lpfnWndProc
中的父类BaseWindow::Register
?
答案 0 :(得分:1)
您不能将非静态类方法用作窗口过程回调。由于隐藏的this
指针,参数列表不兼容。你需要做的是:
在BaseWindow
中,将静态方法定义为向RegisterClassEx()
注册的实际消息回调,然后定义用于处理消息的单独虚拟方法。拥有虚拟方法调用BaseWindow
的{{1}}实现,覆盖虚方法的后代需要为未处理的消息调用基本方法。
将对象的DefWindowProc()
指针作为this
的{{1}}传递。
在lpCreateParam
消息处理程序中,从消息中检索CreateWindow/Ex()
值,并使用WM_NCCREATE
或lpCreateParam
将其分配给HWND,然后键入 - 将值转换为SetWindowLongPtr(GWL_USERDATA)
指针并使用它来调用虚方法。
对于后续消息,请使用SetProp()
或BaseWindow*
从HWND检索GetWindowLongPtr(GWL_USERDATA)
指针,并使用它来调用虚拟方法。