1. 程式人生 > >自繪MFC List Control列表控制元件時無法改變表頭CHeaderCtrl高度問題的解決方法

自繪MFC List Control列表控制元件時無法改變表頭CHeaderCtrl高度問題的解決方法

最近在Win7 64位系統下用VS2013編寫公司的影象引擎程式時需要使用到list control控制元件,發現MFC自帶的list control視覺效果較差,如下所示:

於是決定自繪。從百度搜到相關自繪程式碼,下載到本地修改測試後發現,表頭CHeaderCtrl控制元件在程式啟動時是按預設高度呈現的,只有在滑鼠滾動列表後,才會變成OnLayout()函式中設定的高度。經檢查,發現OnLayout()函式只有在滑鼠滾動列表時才會被觸發。

下圖是按預設高度顯示的效果,可以看到,表頭略顯矮挫,氣場不足,故有必要找到可以為自繪表頭增高的方法。


在百度和谷歌搜尋了很多相關資料,但效果都不理想。

最後,祭出祖傳逆向大法,找到解決方案,本地親測有效。具體的做法是在程式啟動時,譬如在OnInitDialog()函式中,建立一個子執行緒,在子執行緒中新增以下程式碼:

DWORD WINAPI CMyDlg::MyThread(LPVOID lParam)
    CMyDlg   *dlg = (CMyDlg *)lParam;

    // 修改列表框表頭高度
    Sleep(70);
    dlg->m_listctrl_test->SendMessageW(WM_VSCROLL, 4, 0);
    Sleep(20);
    dlg->m_listctrl_test->SendMessageW(WM_VSCROLL, 4, 0);
    Sleep(20);
    dlg->m_listctrl_test->SendMessageW(WM_VSCROLL, 8, 0);
    dlg->m_listctrl_test->Invalidate();

    return 0;
}

(如有span亂碼請無視)

其中,CMyDlg是對話方塊類,MyThread()是CMyDlg的一個靜態函式,m_listctrl_test是自繪列表控制元件類的一個例項。執行上述程式碼的效果相當於向列表控制元件傳送滑鼠滾動的訊息。通過這樣的操作,程式啟動時就可以自動觸發OnLayout()函式,使List Control獲取到我們設定的表頭高度。

程式效果如下:


其中,左圖是按預設高度顯示的效果;右圖是程式自動觸發OnLayout()函式後的效果,可以明顯地看到表頭比左邊的高,實現了我們想要的效果。