按鈕的派生,控制項自繪,記幾點

2021-08-28 15:51:56 字數 1019 閱讀 3042

cbutton::presubclasswindow()

cbutton::drawitem()

這兩個成員函式可以在cbutton類中過載,過載後,首先執行presubclasswindow(),然後才執行drawitem();

presubclasswindow是乙個很好的定製控制項的位置。如果我們通過過載cwnd::precreatewindow定製控制項,而使用者在對話方塊中使用控制項。由於對話方塊中的控制項視窗是通過createdlgindirect建立,不經過cwnd::createex函式,precreatewindow函式不會被呼叫。

其實,使用者要在對話方塊中使用定製控制項,必須用ddx或者subclassdlgitem函式子類化控制項,這時presubclasswindow一定會被呼叫。

如果使用者直接建立定製控制項視窗,cwnd::createex函式就一定會被呼叫,控制項視窗一定會被子類化以安裝mfc訊息幫浦。所以在mfc中,presubclasswindow是建立視窗的必經之路。

***********************************

而對於對話方塊等,視窗是通過subclass方式交給使用者的

系統讀入對話方塊模板,建立其中各個子視窗

然後將各子視窗的 訊息處理函式替換成 對應的c++物件 的訊息處理函式 (subclass:子類化,或"接管") ,然後,這個子視窗就會按類中定義的方式來動作了。

在此過程中,呼叫的是cwnd:subclasswindow( hwnd hwnd );

●在此流程中,mfc提供乙個機會"presubclasswindow" 供使用者在關聯前作點手腳

具體來說,如果你定義乙個視窗(如cbutton派生類cmybutton),然後使用對話方塊資料交換將乙個按鈕與自己的派生類物件關聯,這時候,一些"建立前"的處理就應該寫在"presubclasswindow"中。

如果你用的不是"對話方塊資料關聯",而是在oninitdialg中自己建立m_mybtn.create(...)

這時候,一些"建立前"的處理就應該寫在   "precreatewindow"中。

自繪按鈕控制項的2個注意點

1 宣告自繪屬性 有兩種方式,一種是通過資源檢視修改按鈕的屬性,將owner draw改為true 另一種是通過 實現。在重寫的presubclasswindow中新增一句自繪屬性 void cmybutton presubclasswindow 2 繪製按鈕 通過過載虛函式drawitem實現,注...

自繪控制項的方法

1.子類化控制項 2.重寫onpaint 所有控制項都是在onpaint裡畫出來的,我們可以不呼叫父類的onpaint,直接自己畫控制項。3.重寫控制項能響應的各種滑鼠鍵盤事件,通過狀態位在onpaint中畫出不同事件下控制項的樣子,比如滑鼠按下的狀態對應巨集button down,在響應函式中呼叫...

MFC控制項的自繪

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