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

更新 : 2007 年 11 月

Windows フォームのオーナー描画とは、特定のコントロールの外観を変更するためのテクニックであり、カスタム描画とも呼ばれます。

メモ :

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

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

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

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

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

オーナー描画をサポートしているコントロールの多くは、自身を描画するときに描画関連のイベントを発生させるかどうかを示す OwnerDraw または DrawMode プロパティを備えています。

OwnerDraw または DrawMode プロパティを持たないコントロールの例としては、DataGridView コントロールや ToolStrip コントロールがあります。前者は自動的に発生する描画イベントを備えており、後者は独自の描画関連イベントを持つ外部の描画クラスを使用して描画されます。

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

オーナー描画によるカスタマイズを含んだ再使用可能なコントロールを作成するには、オーナー描画をサポートするコントロール クラスから派生した新しいクラスを作成します。その後、描画イベントを処理する代わりに、新しいクラス内の適切な OnEventName メソッドのオーバーライドにオーナー描画コードを記述します。このとき、必ず基本クラスの OnEventName メソッドを呼び出すようにしてください。これは、このコントロールのユーザーがオーナー描画イベントを処理してさらなるカスタマイズを実行できるようにするための配慮です。

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

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

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

以降では、これらの各コントロールについて詳しく説明していきます。

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

ListBox コントロールと ComboBox コントロールでは、コントロール内の個々の項目をすべて一定のサイズで描画することも、ばらばらのサイズで描画することもできます。

メモ :

CheckedListBox コントロールは ListBox コントロールから派生していますが、オーナー描画をサポートしていません。

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

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

詳細とコード例については、次のトピックを参照してください。

MenuItem コンポーネントは、MainMenu または ContextMenu コンポーネント内の 1 つのメニュー項目を表します。

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

詳細とコード例については、次のトピックを参照してください。

TabControl コントロール

TabControl コントロールでは、コントロール内の個々のタブを描画できます。オーナー描画はタブにのみ作用し、TabPage の内容には作用しません。

TabControl 内の個々のタブを描画するには、DrawMode プロパティを OwnerDrawFixed に設定し、DrawItem イベントを処理します。このイベントは、コントロール内でタブが表示されるときに、1 つのタブにつき 1 回だけ発生します。

詳細とコード例については、次のトピックを参照してください。

ToolTip コンポーネント

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、または ToolStripContentPanel の Renderer プロパティに ToolStripRenderer オブジェクトを指定し、ToolStripRenderer クラスが提供するさまざまな描画イベントを処理します。あるいは、ToolStripRenderer, ToolStripProfessionalRenderer または ToolStripSystemRenderer から派生して特定の OnEventName メソッドを実装またはオーバーライドする独自クラスを作成し、このクラスのインスタンスを Renderer プロパティに指定するという方法もあります。

詳細とコード例については、次のトピックを参照してください。

参照

その他の技術情報

Windows フォームで使用するコントロール