最近在学习《WTL for MFC Programmer》系列文章的一些小结和感受
相同点:
1.都是通知消息,都可以被反射回控件类自行处理。
2.都和自定义控件的绘画有关。
区别:
MSDN对WM_DRAWITEM描述:
The WM_DRAWITEM message is sent to the parent window of an owner-drawn button, combo box, list box, or menu when a visual aspect of the button, combo box, list box, or menu has changed.
MSDN对NM_CUSTOMDRAW的描述:
Sent by some common controls to notify their parent windows about drawing operations. This notification is sent in the form of a WM_NOTIFY message.
1.可以看出,前者是对Owner-Draw风格的按钮,复选框,列表框和菜单有效的,树形控件并没在此列。所以在系列文章的第五篇中,自定义按钮是继承了COwnerDraw,树形控件是继承了CCustomDraw,MSDN中也列出了一些NM_CUSTOMDRAW有关的控件:
List view
NMLVCUSTOMDRAW
ToolTip
NMTTCUSTOMDRAW
Tree view
NMTVCUSTOMDRAW
Toolbar
NMTBCUSTOMDRAW
All other supported controls
NMCUSTOMDRAW
2.前者若想进行一些gdi动作,那基本上就是整个区域需要绘画,gdi的一些操作比较多,后者使用更简单,一些属性(比如字体颜色)只需要设置一些变量即可。
3.前者是一个独立的消息,后者是被包含在WM_NOTIFY消息中被发送的。
4.NM_CUSTOMDRAW分好多个阶段,可以通过重载某些方法来改变行为,这些方法包括OnPrePaint, OnItemPrePaint等等(细节只能看wtl源代码了,MSDN中也稍有介绍)。
猜测:他们应用在不同的控件上,但是NM_CUSTOMDRAW貌似是WM_DRAWITEM的加强版,呵呵
欢迎大家多多批评指教~
以下是在MSDN上找到的一些解释,链接是相关的一篇文章地址
控制控件绘制的另一种方法是利用所有者绘制。事实上,您也许听开发人员提到过所有者 绘制控件,因为它是用于开发自定义控件最普通的技术。该技术普遍使用的主要原因在于,Windows 可为您提供很多帮助。在呈现控件的那一刻,Windows 就已经创建并填写了设备上下文,决定了控件的大小和位置,并且向您传递信息以使您了解此刻绘制的需求。对于列表控件(例如,列表框和列表视图), Windows 将为列表中的每一项调用绘制代码,这意味着您只需绘制这些项,而无需考虑控件的其他方面。注意,所有者绘制可用于大多数控件。然而,它不能用于编辑控件; 并且考虑到列表控件,它只能用于报表视图样式。
对于绘制自己的控件而言,这可能是最少 为人所知的技术。事实上,许多技术能力较高的开发人员也混淆了术语所有者绘制 (owner-draw) 和自定义绘制 (custom-draw)。关于自定义控件,首先需要了解,它仅针对于指定的公共控件:标头、列表视图、rebar、工具栏、工具提示、跟踪条和树视 图。此外,尽管所有者绘制只允许绘制报告视图风格的列表视图控件,而自定义绘制则使您能够处理列表视图控件所有视图风格的绘制。使用自定义绘制的另一个明 显优势是,您可以对希望绘制的内容进行严格挑选。实现方式是,在控件绘制的每个阶段由 Windows 向代码发送一个消息。这样,您可以决定在每个阶段是自己进行所有的绘制工作,增加默认的绘制,还是允许 Windows 为该阶段执行所有的绘制。(鉴于自定义绘制是本文的一个主题,因此您很快会看到它的工作方式。)
文章地址: http://msdn2.microsoft.com/zh-cn/library/ms364048(VS.80).aspx