当 NM_CUSTOMDRAW 通知代码通过 WM_NOTIFY 消息发送到控件的父级时,此 WM_NOTIFY 消息的 lParam 参数是 NMCUSTOMDRAW 结构的地址,如下所示:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff919569(v=vs.85).aspx
另一方面,WM_NOTIFY 消息的 lParam 应该是
A pointer to an NMHDR structure that contains the notification code and additional
information. For some notification messages, this parameter points to a larger
structure that has the NMHDR structure as its first member.
在许多代码示例中,对于 WM_NOTIFY 消息的处理程序,我看到
LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
switch (pnm->hdr.code){ ....
但问题是,我们不知道这个 lParam 是一个 NMHDR 结构还是一个 NM_CUSTOMDRAW 结构,我们怎么能正确地转换 lParam?如果 lParam 只是一个 NMHDR,则应该使用 LPNMHDR 和 pnm->code,不是吗?
更糟糕的是,不同的控件使用不同类型的结构:NMLVCUSTOMDRAW、NMTVCUSTOMDRAW、NMLVCUTTOMDRAW 和 NMTBCUSTOMDRAW。那么在 WM_NOTIFY 处理程序开始时正确的做法是什么,区分它是否使用 NM_CUSTOMDRAW,并确定正确的 NMCUSTOMDRAW 结构类型。
当我读到这篇文章
http://msdn.microsoft.com/en-us/library/windows/desktop/ff919569%28v=vs.85%29.aspx
在 MSDN 上,我无法理解某些部分。例如,
CDRF_NOTIFYPOSTPAINT 当整个控件的绘制周期完成时,该控件将发送 NM_CUSTOMDRAW 通知。这发生在 dwDrawStage 等于 CDDS_PREPAINT 时。
当一个控件在整个控件的绘制周期完成时发送一个 NM_CUSTOMDRAW 通知时,这个 NM_CUSTOMDRAW 应该有 dwDrawState 等于 CDDS_PREPOSTPAINT,不是吗?
有人可以在该 MSDN 文章中的返回值含义列表中解释什么“这发生在......”。