1. 程式人生 > >ListCtrl 鎖定列寬度的簡單方法

ListCtrl 鎖定列寬度的簡單方法

有時候需要鎖定report 格式下的listctrl的列寬度。為此要響應HDN_BEGINTRACK及WM_SETCURSOR等訊息,比較麻煩。

下面的方法簡單明瞭:

1.定義新的HeadCtrl視窗過程:

/////////////////////////////////////////////////////////////////////////////
#ifdef HEAD_FIX_COL
WNDPROC OldHeadProc;
LRESULT CALLBACK NewHeadProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 HDHITTESTINFO hti;
 switch(uMsg)
 {
 case WM_SETCURSOR:
  return 0;
 case WM_LBUTTONDOWN:
 // do hit test
  hti.pt.x=LOWORD(lParam);
  hti.pt.y=HIWORD(lParam);
  SendMessage(hWnd,HDM_HITTEST,0,(LPARAM) &hti);
  if((hti.flags & HHT_ONDIVIDER) || (hti.flags & HHT_ONDIVOPEN))
  {
   return 0;
  }
  break;
 }
 return CallWindowProc((WNDPROC)GetProp(hWnd,"MyHeadProc"),hWnd, uMsg, wParam, lParam);
}
#endif
2. 子類化HeadCtrl:

BOOL CListCheckDlg::OnInitDialog()
{

//初始化m_List. (CListCtrl)後:

//...
#ifdef HEAD_FIX_COL
 CHeaderCtrl *pHead=m_List.GetHeaderCtrl();
 OldHeadProc=(WNDPROC) SetWindowLong(pHead->m_hWnd, GWL_WNDPROC, (LONG)NewHeadProc);
 SetProp(pHead->m_hWnd,"MyHeadProc",(HANDLE)OldHeadProc);
#endif
//...