指向父类中派生类的功能的指针

时间:2014-02-08 20:44:20

标签: c++ winapi pointers derived-class base-class

目前我正在学习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

1 个答案:

答案 0 :(得分:1)

您不能将非静态类方法用作窗口过程回调。由于隐藏的this指针,参数列表不兼容。你需要做的是:

  1. BaseWindow中,将静态方法定义为向RegisterClassEx()注册的实际消息回调,然后定义用于处理消息的单独虚拟方法。拥有虚拟方法调用BaseWindow的{​​{1}}实现,覆盖虚方法的后代需要为未处理的消息调用基本方法。

  2. 将对象的DefWindowProc()指针作为this的{​​{1}}传递。

  3. lpCreateParam消息处理程序中,从消息中检索CreateWindow/Ex()值,并使用WM_NCCREATElpCreateParam将其分配给HWND,然后键入 - 将值转换为SetWindowLongPtr(GWL_USERDATA)指针并使用它来调用虚方法。

  4. 对于后续消息,请使用SetProp()BaseWindow*从HWND检索GetWindowLongPtr(GWL_USERDATA)指针,并使用它来调用虚拟方法。