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の記事の戻り値の意味のリストで、誰かが「これはいつ発生するか....」と説明できますか。