因爲咱們對控件的功能、外觀的需求,公共控件並不能很好地知足這一點,因此咱們就得自繪控件。框架
自繪控件有許多方法,好比:處理WM_PAINT消息,設置ownDraw風格,處理WM_CTLCOLOR消息,等。函數
以前見過有網友發表過自定義繪製的方法,但目前我只瞭解前面這幾個方法,往後有機會再補充。spa
處理WM_PAINT消息設計
這個應該是最容易想到的方法。在windowProc()函數中處理WM_PAINT消息,這可能出現一些雜事,好比創設備上下文,決定控件的位置等。這理就不詳細解釋,具體能夠看《window程序設計》。code
設置ownDraw風格
ci
這個方法也就是全部者繪製方法。它是用於開發自定義控件最普通的技術,由於在呈現控件的那一刻,Windows就已經填寫了設備上下文,決定控件大小和位置等,沒必要像處理WM_PAINT消息那樣什麼都要自已過一遍。開發
這個方法是要重載DrawItem()函數,函數注意與OnDrawItem()區分開。當咱們重載DrawItem()函數時,它是在它的宿主類的OnDrawItem()中被調用的。it
咱們能夠在PreSubclassWindow()函數中設置控件的BS_OWNERDRAW屬性,不過這會去掉其它的屬性。程序設計
好比自繪一個CMyButton:class
void CMyButton::PreSubclassWindow() { CButton::PreSubclassWindow(); ModifyStyle(0, BS_OWNERDRAW); }
處理WM_CTLCOLOR消息
這個方法只提供改變控件的顏色,而且不提供控件自己以外的更多功能。
與消息對應的OnCtlColor()函數,其返回值是一個刷子句柄,該刷子將被用於畫出控件的背景。當要畫出一個子控件時,框架就調用這個成員函數。
其類別有以下幾種:
CTLCOLOR_BTN 按鈕控件
CTLCOLOR_DLG 對話框
CTLCOLOR_EDIT 編輯框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滾動條
CTLCOLOR_STATIC 靜態文本