さまざまなカスタム コントロール
.NET Framework を使用して、新しいコントロールを開発し、実装できます。 継承によって、使い慣れたユーザー コントロールや既存のコントロールの機能を拡張できます。 また、独自の描画を実行するカスタム コントロールを作成することもできます。
作成するコントロールの種類を決めるときに、判断に迷うことがあります。 このトピックでは、継承できる各種コントロールの違いを示し、プロジェクトに合わせて特定の種類のコントロールを選択する方法について説明します。
注意
Web フォームで使用するコントロールを作成する方法については、「カスタム ASP.NET サーバー コントロールの開発」を参照してください。
基本コントロール クラス
Control クラスは、Windows フォーム コントロールの基底クラスです。 このクラスは、Windows フォーム アプリケーションでのビジュアル表示に必要なインフラストラクチャを提供します。
Control クラスにより、Windows フォーム アプリケーションでのビジュアル表示を提供するために、次のタスクが実行されます。
ウィンドウ ハンドルを公開する。
メッセージ ルーティングを管理する。
マウス イベントとキーボード イベント、および他のさまざまなユーザー インターフェイス イベントを提供する。
高度なレイアウト機能を提供する。
Windows フォーム コントロールが Microsoft® ActiveX® コントロールとして機能するために必要なセキュリティとスレッドのサポートを提供する。
インフラストラクチャの大部分は基本クラスによって提供されるため、独自の Windows フォーム コントロールを比較的簡単に開発できます。
コントロールの種類
Windows フォームは、複合、拡張、カスタムの 3 種類のユーザー定義コントロールをサポートします。 以下のセクションでは、各種コントロールについて説明し、プロジェクトで使用する種類を選択する際の推奨事項を示します。
複合コントロール
複合コントロールは、共通のコンテナーにカプセル化された Windows フォーム コントロールのコレクションです。 この種のコントロールは、ユーザー コントロールとも呼ばれます。 含まれているコントロールは、内在コントロールと呼ばれます。
複合コントロールは、含まれている各 Windows フォーム コントロールに関連する固有の機能をすべて保持し、それらのプロパティを選択的に公開してバインドできます。 また、開発者側での追加作業を必要としない多数の既定のキーボード処理機能も提供します。
たとえば、データベースの顧客の住所データを表示する複合コントロールを作成できます。 このコントロールには、データベース フィールドを表示するための DataGridView コントロール、データ ソースへのバインドを処理するための BindingSource、およびレコード間を移動するための BindingNavigator コントロールが含まれる場合があります。 データ バインディング プロパティを選択的に公開したり、コントロール全体をパッケージ化してアプリケーション間で再利用したりできます。 この種の複合コントロールの例については、「方法 : Windows フォーム コントロールに属性を適用する」を参照してください。
複合コントロールを作成するには、UserControl クラスから派生させます。 UserControl 基底クラスは、子コントロールに対してキーボード ルーティングを提供し、複数の子コントロールを 1 つのグループとして機能させることができます。 詳細については、「複合 Windows フォーム コントロールの開発」を参照してください。
推奨
次の場合に、UserControl クラスから継承します。
- いくつかの Windows フォーム コントロールの機能を再利用可能な 1 つの単位に結合します。
拡張コントロール
既存の Windows フォーム コントロールから継承されたコントロールを派生できます。 この方法では、Windows フォーム コントロールの固有の機能をすべて保持し、カスタム プロパティやカスタム メソッドなどの機能を追加してその機能を拡張できます。 この方法を使用して、基本コントロールの描画ロジックをオーバーライドし、そのユーザー インターフェイスの外観を変更して拡張できます。
たとえば、ユーザーがクリックした回数を追跡する、Button コントロールから派生したコントロールを作成できます。
一部のコントロールでは、基底クラスの OnPaint メソッドをオーバーライドすることで、コントロールのグラフィカル ユーザー インターフェイスにカスタムの外観を追加することもできます。 クリックを追跡する拡張ボタンの場合は、OnPaint メソッドをオーバーライドして OnPaint の基本実装を呼び出し、Button コントロールのクライアント領域の 1 つの隅にクリック数を描画します。
推奨
次の場合に、Windows フォーム コントロールから継承します。
必要とする機能のほとんどが、既存の Windows フォーム コントロールと同じです。
カスタムのグラフィカル ユーザー インターフェイスが不要な場合、または既存のコントロールの新しいグラフィカル ユーザー インターフェイスをデザインする場合。
カスタム コントロール
コントロールを作成する別の方法は、Control から継承することで、実質的に一から作成する方法です。 Control クラスは、コントロールで必要とされるすべての基本的な機能 (マウスやキーボードの処理イベントなど) を提供しますが、コントロール固有の機能やグラフィカル インターフェイスは提供しません。
Control クラスから継承することでコントロールを作成する場合は、UserControl や既存の Windows フォーム コントロールから継承する場合よりも、はるかに多くの配慮と労力が必要です。 多くの実装が開発者に委ねられるため、作成されるコントロールは、複合コントロールや拡張コントロールよりも柔軟性に優れ、ニーズに合わせてコントロールを調整できます。
カスタム コントロールを実装するには、コントロールの OnPaint イベントのコードと、必要な機能固有のコードを作成する必要があります。 また、WndProc メソッドをオーバーライドして、Windows メッセージを直接処理することもできます。 これはコントロールを作成する最も強力な方法ですが、この手法を効果的に使用するには、Microsoft Win32® API を十分に理解している必要があります。
カスタム コントロールの例として、アナログ時計の外観と動作を複製した時計コントロールがあります。 内部 Timer コンポーネントからの Tick イベントに応答してカスタム ペインティングが呼び出されて、時計の針が移動します。 詳細については、「方法 : シンプルな Windows フォーム コントロールを開発する」を参照してください。
推奨
次の場合に、Control クラスから継承します。
コントロールのカスタムのグラフィカル表現を提供します。
標準コントロールでは使用できないカスタムの機能を実装する必要があります。
ActiveX コントロール
Windows フォーム インストラクチャは、Windows フォーム コントロールをホストするために最適化されていますが、ActiveX コントロールを使用することもできます。 Visual Studio では、このタスクに対するサポートが用意されています。 詳細については、「方法 : Windows フォームに ActiveX コントロールを追加する」を参照してください。
ウィンドウなしのコントロール
Microsoft Visual Basic® 6.0 と ActiveX テクノロジは、"ウィンドウなし" のコントロールをサポートします。 ウィンドウなしのコントロールは、Windows フォームではサポートされていません。
カスタム デザイン エクスペリエンス
カスタムのデザイン時エクスペリエンスを実装する必要がある場合は、独自のデザイナーを作成できます。 複合コントロールの場合は、ParentControlDesigner または DocumentDesigner クラスからカスタム デザイナー クラスを派生させます。 拡張およびカスタム コントロールの場合は、ControlDesigner クラスからカスタム デザイナー クラスを派生させます。
コントロールをデザイナーに関連付けるには、DesignerAttribute を使用します。 詳細については、「デザイン時サポートの拡張」および「方法 : デザイン時機能を活用した Windows フォーム コントロールを作成する」を参照してください。
関連項目
.NET Desktop feedback