关于控件重绘函数/消息

DrawItem()是在什么时候调用呢?它是在它的宿主类的On DrawItem()中被调用,

OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )正是对WM_DRAWITEM的响应函数。

宿主类OnDrawItem可以根据nIDCtl来判定是哪个子控件。

其实我们可以在OnDrawItem函数里对子控件进行绘制,但是有很多的子控件看起来不好,所以我们应该在子类的DrawItem对子类绘制。

OnDrawItem是画窗口中的子控件的,因为它的入口参数LPDRAWITEMSTRUCT带入不同子控件的相关参数,而且,你得把字控件设置成“自画”类型,才会调用到OnDrawItem。

     在学习中还有一个消息也是由宿主类被调用的,它就是WM_CTRCOLOR。这个消息是在子控件将要绘画时,利用反射机制发送给其宿主类。OnCtlColor(CDC* pDC, CWnd*pWnd, UINT nCtlColor),pDC,pWnd都是于子类相关的,在这里可以设置,前景颜色,背景颜色,画刷类型,字体等等,但不能改变元素的界面框架,这是DrawItem 所能干的。WM_CTLCOLOR消息用来完成对EDIT、STATIC、BUTTON等控件设置背景和字体颜色

如果同时有DrawItem(子类),OnDrawItem(宿主类),OnCtlColor(宿主类),它们的调用顺序是: OnCtlColor-》OnDrawItem-》DrawItem。

 

如果我们同时又响应的子类的WM_PAINT消息,子类不会向宿主类发送WM_DRAWITEM消息,你要完成子类的

全部绘制工作,如果子类是一个列表框很麻烦。这事调用顺序是OnCtlColor,OnPaint

OnPaint和Ondraw的关系, CView::OnPaint()的源码如下:

  1. void CView::OnPaint() 
  2.      CPaintDC dc(this);       
  3.      OnPrepareDC(&dc);       
  4.      OnDraw(&dc) 

void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc) }

从代码中可以清楚的看出他们的关系

OnPaint()CWnd的类成员,同时负责响应WM_PAINT消息

1.OnPaint: WM_PAINT
 
消息函数,接受到WM_PAINT消息时,首先调用的是onpaint()onpaint()再调用ondraw()

OnPaint()-àOnDraw();

2.OnDraw:虚函数,需要重载

3.OnDrawItem:WM_DRAWITEM

子控件有自画属性且控件需重画时,父窗口会调用该函数

 在具有Owner Draw属性的控件需要重画的时候,就会激发OnDrawItem

当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数

OnDrawItem()-àDrawItem();

4.DrawItem:虚函数,需要重载

  如果使用DrawItem来自画控件,需要给控件加上自画样式,然后重载该控件类的自画函数(DrawItem)函数,如果该控件的父窗口提供了ON_WM_DRAWITEM消息映射宏,并重载了OnDrawItem函数,则重画消息会由父窗口处理,父窗口调用基类的OnDrawItem来调用派生的子控件的DrawItem函数

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值