Я уже задавал вопрос, связанный с этим, однако я думаю, что мне нужно перефразировать его
присоединение функции WNDPROC из дочернего класса
У меня есть базаКласс BaseWindow, который делегирует оконную процедуру каждого производного класса его функции-члену.
Для этого он использует WM_NCCREATE и структуру lpParams.
Если у меня есть свой собственный класс окна, и я регистрируюсьэто работает как положено.Однако если я создаю подкласс системного класса и затем пытаюсь использовать SetWindowLong (), чтобы установить его для функции делегата, он не работает.
CreateWindowEx () уже вызывает WM_NCCREATE в функции WNDPROC системного класса, прежде чем я могу изменитьЭто.Как я могу создать базовый класс, не используя это сообщение? (Потому что у меня есть несколько списков с одинаковыми свойствами и я думал о создании общего класса c ++ для всех списков).
код базового класса-
Base function-
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);
}
}
функция для установки новой функции WNDPROC-
void SetWNDPROC()
{
m_orig_WNDPROC=(WNDPROC) GetWindowLong(m_hwnd, GWL_WNDPROC);
SetWindowLong(m_hwnd,GWL_WNDPROC,(long) WindowProc);
}
для создания окна-
BOOL Create() //Calls CreateWindowEx
функция дочернего класса-
LRESULT PlayList::HandleMessage(UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_SIZE:
{
RECT Client;
GetClientRect(GetParent(m_hwnd),&Client);
MoveWindow(m_hwnd,Client.right-305,20,300,Client.bottom-90,TRUE);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
}
}
return CallWindowProc(m_orig_WNDPROC,m_hwnd,message,wParam,lParam);
}
и дочерний класс называет это так:
BOOL created=Create();
SetWNDPROC();