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 建立控制項的時候新增...