clistCtrl 自繪 設定行高 行寬

2021-06-06 03:35:14 字數 1763 閱讀 8032

網上修改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 ...