2015-11-01 2 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; 
} 

И Defination:

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

Трудно себе представить, как это могло бы пошло так неправильно. Метод WndProc() является методом экземпляра класса Control. Не пытайтесь переписать Winforms на родном C++, нет смысла. –

ответ

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

, как вы можете видеть, нет системы имен.

Во-вторых, где определены ваши клады? Я подозреваю, что вы должны переопределить свой метод, используя Managed C++, см. MSDN.

0

Вы не так далеко, как вы уже обрабатываете сообщение WM_CREATE.

Фокус в том, чтобы передать указатель объекта во время создания и сохранить его в самом окне с SetWindowLongPtr в сообщении WM_CREATE или WM_NCCREATE. Вы можете извлечь его с помощью 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; 
} 
Смежные вопросы