从WndProc调用非静态成员

时间:2015-11-01 09:20:12

标签: c++ static member non-static

任何人都知道如何从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);
...
};

2 个答案:

答案 0 :(得分:0)

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

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

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

如你所见,不是静态方法,LRESULT,HWND等,或

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

如您所见,没有System名称空间。

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

答案 1 :(得分:0)

你没有那么远,因为你已经处理了WM_CREATE消息。

诀窍是在创建时传递一个对象指针,并在WM_CREATE或WM_NCCREATE消息中使用SetWindowLongPtr将其存储在Window本身中。您可以使用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;
}