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
//...