組み込みのオーナー描画サポートを備えたコントロール

Windows フォームのオーナー描画 (カスタム描画とも呼ばれます) は、特定のコントロールの外観を変更するための手法です。

注意

このトピックで使用されている "コントロール" という語は、Control または Component のいずれかから派生したクラスを意味しています。

通常、Windows では、コントロールの外観を決定する BackColor などのプロパティ設定を使用して、描画を自動的に処理しています。 オーナー描画では、描画プロセスを引き継いで、プロパティでは設定できない外観の要素を変更できます。 たとえば、多くのコントロールでは表示されるテキストの色を設定できますが、1 つの色に制限されます。 オーナー描画では、テキストの一部分を黒で表示し、別の部分を赤で表示する、といったことができます。

実際には、オーナー描画はフォームでのグラフィックスの描画に似ています。 たとえば、フォームの Paint イベントのハンドラーでグラフィックス メソッドを使用して ListBox コントロールをエミュレートできますが、すべてのユーザー操作を処理するには独自のコードを記述することが必要になります。 オーナー描画では、コントロールは独自のコードを使って内容を描画しますが、それ以外については組み込み機能がすべて保持されます。 グラフィックス メソッドを使うと、コントロール内の各項目を描画したり、各項目の一部だけカスタマイズして他の部分は既定の外観を使ったりすることができます。

Windows フォーム コントロールでのオーナー描画

オーナー描画をサポートしているコントロールでオーナー描画を実行するには、通常、1 つのプロパティを設定し、1 つまたは複数のイベントを処理します。

オーナー描画をサポートしているほとんどのコントロールには、コントロールの描画時に描画関連のイベントが発生するかどうかを示す OwnerDraw または DrawMode プロパティがあります。

OwnerDraw または DrawMode プロパティを持たないコントロールには、自動的に発生する描画イベントを提供する DataGridView コントロールと、独自の描画関連イベントを持つ外部レンダリング クラスを使って描画される ToolStrip コントロールが含まれます。

さまざまな種類の描画イベントがありますが、標準的な描画イベントはコントロール内の 1 つの項目を描画するために発生します。 イベント ハンドラーは、描画される項目に関する情報と、その描画に使用できるツールを含む、EventArgs オブジェクトを受け取ります。 たとえば、このオブジェクトには、通常、その親コレクション内にある項目のインデックス番号、項目の表示境界を示す Rectangle、描画メソッドを呼び出すための Graphics オブジェクトが含まれます。 一部のイベントの EventArgs オブジェクトでは、項目に関する追加情報と、背景やフォーカス四角形などの項目の一部分を既定で描画するために呼び出すことができるメソッドが提供されます。

オーナー描画のカスタマイズを含む再利用可能なコントロールを作成するには、オーナー描画をサポートするコントロール クラスから派生する新しいクラスを作成します。 描画イベントを処理するのではなく、新しいクラスの適切な On<イベント名> メソッドのオーバーライドにオーナー描画のコードを組み込みます。 この場合、コントロールのユーザーがオーナー描画イベントを処理して追加のカスタマイズを提供できるように、基底クラスの On<イベント名> メソッドを呼び出す必要があります。

次の Windows フォーム コントロールは、すべてのバージョンの .NET Framework でオーナー描画をサポートします。

次のコントロールは、.NET Framework 2.0 でのみオーナー描画をサポートしています。

次のコントロールはオーナー描画をサポートしており、.NET Framework 2.0 の新機能です。

以下のセクションでは、これらの各コントロールについてさらに詳しく説明します。

ListBox コントロールと ComboBox コントロール

ListBox および ComboBoxコントロールを使用すると、コントロール内の個々のアイテムをすべて 1 つのサイズで、またはそれぞれ異なるサイズで描画できます。

注意

CheckedListBox コントロールは ListBox コントロールから派生されたものですが、オーナー描画はサポートされません。

各アイテムを同じサイズで描画するには、DrawMode プロパティを OwnerDrawFixed に設定し、DrawItem イベントを処理します。

各アイテムをそれぞれ異なるサイズで描画するには、DrawMode プロパティを OwnerDrawVariable に設定し、MeasureItemDrawItem の両方のイベントを処理します。 MeasureItem イベントを使うと、項目の DrawItem イベントが発生する前に、その項目のサイズを指定できます。

サンプル コードなど詳細については、次のトピックをご覧ください。

MainMenu または ContextMenu コンポーネント内の単一のメニュー項目は、MenuItem によって表現されます。

MenuItem を描画するには、その OwnerDraw プロパティを true に設定して、その DrawItem イベントを処理します。 DrawItem イベントが発生する前にメニュー項目のサイズをカスタマイズするには、項目のMeasureItem イベントを処理します。

サンプル コードなど詳細については、次のトピックをご覧ください。

TabControl コントロール

TabControl コントロールを使用すると、コントロール内の個々のタブを描画できます。 オーナー描画の影響を受けるのはタブのみです。TabPage の内容は影響を受けません。

TabControl で各タブを描画するには、DrawMode プロパティを OwnerDrawFixed に設定し、DrawItem イベントを処理します。 このイベントは、コントロールにタブが表示されている場合にのみ、タブごとに 1 回発生します。

サンプル コードなど詳細については、次のトピックをご覧ください。

ToolTip コンポーネント

ToolTip コンポーネントを使用すると、ヒントを表示するときにその全体を描画できます。

ToolTip を描画するには、その OwnerDraw プロパティを true に設定して、その Draw イベントを処理します。 Draw イベントが発生する前に ToolTip のサイズをカスタマイズするには、Popup イベントを処理し、イベント ハンドラーで ToolTipSize プロパティを設定します。

サンプル コードなど詳細については、次のトピックをご覧ください。

ListView コントロール

ListView コントロールを使用すると、コントロール内の個別の項目、サブ項目、列ヘッダーを描画できます。

コントロールのオーナー描画を有効にするには、OwnerDraw プロパティを true に設定します。

コントロール内の各項目を描画するには、DrawItem イベントを処理します。

View プロパティが Details に設定されている場合に、コントロール内の各サブ項目または列ヘッダーを描画するには、DrawSubItem および DrawColumnHeader イベントを処理します。

サンプル コードなど詳細については、次のトピックをご覧ください。

TreeView コントロール

TreeView コントロールを使用すると、コントロール内の個別のノードを描画できます。

各ノードに表示されるテキストのみを描画するには、DrawMode プロパティを OwnerDrawText に設定し、DrawNode イベントを処理してテキストを描画します。

各ノードのすべての要素を描画するには、DrawMode プロパティを OwnerDrawAll に設定し、DrawNode イベントを処理して、テキスト、アイコン、チェック ボックス、プラスおよびマイナス記号、ノードを結ぶ線など、どれでも必要とする要素を描画します。

サンプル コードなど詳細については、次のトピックをご覧ください。

DataGridView コントロール

DataGridView コントロールを使用すると、コントロール内の個別のセルと行を描画できます。

個別のセルを描画するには、CellPainting イベントを処理します。

個別の行または行の要素を描画するには、RowPrePaint イベントと RowPostPaint イベントの一方または両方を処理します。 RowPrePaint イベントは行内のセルが描画される前に発生し、RowPostPaint イベントはセルが描画された後で発生します。 両方のイベントと CellPainting イベントを処理して、行の背景、個々のセル、行の前景を個別に描画できます。または、必要な部分については個別にカスタマイズを提供し、行の他の要素には既定の表示を使うこともできます。

サンプル コードなど詳細については、次のトピックをご覧ください。

ToolStrip コントロール

ToolStrip また派生されたコントロールを使用すると、それらの外観の任意のアスペクトをカスタマイズできます。

ToolStrip コントロールについてカスタム レンダリングを実現するには、ToolStripToolStripManagerToolStripPanel、または ToolStripContentPanelRenderer プロパティを ToolStripRenderer オブジェクトに設定し、ToolStripRenderer クラスによって提供される多くの描画イベントの 1 つまたは複数を処理します。 または、特定の OnEventName メソッドを実装またはオーバーライドする ToolStripRendererToolStripProfessionalRenderer、または ToolStripSystemRenderer から派生した自分独自のクラスのインスタンスに Renderer プロパティを設定します。

サンプル コードなど詳細については、次のトピックをご覧ください。

関連項目