2015-11-01 98 views
-1

任何人都知道如何从WndProc调用非静态成员?从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); 
... 
}; 
+1

很难想象这可能已经错了。 WndProc()方法是Control类的一个实例方法。不要试图用原生C++重写Winforms,没有意义。 –

回答

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 
); 

,你可以看到,没有系统命名空间。

其次,你的分类在哪里定义?我怀疑你应该使用托管C++重写你的方法,请参阅MSDN

0

你还没有处理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; 
} 
相关问题