从WndProc调用非静态成员

Call non-static member from WndProc

本文关键字:静态成员 调用 WndProc      更新时间:2023-10-16

有人知道如何从WndProc调用非静态成员吗?

这是我的WndProc原型:

LRESULT CALLBACK System::Windows::Forms::Control::WndProc(HWND hWnd,
                      UINT message, WPARAM wParam, LPARAM lParam)            
{
    switch (message)
    {
    case WM_CREATE:
        this->OnCreate(new EventArgs(hWnd, message, wParam, lParam));
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}

定义:

class LIBMANAGED_API Control
{
protected:
    HWND hWnd;
    static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
...
};

这在很多层面上都是错误的。你真正想要实现什么?仅仅从这段代码中,没有足够的信息。

首先,您使用C和托管C++的混合物来声明此方法。它要么

protected virtual void WndProc(Message m) // Managed C++

如您所见,NOT静态方法、LRESULT、HWND等,或

LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

正如您所看到的,没有System命名空间。

第二,你的类在哪里定义?我怀疑您应该使用托管C++覆盖您的方法,请参阅MSDN。

您还没有处理完WM_CREATE消息。

诀窍是在创建时传递对象指针,并将其与WM_CREATE或WM_NCCREATE消息中的SetWindowLongPtr一起存储在窗口中。您可以使用GetWindowLongPtr提取它,并从窗口过程中访问您的对象。

窗口创建(假设MyWnd myWnd是表示窗口的C++对象):

HWND hWnd = CreateWindow( m_pszClassName, "Name", WS_VISIBLE | WS_OVERLAPPED,
    x, y, w, h, NULL, NULL, hInst, &myWnd);

窗口程序:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)            
{
    MyWnd *myWnd;
    myWnd = (MyWnd *) GetWindowLongPtr(hWnd, GWLP_USERDATA); /* to use it outside WM_CREATE */
    switch (message)
    {
    case WM_CREATE:
        CREATESTRUCT * pcs = (CREATESTRUCT*)lParam;
        MyWnd* myWnd= (MyWnd*) pcs->lpCreateParams;
        SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR) myWnd);
        myWnd->OnCreate(new EventArgs(hWnd, message, wParam, lParam));
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}