MFC自繪控制項

2021-09-29 19:16:09 字數 1340 閱讀 8010

1.c++中drawitem()函式不被呼叫的問題

自繪乙個cmybutton的時候,在drawitem()中改變了button的顏色,但是在程式執行時,drawitem()函式並沒有被執行,原因在於按鈕的型別並不是bs_ownerdraw,所以我們需要把它改為「所有者繪製」。

解決方法:

可以過載乙個presubclasswindow()函式,在該函式中呼叫modifystyle()函式來設定型別,比如:

void cmybutton::presubclasswindow()

也就是說:這裡和設定控制項屬性的「owner draw」屬性為true應該是乙個意思!!

得把字控制項設定成「自畫」型別,才會呼叫到ondrawitem。

*********************************************= 2.

可以重寫cmybutton的drawitem()函式來實現我們的需求,但cmybutton::drawitem()是在什麼時候呼叫呢?它是在它的宿主類的ondrawitem()中被呼叫,ondrawitem

(int nidctl, lpdrawitemstruct lpdrawitemstruct )正是

對wm_drawitem

訊息的響應

函式。

宿主類可以根據nidctl來判定是哪個子控制項。其實我們可以在ondrawitem函式裡對子控制項進行繪製,但是有很多的子控制項看起來不好,所以我們應該在子類的drawitem對子類繪製,例如cmybutton::drawitem。

*********************************************= 3.

onpaint和ondraw

onpaint()是cwnd類的成員,負責響應wm_paint訊息。

ondraw()是cview類的成員,它不響應訊息,不過它通過onpaint()來呼叫ondraw()。ondraw()是虛函式,需要被過載。

ondrawitem和drawitem

ondrawitem()是cwnd類的成員,負責響應wm_drawitem訊息。當子控制項有自繪屬性並且需要重繪它時,父視窗就呼叫ondrawitem()。

drawitem()是虛函式,需要在子控制項類過載它。它是通過父視窗呼叫ondrawitem()函式來呼叫子控制項的drawitem()。

onpaint和ondrawitem

onpaint()和ondrawitem()的範疇不同,onpaint()可以畫整個視窗,而ondrawitem()只能畫視窗中的子控制項。

MFC之自繪控制項

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

MFC之自繪控制項

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

MFC控制項的自繪

常見的控制項自繪的方法有父視窗的ondrawitem 函式 子控制項的drawitem 函式 子控制項的ctlcolor 函式 子控制項的onpaint 函式,子控制項的onnmcustomdraw 函式等。自繪控制項的話需要控制項具有owner draw屬性,通過create 建立控制項的時候新增...