カスタム描画について
このセクションには、カスタム描画機能に関する一般的な情報が含まれており、アプリケーションでカスタム描画をサポートする方法の概念的な概要を示します。 現在、次のコントロールはカスタム描画機能をサポートしています。
- ヘッダーコントロール
- リストビュー コントロール
- Rebar 制御
- ツール バー コントロール
- ツールチップ コントロール
- TrackBar 制御
- ツリービュー 制御
- カスタム描画通知メッセージについて
- ペイント サイクル、描画ステージ、および通知メッセージ
- カスタム 描画 サービスを利用する
- リスト ビュー コントロールとツリー ビュー コントロールを使用したカスタム描画
- 関連トピック
カスタム描画通知メッセージについて
カスタム描画をサポートするすべての一般的なコントロールは、描画操作中に特定のポイントで NM_CUSTOMDRAW 通知コードを送信します。 これらの通知コードでは、コントロール全体に適用される描画操作と、コントロール内の項目に固有の描画操作について説明します。 多くの通知コードと同様に、 NM_CUSTOMDRAW通知は WM_NOTIFY メッセージとして送信されます。
カスタム描画通知の lParam パラメーターは、 NMCUSTOMDRAW 構造体のアドレス、または NMCUSTOMDRAW 構造体を最初のメンバーとして含むコントロール固有の構造体です。 次の表は、コントロールとコントロールが使用する構造体の関係を示しています。
構造 | 使用者 |
---|---|
NMCUSTOMDRAW | 鉄筋、トラック バー、およびヘッダー コントロール |
NMLVCUSTOMDRAW | List-View コントロール |
NMTBCUSTOMDRAW | ツール バー コントロール |
NMTTCUSTOMDRAW | ツールチップ コントロール |
NMTVCUSTOMDRAW | ツリービュー コントロール |
ペイント サイクル、描画ステージ、および通知メッセージ
すべての Windows アプリケーションと同様に、一般的なコントロールは、システムまたは他のアプリケーションから受信したメッセージに基づいて、定期的に自身を描画および消去します。 コントロールの描画または消去自体のプロセスは、 ペイント サイクルと呼ばれます。 カスタム描画をサポートするコントロールは、各ペイント サイクルを通じて NM_CUSTOMDRAW 通知コードを定期的に送信します。 この通知コードには、 NMCUSTOMDRAW 構造体またはその最初のメンバーとして NMCUSTOMDRAW 構造体を含む別の構造体が伴います。
NMCUSTOMDRAW 構造体に含まれる情報の 1 つは、ペイント サイクルの現在のステージです。 これは 描画ステージ と呼ばれ、構造体の dwDrawStage メンバーの値によって表されます。 コントロールは、4 つの基本的な描画ステージについて親に通知します。 これらの基本描画ステージまたはグローバル描画ステージは、次のフラグ値 (Commctrl.h で定義) によって構造体で表されます。
グローバル描画ステージ値: 、、、、、、、、、、 | 説明 |
---|---|
CDDS_PREPAINT | ペイント サイクルが開始される前。 |
CDDS_POSTPAINT | ペイント サイクルが完了した後。 |
CDDS_PREERASE | 消去サイクルが開始される前。 |
CDDS_POSTERASE | 消去サイクルが完了した後。 |
上記の各値を CDDS_ITEM フラグと組み合わせて、項目に固有の描画ステージを指定できます。 便宜上、Commctrl.h には次の項目固有の値が含まれています。
アイテム固有の描画ステージ値 | 説明 |
---|---|
CDDS_ITEMPREPAINT | アイテムが描画される前。 |
CDDS_ITEMPOSTPAINT | 項目が描画された後。 |
CDDS_ITEMPREERASE | アイテムが消去される前。 |
CDDS_ITEMPOSTERASE | アイテムが消去された後。 |
CDDS_SUBITEM | 共通コントロールのバージョン 4.71。 サブ項目が描画されている場合は、フラグをCDDS_ITEMPREPAINTまたはCDDS_ITEMPOSTPAINTと組み合わせる。 これは、 CDDS_PREPAINT から CDRF_NOTIFYITEMDRAW が返された場合にのみ設定されます。 |
アプリケーションは、 NM_CUSTOMDRAW 通知コードを処理し、コントロールに何を行う必要があるかを通知する特定の値を返す必要があります。 これらの戻り値の詳細については、次のセクションを参照してください。
カスタム 描画 サービスを利用する
カスタム描画機能を利用する鍵は、コントロールが送信する NM_CUSTOMDRAW 通知コードに応答することです。 これらの通知に応答してアプリケーションが送信する戻り値によって、そのペイント サイクルのコントロールの動作が決まります。
このセクションでは、アプリケーションで NM_CUSTOMDRAW 通知の戻り値を使用してコントロールの動作を決定する方法について説明します。
詳細については、次のトピックに分かれています。
事前描画通知への応答
各ペイント サイクルの開始時に、コントロールは NM_CUSTOMDRAW 通知コードを送信し、付随するNM_CUSTOMDRAW構造体の dwDrawStage メンバーのCDDS_PREPAINT値を指定します。 アプリケーションがこの最初の通知に返す値によって、コントロールがその描画サイクルの残りの部分に対して後続のカスタム描画通知を送信する方法とタイミングが決まります。 アプリケーションは、最初の通知に応答して、次のフラグの組み合わせを返すことができます。
戻り値 | 結果 |
---|---|
CDRF_DODEFAULT | コントロール自体が描画されます。 このペイント サイクルの追加の NM_CUSTOMDRAW 通知は送信されません。 このフラグは、他のフラグと共に使用することはできません。 |
CDRF_DOERASE | コントロールは背景のみを描画します。 |
CDRF_NEWFONT | アプリケーションで項目の新しいフォントを指定しました。コントロールは新しいフォントを使用します。 フォントの変更の詳細については、「フォントと色の変更」を参照してください。 これは、 dwDrawStage がCDDS_ITEMPREPAINT等しい場合に発生します。 |
CDRF_NOTIFYITEMDRAW | コントロールは、アイテム固有の描画操作を親に通知します。 それがアイテムを描画する前後に NM_CUSTOMDRAW 通知コードを送信します。これは、 dwDrawStage がCDDS_PREPAINTに等しい場合に発生します。 |
CDRF_NOTIFYPOSTERASE | コントロールは、項目を消去した後に親に通知します。 これは、 dwDrawStage がCDDS_PREPAINTと等しい場合に発生します。 |
CDRF_NOTIFYPOSTPAINT | コントロール全体の 描画サイクルが完了すると、コントロールは NM_CUSTOMDRAW 通知を送信します。 これは、 dwDrawStage がCDDS_PREPAINTと等しい場合に発生します。 |
CDRF_NOTIFYSUBITEMDRAW | バージョン 4.71. アプリケーションは、各リスト ビュー サブ項目が描画される前に dwDrawStage が CDDS_ITEMPREPAINT | CDDS_SUBITEM に設定された NM_CUSTOMDRAW 通知を受け取ります。 その後、各サブ項目のフォントと色を個別に指定するか、既定の処理のために CDRF_DODEFAULT を返すことができます。 これは、 dwDrawStage がCDDS_ITEMPREPAINT等しい場合に発生します。 |
CDRF_SKIPDEFAULT | アプリケーションが項目を手動で描画しました。 コントロールは項目を描画しません。 これは、 dwDrawStage がCDDS_ITEMPREPAINT等しい場合に発生します。 |
CDRF_SKIPPOSTPAINT | コントロールは、項目の周囲にフォーカスの四角形を描画しません。 |
アイテム固有の通知の要求
アプリケーションが初期の事前描画カスタム描画通知に CDRF_NOTIFYITEMDRAW を返した場合、コントロールはその描画サイクル中に描画する各項目の通知を送信します。 これらの項目固有の通知は、付随する NMCUSTOMDRAW 構造体の dwDrawStage メンバーにCDDS_ITEMPREPAINT値を持ちます。 これらの項目固有の通知に CDRF_NOTIFYPOSTPAINT を返すことで、コントロールがアイテムの描画が完了したときに別の通知を送信するように要求できます。 それ以外の場合は、 CDRF_DODEFAULT を返します。コントロールは、次の項目の描画を開始するまで親ウィンドウに通知しません。
アイテムを自分で描画する
アプリケーションで項目全体を描画する場合は、 CDRF_SKIPDEFAULT を返します。 これにより、コントロールは描画する必要のない項目をスキップできるため、システムのオーバーヘッドが減少します。 この値を返すと、コントロールによって項目の一部が描画されないことに注意してください。
フォントと色の変更
アプリケーションでは、カスタム描画を使用して項目のフォントを変更できます。 カスタム描画通知に関連付けられている NMCUSTOMDRAW 構造体の hdc メンバーによって指定されたデバイス コンテキストに必要な HFONT を選択するだけです。 選択したフォントのメトリックは既定のフォントとは異なる場合があるため、通知メッセージの 戻り値に CDRF_NEWFONT ビットを含めるようにしてください。 この機能の使用方法の詳細については、「カスタム描画の使用」のサンプル コードを参照してください。 アプリケーションが指定するフォントは、選択されていない場合にその項目を表示するために使用されます。 ユーザー設定の描画では、選択した項目のフォント属性を変更できません。
リスト ビューとツリー ビューを除くカスタム描画をサポートするすべてのコントロールのテキストの色を変更するには、 SetTextColor 関数と SetBkColor 関数を使用して、カスタム描画通知構造で指定されたデバイス コンテキストで目的のテキストと背景色を設定するだけです。 リスト ビューまたはツリー ビューでテキストの色を変更するには、 NMLVCUSTOMDRAW または NMTVCUSTOMDRAW 構造体の clrText メンバーと clrTextBk メンバーに目的の色の値を配置する必要があります。
Note
共通コントロールの バージョン 6.0 より前では、ツール バーは CDRF_NEWFONT フラグを無視します。 バージョン 6.0 では、 CDRF_NEWFONT フラグがサポートされており、それを使用してツールバーの別のフォントを選択できます。 ただし、表示スタイルがアクティブな場合、ツールバーの色を変更することはできません。 バージョン 6.0 でツール バーの色を変更するには、最初に SetWindowTheme を呼び出し、表示スタイルを指定せず、ビジュアル スタイルを無効にする必要があります。
SetWindowTheme (hwnd, "", "");
リスト ビュー コントロールとツリー ビュー コントロールを使用したカスタム描画
ほとんどの一般的なコントロールは、基本的に同じ方法で処理できます。 ただし、リスト ビュー コントロールとツリー ビュー コントロールには、カスタム描画に対して多少異なるアプローチが必要な機能がいくつかあります。
バージョン 5.0 の場合、 CDRF_NEWFONTを返してフォントを変更すると、これら 2 つのコントロールにクリップされたテキストが表示されることがあります。 この動作は、以前のバージョンの共通コントロールとの下位互換性のために必要です。 リスト ビューまたはツリー ビュー コントロールのフォントを変更する場合は、コントロールに項目を追加する前に wParam 値を 5 に設定して CCM_SETVERSION メッセージを送信すると、より良い結果が得られます。 カスタム描画を使用するツリー ビュー コントロールの例については、サポート技術情報の記事 「SAMPLE: CustDTv Illustrates Custom Draw in a TreeView (Q248496)」を参照してください。
リスト ビュー コントロールを使用したカスタム描画
リスト ビュー コントロールにはサブ項目と複数の表示モードがあるため、他の一般的なコントロールとは多少異なる方法で NM_CUSTOMDRAW 通知を処理する必要があります。
レポート モードの場合は、次の手順を使用します。
- 最初の NM_CUSTOMDRAW 通知は、関連する NMCUSTOMDRAW 構造の dwDrawStage メンバーを CDDS_PREPAINT に設定します。 CDRF_NOTIFYITEMDRAW を返します。
- その後、 dwDrawStage が CDDS_ITEMPREPAINT に設定された NM_CUSTOMDRAW 通知 を受け取ります。 新しいフォントまたは色を指定して CDRF_NEWFONT を返すと、項目のすべてのサブ項目が変更されます。 代わりに各サブ項目を個別に処理する場合は、 CDRF_NOTIFYSUBITEMDRAW を返します。
- 前のステップで CDRF_NOTIFYSUBITEMDRAW を返した場合、 dwDrawStage が CDDS_SUBITEM | CDDS_ITEMPREPAINT に設定された各サブアイテムに対して、 NM_CUSTOMDRAW 通知を受け取ります。 そのサブ項目のフォントまたは色を変更するには、新しいフォントまたは色を指定し、 CDRF_NEWFONT を返します。
大きいアイコン、小さいアイコン、およびリスト モードの場合は、次の手順を使用します。
- 最初の NM_CUSTOMDRAW 通知は、関連する NMCUSTOMDRAW 構造の dwDrawStage メンバーを CDDS_PREPAINT に設定します。 CDRF_NOTIFYITEMDRAW を返します。
- その後、 dwDrawStage が CDDS_ITEMPREPAINT に設定された NM_CUSTOMDRAW 通知 を受け取ります。 項目のフォントまたは色を変更するには、新しいフォントと色を指定し、 CDRF_NEWFONT を返します。 これらのモードにはサブ項目がないため、追加のNM_CUSTOMDRAW通知は受け取りません。
リスト ビュー NM_CUSTOMDRAW 通知ハンドラーの例については、「カスタム描画の使用」を参照してください。
関連トピック
-
Conceptual
-
その他のリソース