withdraw与draw,
我在学习中经常遇到重写DrawItem()的情况,但是还有另外一个WM_DRAWITEM消息。他们之间是什么关系?如果我们要重写一个名为CMyButton的CButton,可以重写CMyButton的DrawItem()函数来实现我们的
需求,但是CMYButton: DrawItem()什么时候调用?它在宿主类的OnDrawItem()中被调用,
Ondrawitem (int nidctl,lpdrawitemstruct lpdrawitemstruct)是WM_DRAWiTEM的对应函数。
宿主可以根据nIDCtl确定它是哪个子控件。实际上,我们可以在OnDrawItem函数中绘制子控件,但是还有很多。
的子控件不好看,要把子类画在它的DrawItem里,比如CMYButton: DrawItem。所以是的。
这样,OnDrawItem在窗口中绘制子控件,因为它的入口参数LPDRAWITEMSTRUCT引入了不同子控件的相位。
参数,并且在调用OnDrawItem之前必须将word control设置为“自绘”类型。
当所有者描述按钮、组合框、列表框或菜单的可视属性改变时,
框架为其所有者调用OnDrawItem (send WM_DrawItem),并调用host类中的DRAWITEM子类(send WM_DRAWITEM message)。
我们可以重载子类的DrawItem来绘制我们需要的控件,并不是所有设置为自绘类型的控件都会调用父窗口的OnDrawItem。
比如ListBox的自绘,必须重载CListBox的DrawItem方法和MeasureItem方法,但是像菜单、按钮等的自绘。会被称为。
OnDrawItem .在SDK中,子类是受不了WM_DRAWITEM影响的,但是在MFC中,是由类的设计者来设计(体现)的,真的很好。
学习中还有一个host类调用的消息,是WM_CTRCOLOR。当子控件将要绘制时,此消息被发送到宿主。
类时,宿主类使用启动机制给子类另一个处理自己的机会。OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
PDC,pWnd PWND和子类有关。在这里,您可以设置前景色、背景色、画笔类型、字体等。但是不能改变元素的界面框架。
这就是DrawItem能做到的。
如果同时存在DrawItem(子类)、OnDrawItem(宿主类)和OnCtlColor(宿主类),它们的调用顺序是:
OnCtlColor,OnDrawItem,DrawItem .
如果我们同时有对应子类的WM_PAINT消息,也许OnPaint已经做了一些内部处理,决定是否自己画,决定是否发送给host类。
发送WM_DRAWITEM,所以如果你响应WM_PAINT子类,就不会向host类发送WM_DRAWITEM消息,你要完成子类的所有绘制。
工作,如果子类是列表框,就很麻烦了。此时调用序列为OnCtlColor,OnPaint。
在发送WM_PAINT消息之前,请始终发送WM_ERASEBACK消息。这是一张背景照片。
对于我们通常绘制的控件来说,上面的描述已经差不多完成了。还有一个CView的问题,就是OnPaint和Ondraw的关系。
其实这个很简单。cview: onpaint()的源代码如下:
[CPP]view plaincopyvoidCView:OnPaint(){ CPaintDCdc(this);OnPrepareDC(DC);OnDraw( dc)}
从代码中可以清楚地看出它们的关系。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。