MFC自繪控制項與介面美化3 人生幾何 新浪部落格

2021-10-10 11:56:03 字數 2690 閱讀 6644

生成的介面如下: 

圖7 利用wm_ctlcolor訊息美化介面 

3.3.4 wm_drawitem 

onctlcolor只能修改元素的顏色,但不能修改元素的介面框架,wm_drawitem則可以。 

當乙個具有owner draw風格的元素(包括按鈕、組合框、列表框和選單等)需要顯示外觀時,該元素會傳送一條wm_drawitem訊息至它的隸屬視窗(owner)。 

wm_drawitem的對映函式原型如下: 

afx_msg void ondrawitem( int nidctl, lpdrawitemstruct lpdrawitemstruct );

引數: 

nidctl 該控制項的id,如果該元素為選單,則nidctl為0 

lpdrawitemstruct 指向drawitemstruct結構物件的指標,drawitemstruct的結構定義如下: 

[cpp]view plain

copy

typedef

struct

tagdrawitemstruct  

drawitemstruct;  

[cpp]view plain

copy

typedef

struct

tagdrawitemstruct  

drawitemstruct;  

[cpp]view plain

copy

bool

cui6dlg::oninitdialog()  

void

cui6dlg::ondrawitem(

intnidctl, lpdrawitemstruct lpdrawitemstruct)   

return

;  }  

cdialog::ondrawitem(nidctl, lpdrawitemstruct);  

}  

[cpp]view plain

copy

bool

cui6dlg::oninitdialog()  

void

cui6dlg::ondrawitem(

intnidctl, lpdrawitemstruct lpdrawitemstruct)   

return

;  }  

cdialog::ondrawitem(nidctl, lpdrawitemstruct);  

}  

別忘了標記owner draw屬性: 

圖9 指定按鈕的owner draw屬性

值得一提的是,cwnd內部截獲了wm_drawitem、wm_measureitem等訊息,並對映成子元素的相應虛函式的呼叫,如cbutton::drawitem()。所以,以上例子也可以通過派生出乙個cbutton的派生類,並過載該類的drawitem()函式來實現。使用虛函式機制實現介面美化參見3.4章節。 

3.3.5 wm_measureitem

僅僅wm_drawitem還是不夠的,對於一些特殊的控制項,如listbox,系統在傳送wm_drawitem訊息前,還傳送wm_measureitem訊息,需要你設定listbox中每個專案的高度。 

wm_measureitem的對映函式原型如下: 

afx_msg void onmeasureitem( int nidctl, lpmeasureitemstruct lpmeasureitemstruct ); 

nidctl 該控制項的id,如果該元素為選單,則nidctl為0 

lpmeasureitemstruct指向measureitemstruct結構物件的指標,measureitemstruct的結構定義如下: 

[cpp]view plain

copy

typedef

struct

tagmeasureitemstruct  

measureitemstruct;  

[cpp]view plain

copy

typedef

struct

tagmeasureitemstruct  

measureitemstruct;  

[cpp]view plain

copy

void

cui7dlg::onmeasureitem(

intnidctl, lpmeasureitemstruct lpmeasureitemstruct)   

cdialog::onmeasureitem(nidctl, lpmeasureitemstruct);  

}  

[cpp]view plain

copy

void

cui7dlg::onmeasureitem(

intnidctl, lpmeasureitemstruct lpmeasureitemstruct)   

cdialog::onmeasureitem(nidctl, lpmeasureitemstruct);  

}  

同樣別忘了指定列表框的owner draw屬性: 

圖11 指定下拉框的owner draw屬性 

MFC自繪控制項與介面美化4 人生幾何 新浪部落格

3.3.6 nm customdraw 大家也許熟悉wm notify,控制項通過wm notify向父視窗傳送訊息。在wm notify訊息體中,部分控制項會傳送nm customdraw告訴父視窗自己需要繪圖。可以反射nm customdraw訊息,如 on notify reflect nm ...

MFC自繪控制項

1.c 中drawitem 函式不被呼叫的問題 自繪乙個cmybutton的時候,在drawitem 中改變了button的顏色,但是在程式執行時,drawitem 函式並沒有被執行,原因在於按鈕的型別並不是bs ownerdraw,所以我們需要把它改為 所有者繪製 解決方法 可以過載乙個presu...

MFC之自繪控制項

在描繪mfc介面時,mfc自帶的控制項樣式是絕對不滿足介面的需求的。所以我們就要在mfc自帶控制項基礎上對控制項樣式進行重繪。在採用自繪前介面樣式 採用自繪後介面樣式 是不是自繪控制項後看起來正常了很多?自繪控制項的步驟 我們以做乙個關閉按鈕為例 先建立乙個mfc類繼承自cbutton。給這個類新增...