2015-11-01 81 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; 
} 
相關問題