我已经问了一个与此相关的问题,但我认为我需要改写它
attaching WNDPROC function from child class
我有一个名为BaseWindow的基类,它将每个派生类的窗口过程委托给它的成员函数。
它使用WM_NCCREATE和lpParams结构来实现这一目标。
如果我有自己的窗口类并且我注册它,它按预期工作。但是,如果我将系统类子类化,然后尝试使用SetWindowLong()将其设置为委托函数,则它不起作用。
CreateWindowEx()已经在系统类的WNDPROC函数上触发WM_NCCREATE,然后才能更改它。如何在不使用此消息的情况下创建基类?(因为我有一些具有相同属性的列表框,并且正在考虑为所有列表框创建一个通用的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();