在网上看到这篇文章还不错,OnDrawItem与DrawItem讨论

我在学习中经常遇到要重写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. }  

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

时间: 2024-07-31 03:49:59

在网上看到这篇文章还不错,OnDrawItem与DrawItem讨论的相关文章

关于python解释器的几篇文章,非常不错

关于python解释器的几篇文章,非常不错 原文地址: http://akaptur.github.io/blog/categories/python-internals/ http://akaptur.github.io/blog/2013/11/15/introduction-to-the-python-interpreter/http://akaptur.github.io/blog/2013/11/15/introduction-to-the-python-interpreter-2/h

这篇文章很不错,推荐大伙儿都看看

Tips and Tricks Contents Flicker free drawing in controls Embedding bitmaps in your manifest Creating type safe collections the quick way Flicker free drawing in controls You have just spent several days writing a beautiful looking custom control but

网上有篇文章谈了让李明远睡不好觉的3件事

网上有篇文章谈了让李明远睡不好觉的3件事:人才和选择,时间管理,权衡百度业务的加减法.其中,李明远透露了不少百度的移动互联网思路和布局,从搜索.地图.O2O谈到互联网金融,对外界关心的百度收购91是否值得,也做出了回应: 我们的股价从收购之后也上涨了很多.今天看依然是值得的,百度和91是互补的,因为我们做技术和系统比较强,91做商业和运营比较强比较灵活,他们离开发者更近.我觉得收购以后两边要花大力气去整合,在这方面百度等互联网公司都在摸索. 那么百度和91无线分别都进行了哪些摸索,现阶段摸索出来

如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧(下)

上一篇文章发出来之后,为了掐死我,大家真是很下工夫啊,有拿给姐姐看的,有拿给妹妹看的,还有拿给女朋友看的,就是为了听到一句"完全看不懂啊".幸亏我留了个心眼,不然就真的像标题配图那样了.我的文章题目是,如果看了这篇文章你"还"不懂就过来掐死我,潜台词就是在你学了,但是没学明白的情况下看了还是不懂,才过来掐死我. 另外,想跟很多人抱歉,因为评论太多了,时间有限,不能给每个人回复,还望大家谅解.但是很感谢一直在评论区帮忙解答读者问题的各位,就不一一@了. 这里郑重感谢大

我看过的关于职业规划最好最全面的一篇文章

转自:点击打开链接 在担任公司高管的几年间,我面试过数以百计的各个层面的员工,其中最让我感到遗憾的一个现象就是很多人有着非常好的素质,甚至有的还是名校的毕业生,因为不懂得去规划自己的职业,在工作多年后,依然拿着微薄的薪水,为了一份好一点的工作而奔波.很多这样的人,他们只要稍微修正一下自己的职业方向,就能够在职业发展上走得更从容.  有一次一个大连理工大学的研究生,好像是学电子的,来应聘我们的公关企划部部长.那小伙长得不错,将近一米八的身高,很阳光,个人素质也很好.他研究生毕业后去了一家稍微有点规

一篇文章,掌握所有开源数据库的现状

  数据库作为业务的核心,在整个基础软件栈中是非常重要的一环.近几年社区也是新的方案和思想层出不穷,接下来我将总结一下近几年一些主流的开源数据库方案,其背后的设计思想以及适用场景.本人才疏学浅如有遗漏或者错误请见谅.本次分享聚焦于数据库既结构化数据存储 OLTP 及 NoSQL 领域,不会涉及 OLAP.对象存储.分布式文件系统. 1 开源RDBMS与互联网的崛起 很长时间以来,关系型数据库一直是大公司的专利,市场被 Oracle / DB2 等企业数据库牢牢把持.但是随着互联网的崛起.开源社区

有关web设计趋势的两篇文章

第一篇原文来自:http://www.ontoinfo.com/2006/09/13/current-trends-in-web-design/ 作者将现在的优秀设计总结为8种风格,建议去原文看看作者所截取的图形举例. 1.Web桌面化 www.yahoo.com mail.yahoo.com www.live.com 正方:看起来很爽,值得细细欣赏 反方:花销太大 尽可能地接近于桌面上绚丽的图形,这是最优雅的风格.结果呢,这种风格看起来很棒,但是需要极大的工作量,而且很耗 网络资源.总之,桌面

如何快速搞定一份看起来还不错的PPT?

  纸面功夫30%.素材收集30%.软件制作20%,今天这篇是阿里巴巴的资深交互设计师@Heidixie 在内部分享的干货,重在帮你摆脱工具,直击PPT「沟通传达」的本质. 新年除了做工作规划,还做了一些个人2016年学习和提升计划,其中,"聚焦"又是工作中项目的关键词,也是个人提升这块的关键词. 所谓厚积而薄发,在我理解,反而是之前要做大量的积累(所谓厚积),而之后更多的是垂直向下深挖打透,在这个基础上,才能够薄发一些可给别人以启迪的东西. 那么我的2016,想要聚焦于[可视化]话题

如何用 Caffe 生成对抗样本?这篇文章告诉你一个更高效的算法

Fast Gradient Sign方法 先回顾一下<杂谈CNN:如何通过优化求解输入图像>中通过加噪音生成对抗样本的方法,出自Christian Szegedy的论文<Intriguing properties of neural networks>: 其中n是要求的噪音,是相应的系数,L是x+n属于某个类别的loss,c是某个错误类别的标签.论文中用来得到图像噪声的办法是L-BFGS,这个方法虽然稳定有效,但是很考验算力的,Christian在Google反正机器多又强,用这个