更改窗体过程

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: 在此处添加消息处理程序代码
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值