網上修改clistctrl項高度的方法一般是擴大字型,及用將項高度撐大.
這兩種方法雖然簡單,但是效果卻不是很理想.一種比較理想的方法是自畫clistctrl,不過方法相對來說比較複雜.
要修改clistctrl的列表項高度,我們首先設定樣式 lvs_ownerdrawfixed ,新增 measureitem 的訊息響應函式,對應的訊息是 wm_measureitem+wm_reflect_base, 而不是 wm_measureitem.在clistbox裡我們可以直接在 classwizard 裡將此訊息響應新增進 class 裡,但是 clistctrl 預設是沒有這個訊息響應的,我們需要手動新增它(注意,這裡不是 wm_measureitem. clistctrl 僅有 wm_measureitem, 對應的函式為 onmeasureitem).
為了響應這個訊息,我們還需要給列表加上 lvs_ownerdrawfixed 風格.可以在 create 列表的時候新增,也可以在 precreatewindow 虛函式中新增.
新增 measureitem 訊息響應函式,首先我們需要在類的標頭檔案中新增:
afx_msg void measureitem(lpmeasureitemstruct lpmeasureitemstruct);
來宣告此訊息響應函式;
然後在cpp的訊息響應巨集中新增:
on_wm_measureitem_reflect()
最後自己建立 measureitem 的函式定義:
/// clistex message handlers
void clistex::measureitem(lpmeasureitemstruct lpmeasureitemstruct)
其中 m_nitemheight 是我在標頭檔案中宣告的乙個成員變數,用於從外部修改列表項高度.
然後我們新增乙個方法,便於從外部直接修改列表項高度:
//設定行高
void setitemheight(uint nheight);
然後是該方法的定義:
//設定行高
void clistex::setitemheight(uint nheight)
這個方法的最後,使用了 sendmessage 傳送 wm_windowposchanged 訊息讓 clistctrl 進入 measureitem 的訊息響應函式,對列表高度進行修改.
因為我們這裡使用了列表的自繪風格,因此列表項需要自己繪製.
首先在類的宣告中新增 drawitem 虛函式宣告:
virtual void drawitem(lpdrawitemstruct lpdrawitemstruct);
然後自畫 clistctrl:
void clistex::drawitem(lpdrawitemstruct lpdrawitemstruct)
{int nitem = lpdrawitemstruct->itemid;
cdc* pdc = cdc::fromhandle(lpdrawitemstruct->hdc);
crect rcbound, rclabel, rcicon;
//獲得列表項圖示,標籤,及項的區域
getitemrect ( nitem, rcicon, lvir_icon );
getitemrect ( nitem, rclabel, lvir_label );
getitemrect ( nitem, rcbound, lvir_bounds );
現在這個 clistctrl 的過載類就支援自定義列表項高度了.
CListCtrl子類自繪GetColumn崩潰
今天自繪clistctrl突然崩潰了,而且十分隨機,隨機的bug只能慢慢找了,改一點東西就測試幾遍,慢慢定位到問題,發現是在getcolumn處崩潰了,看看msdn pcolumn 位址lvcolumn結構,它指定要檢索的資訊並接收有關列的資訊。mask成員指定要檢索的列屬性。如果mask成員指定 ...
CListCtrl行高的修改
網上修改clistctrl項高度的方法一般是擴大字型,及用將項高度撐大.這兩種方法雖然簡單,但是效果卻不是很理想.一種比較理想的方法是自畫clistctrl,不過方法相對來說比較複雜.要修改clistctrl的列表項高度,我們需要自己新增 measureitem 的訊息響應函式,對應的訊息是 wm ...
CListCtrl行高的修改
網上修改clistctrl項高度的方法一般是擴大字型,及用將項高度撐大.這兩種方法雖然簡單,但是效果卻不是很理想.一種比較理想的方法是自畫clistctrl,不過方法相對來說比較複雜.要修改clistctrl的列表項高度,我們需要自己新增 measureitem 的訊息響應函式,對應的訊息是 wm ...