WM DRAWITEM與DrawItem 的討論

2021-06-20 01:43:17 字數 1612 閱讀 3122

我在學習中經常遇到要重寫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

void cview::onpaint()  

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

Draw與String之間轉換的正確姿勢

將draw轉成string,網上有很多類似的 如下的,但多次互轉的話,draw壓縮很厲害 從一張高畫質圖,到毛玻璃,再到馬賽克,最後消失。基於此,所以寫下此部落格。網上類似的 public drawable bytetodrawable string icon return null public ...

as3中bitmapData中draw方法重新理解

flash.display.bitmapdata.draw source ibitmapdrawable,matrix matrix null,colortransform colortransform null,blendmode string null,cliprect rectangle nu...

draw9patch超詳細教程

1.背景自適應且不失真問題的存在 製作自適應背景是ui開發的乙個廣泛問題,也是介面設計師渴望解決的問題,我相信我們彼此都深有體會。比如,列表的背景圖一定,但是列表的高度隨著列表資料項會發生變化 標題欄的背景,無論橫屏還是豎屏,高解析度還是低解析度,都能自動填充滿,而且不失真等等背景問題。根據以往的經...