MFC控制項的自繪

2021-09-10 07:22:03 字數 1401 閱讀 5102

**:

常見的控制項自繪的方法有父視窗的ondrawitem()函式、子控制項的drawitem()函式、子控制項的ctlcolor()函式、子控制項的onpaint()函式,子控制項的onnmcustomdraw()函式等。自繪控制項的話需要控制項具有owner draw屬性,通過create()建立控制項的時候新增bs_ownerdraw屬性,或者在資源檢視中右擊控制項->屬性->owner draw設為true。

1、父視窗的ondrawitem()函式、子控制項的drawitem()函式

在mfc中子控制項要繪製的時候框架就會向父視窗傳送wm_drawitem訊息,而父視窗會在wm_drawitem訊息響應函式ondrawitem()裡呼叫子控制項的drawitem()函式,所以我們既可以在父視窗的ondrawitem()函式裡繪製控制項,也可以過載子控制項drawitem()函式,在drawitem()裡自繪控制項。一般都是選擇在子控制項的drawitem()函式裡繪製控制項,這樣可以避免父視窗**臃腫。

不是所有設定成自畫型別的控制項都會呼叫父視窗的ondrawitem,例如listbox的自畫,你就必須過載clistbox的drawitem方法和measureitem方法才可以,但按鈕、選單等的自畫則會呼叫ondrawitem。

2、子控制項的ctlcolor()函式

子控制項開始繪製之前,還會向宿主類傳送wm_ctlcolor訊息,對應的訊息響應函式為onctlcolor,而宿主類收到wm_ctlcolor訊息後會向子控制項傳送=wm_ctlcolor反射訊息,讓子控制項有乙個自己處理繪製的機會(這就是mfc中的訊息反射機制),子控制項中=wm_ctlcolor訊息響應函式為ctlcolor()。我們一般在ctlcolor中對子控制項設定控制項的前景顏色、背景顏色、畫刷型別、字型等但不能改變元素的介面框架,這是drawitem所能幹的。

如果同時有drawitem(子類),ondrawitem(宿主類),ctlcolor(子類),onctlcolor (宿主類),則它們的呼叫順序是:onctlcolor—>ctlcolor—>ondrawitem—>drawitem。

3、子控制項的onnmcustomdraw()函式

一些控制項在繪製的時候會向宿主類傳送nm_customdraw訊息,nm_customdraw是通過wm_notify傳送給父視窗的,父視窗收到後會向子控制項傳送反射訊息=nm_customdraw,子控制項的=nm_customdraw反射訊息相應函式為onnmcustomdraw()。

4、子控制項的onpaint()函式

新增了子控制項的wm_paint訊息響應onpaint,這時就不會向宿主類傳送wm_drawitem訊息了,所以就需要在子類的onpaint中完成子控制項的全部繪製工作。如果子控制項是乙個list列表的話,這樣做就很麻煩,所以不建議在onpaint()中進行控制項的自繪。

還有就是在傳送乙個wm_paint訊息前,總會先傳送乙個wm_eraseback訊息,我們可以在這裡新增乙個背景。

MFC自繪控制項

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

MFC之自繪控制項

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

MFC之自繪控制項

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