控件的自绘

  MFC自绘控件有很多函数,常见的有父窗口的OnDrawItem函数(WM_DRAWITEM消息对应函数),子控件的DrawItem虚函数,还有一个NM_CUSTOMDRAW反射消息,NM_CUSTOMDRAW是通过WM_NOTIFY发送给父窗口的。我们可以在控件类里面反射调用此消息,使用NM_CUSTOMDRAW反射消息自绘控件的具体方法请见转载出处1。

  OnDrawItem函数:子控件具有Owner Draw属性且控件需重画时,父窗口会调用该函数当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数,函数的入口参数nIDCtl,lpDrawItemStruct带入不同子控件的相关属性参数。

  DrawItem:虚函数:如果使用DrawItem来自画控件,同样需要子控件具有Owner Draw属性DrawItem实际上是在它的宿主类(父窗口)的OnDrawItem函数中被调用的。可以这样理解:OnDrawItem是画窗口中的子控件的,其参数带入不同子控件的相关参数。需要注意的有两点:1是你得把子控件设置成“自”属性,才会调用到OnDrawItem;2是DrawItem返回前,一定要恢复lpDrawItemStruct->pDC中原有对象,如果改变了的话。当自绘子控件时,框架为它们的owner调用OnDrawItem(发送WM_DRAWITEM消息),然后在宿主类中调用子类(子控件)的DrawItem(向子控件发送WM_DRAWITEM,在Win32 SDK中,子类是不能收到WM_DRAWITEM的,这是MFC特有的”消息反射机制“)。

  需要注意的是,不是所有设置成”自画“属性的控件都会调用父窗口的OnDrawItem,例如ListBox的自画,你就必须重载CListBox的DrawItem方法和MeasureItem方法才可以,但像按钮、菜单等的自画则会调用OnDrawItem。 

  同WM_DRAWITEM类似,在学习中还有一个消息也是由宿主类被调用的它就是WM_CTLCOLOR。这个消息是在子控件将要绘制时,向宿主类发送,对应函数为OnCtlColor。宿主类利用”消息反射机制“(向子控件发送=WM_CTLCOLOR),让子类有一个自己处理绘制的机会,=WM_CTLCOLOR对应的函数为CtlColorOnCtlColor的参数同样带入不同子控件的相关参数故同样可以在OnCtlColor或CtlColor中设置控件的前景颜色、背景颜色、画刷类型、字体等,但不能改变元素的界面框架,这是OnDrawItem或DrawItem所能干的。

  如果同时有DrawItem(子类),OnDrawItem(宿主类),CtlColor(子类),OnCtlColor (宿主类),则它们的调用顺序是:OnCtlColor>CtlColor—>OnDrawItem—>DrawItem

  如果又同时添加了子类的WM_PAINT消息响应,这时就不会向宿主类发送WM_DRAWITEM消息了,这时就需要在子类的OnPaint中完成子控件的全部绘制工作,如果子控件是一个List列表的话,这样就很麻烦。

  还有就是在发送一个WM_PAINT消息前,总会先发送一个WM_ERASEBACK消息,我们可以在这里添加一个背景图片。

转载出处1:http://www.verydemo.com/demo_c173_i74185.html

转载出处2:http://blog.csdn.net/liulina603/article/details/7645143

转载出处3:http://www.docin.com/p-232470873.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值