У меня проблема с присоединением оконной процедуры к окну.
У меня есть базовый класс с именем BaseWindow
, который использует GWPL_USERDATA
для вызова виртуальной функции с именем HandleMessage()
дочерних классов.
Однако, если я пытаюсь изменить оконную процедуру, не создавая пользовательский класс окна, он возвращает ошибку типа из дочерней процедуры в long.
Вот код:
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BaseWindow *pThis = NULL;
if (uMsg == WM_NCCREATE)
{
CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;
pThis = (BaseWindow*)pCreate->lpCreateParams;
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
pThis->m_hwnd = hwnd;
}
else
{
pThis = (BaseWindow*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
}
if (pThis)
{
return pThis->HandleMessage(uMsg, wParam, lParam);
}
else
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{return 0;};
PlayList Class : BaseWindow
SetWindowLong(m_hwnd, GWL_WNDPROC,(long) HandleMessage); //Error
LRESULT PlayList::HandleMessage(UINT message,WPARAM wParam,LPARAM lParam) //Need to attach this window procedure
{}
Это работает, если дочерняя процедура является статической, однако я использую нестатические члены в этой процедуре.
Я хочу создать подкласс общего элемента управления при использовании этого базового класса (поскольку большой объем кода избыточен) это возможно?
Вот весь код для базового класса: http://pastebin.com/ME8ks7XK