在網上看到這篇文章還不錯,OnDrawItem與DrawItem討論

來源:互聯網
上載者:User

我在學習中經常遇到要重寫DrawItem()的情況,但又有一個WM_DRAWITEM訊息,它們是什麼樣的關係呢。

如果我們要重寫一個CButton取名為CMyButton,我們可以重寫CMyButton的DrawItem()函數來實現我們的

需求,但CMyButton::DrawItem()是在什麼時候調用呢?它是在它的宿主類的OnDrawItem()中被調用,

OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )正是對WM_DRAWiTEM的相應函數。

宿主類可以根據nIDCtl來判定是哪個子控制項。其實我們可以在OnDrawItem函數裡對子控制項進行繪製,但是有很多

的子控制項看起來不好,所以我們應該在子類的DrawItem對子類繪製,例如CMyButton::DrawItem。所以可以

這樣理解,OnDrawItem是畫視窗中的子控制項的,因為它的入口參數LPDRAWITEMSTRUCT帶入不同子控制項的相

關參數,而且,你得把字控制項設定成“自畫”類型,才會調用到OnDrawItem。

    當自繪按鈕(owner-draw button),下拉式清單方塊(combo box),列表框(list box)視覺屬性,或者菜單發生變化時,

架構為他們的owner調用OnDrawItem(發送WM_DRAWITEM),在宿主類調用子類的DrawItem(發送WM_DRAWITEM訊息)。

我們可以重載子類的DrawItem可以繪製自己需要的控制項,不是所有設定成自畫類型的控制項都會調用父視窗的OnDrawItem,

例如ListBox的自畫,你就必須重載CListBox的DrawItem方法和MeasureItem方法才可以,但象菜單,按鈕等的自畫則會調用

OnDrawItem。在SDK中,子類是不可能受到WM_DRAWITEM,在MFC中可以,這是類的設計者設計的(反射),這的確不錯。

    在學習中還有一個訊息也是由宿主類被調用的,它就是WM_CTRCOLOR。這個訊息是在子控制項將要繪畫時,向宿主

類發送,宿主類利用發射機制讓子類自己又一個處理的機會。OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor)

pDC,pWnd都是於子類相關的,在這裡可以設定,前景顏色,背景顏色,畫刷類型,字型等等,但不能改變元素的介面架構,

這是DrawItem 所能乾的。

   如果同時有DrawItem(子類),OnDrawItem(宿主類),OnCtlColor(宿主類),它們的調用順序是:

OnCtlColor,OnDrawItem,DrawItem。

    如果我們同時又相應的子類的WM_PAINT訊息,這也許OnPaint在內部進行了一些處理,判斷是否自繪來決定是否向宿主類

發送WM_DRAWITEM,所以如果響應了WM_PAINT子類就不會向宿主類發送WM_DRAWITEM訊息,你要完成子類的全部繪

制工作,如果子類是一個列表框,就很麻煩。這時調用順序是OnCtlColor,OnPaint。

  在發送一個WM_PAINT訊息前,總會先發送一個WM_ERASEBACK訊息,我們在這裡在一個背景圖片。

 

   對於我們平時對控制項的繪製,上面介紹的差不多了,還有一個CView的問題,也就是OnPaint和Ondraw的關係,

其實這個很簡單,CView::OnPaint()的源碼如下:

  

[cpp] view plaincopy
  1. void CView::OnPaint()  
  2. {  
  3.      CPaintDC dc(this);        
  4.      OnPrepareDC(&dc);        
  5.      OnDraw(&dc)  
  6. }  

從代碼中可以清楚的看出他們的關係。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.