アプリケーションがコントロールを独自に描画することを意味します。基本的な部分については既定の描画が行われることになっています。本当に独自の描画を行いたい部分のみに集中することができます。事前に次節で示す作業を行っておいてください。カスタムドローを行うタイミングは、WM_NOTIFYを通じて送られます。カスタムドロー以外のいくつかの通知もこのメッセージで行われます。WM_NOTIFYが送られた理由を特定するには、LPARAMを通じてNMHDR構造体を確認する必要があります。NMHDR;hwndFromは、通知の対象であるコントロールのウインドウハンドルが格納されます。dFromは、通知の対象であるコントロールのIDが格納されます。codeは、通知コードが格納されます。codeにNM_CUSTOMDRAWが格納されている場合、lParamにはNMCUSTOMDRAW構造体へのアドレスが格納されています。*LPNMCUSTOMDRAW;hdrは、NMHDR構造体が格納されます。このことから、NMCUSTOMDRAW構造体をNMHDR構造体で表すこともできます。dwDrawStageは、描画ステージを表す定数が格納されます。hdcは、コントロールのデバイスコンテキストのハンドルが格納されます。このデバイスコンテキストのハンドルを通じて描画を行うことになります。rcは、コントロールの長方形の座標が格納されます。dwItemSpecは、アイテムの番号が格納されます。アイテムは、コントロールによって意味が異なります。uItemStateは、アイテムの現在の状態を表す定数が格納されます。lItemlParamは、アプリケーション定義値が格納されます。描画ステージは、どの段階で描画を行うかを表します。それを既定の描画の前に行うか、既定の描画の後に行うかを決定することができます。次に、既定の描画の後に独自の描画を行う例を示します。0;}else;}break;WM_NOTIFYでNM_CUSTOMDRAWを検出したら、lParamをNMCUSTOMDRAW構造体で表すことができます。この時点ではまだ描画が行われていません。ここではボタンの左半分をFillRectで塗りつぶしています。右半分は既定の描画結果が残ったままとなります。既定の描画が行われるだけでCDDS_POSTPAINTは送られません。今回のプログラムは、カスタムドローの既定の描画の前に独自の描画を行います。NMCUSTOMDRAW構造体などを使用する場合は、commctrl.hのインクルードが必要になります。CDRF_SKIPDEFAULTを返すようにします。CDRF_SKIPDEFAULTを返して既定の描画をスキップするのです。ボタンにおけるカスタムドローでは、ボタン自体は既に描画されています。アプリケーションが行うのはボタンの上に何かを描画することになります。DrawTextでテキストを描画しています。