CListCtrl行高的修改

2021-04-21 09:50:52 字數 1740 閱讀 6146

網上修改clistctrl項高度的方法一般是擴大字型,及用將項高度撐大.

這兩種方法雖然簡單,但是效果卻不是很理想.一種比較理想的方法是自畫clistctrl,不過方法相對來說比較複雜.

要修改clistctrl的列表項高度,我們需要自己新增 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行高的修改

網上修改clistctrl項高度的方法一般是擴大字型,及用將項高度撐大.這兩種方法雖然簡單,但是效果卻不是很理想.一種比較理想的方法是自畫clistctrl,不過方法相對來說比較複雜.要修改clistctrl的列表項高度,我們需要自己新增 measureitem 的訊息響應函式,對應的訊息是 wm ...

美化CListCtrl中顯示的焦點行

經常使用clistctrl來顯示大量的資料,但是總感覺焦點行的背景顏色為藍色,顯示的效果挺難看的,參考 mfc技術內幕 這本書中的例子,自己修改了clistctrl的onpaint 把焦點行改為白色的背景,加了乙個矩形的邊框,下面實際的效果,自我感覺還不錯 實現思路 1 首先呼叫default,讓c...

美化CListCtrl中顯示的焦點行

經常使用 clistctrl 來顯示大量的資料 但是總感覺焦點行的背景顏色為藍色,顯示的效果挺難看的,參考 mfc技術內幕 這本書中的例子,自己修改了 clistctrl 的onpaint 把焦點行改為白色的背景,加了乙個矩形的邊框,下面實際的效果,自我感覺還不錯 實現思路 1 首先呼叫 defau...