1、定义一个 成员WNDPROC m_lpfnOldProc;
static LRESULT CALLBACK SCWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
2、初始化走一次更改窗体过程
m_lpfnOldProc = (WNDPROC)SetWindowLong(m_Header.GetSafeHwnd(), GWL_WNDPROC, (long)SCWndProc);
3、可以用属性表存一下
(存窗体过程)
SetProp(m_Header.GetSafeHwnd(),(_T("oldWndProListCtrl")),lpfnOldProc);
(存的是本类的类指针)
SetProp(m_Header.GetSafeHwnd(),(_T("oldWndProListCtrl")),this);
4、在cpp函数体
LRESULT CALLBACK CListCtrlWH::SCWndProc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam)
{
CListCtrlWH *pList = (CListCtrlWH *)GetProp(hWnd,_T("oldWndProListCtrl"));
switch (wMsg)
{
case HDM_LAYOUT://拖动完了 刷新
{
if (pList->m_hWnd)
{
pList->Invalidate();
}
}
break;
case HDM_ORDERTOINDEX:
{
if (pList->m_hWnd)
{
pList->Invalidate();
}
}
}
return CallWindowProc (pList->m_lpfnOldProc, hWnd, wMsg, wParam, lParam);
}
5、OnDestroy的时候吧原来的窗体过程设回去,删除属性表
void CListCtrlWH::OnDestroy()
{
int nCount = CListCtrl::GetItemCount();
for (int i = 0;i<nCount;i++)
{
SetWindowLong(m_Header.GetSafeHwnd(),GWL_WNDPROC,(DWORD)m_lpfnOldProc);
::RemoveProp(m_Header.GetSafeHwnd(), _T("oldWndProListCtrl"));
CBaseWnd<CListCtrl>::OnDestroy();
// TODO: 在此处添加消息处理程序代码
}