さまざまなカスタム コントロール
.NET Framework では、新しいコントロールを開発および実装できます。 継承を通じて、使い慣れたユーザー コントロールや既存のコントロールの機能の拡張もできます。 また、それぞれ独自の描画を実行するカスタム コントロールを作成することもできます。
作成するコントロールの種類を決めるときに、判断に迷うことがあります。 ここでは、継承できる各種コントロールの違いを明らかにし、プロジェクトに合わせて特定の種類のコントロールを選択する方法について説明します。
注意
Web フォームで使用するコントロールの作成については、「ASP.NET カスタム サーバー コントロールの開発」を参照してください。
基本コントロール クラス
Control クラスは、Windows フォーム コントロールの基本クラスです。 このクラスは、Windows フォーム アプリケーションでのビジュアル表示に必要なインフラストラクチャを提供します。
Control クラスは、Windows フォーム アプリケーションでビジュアル表示を実現するために次のタスクを実行します。
ウィンドウ ハンドルを公開する。
メッセージ ルーティングを管理する。
マウス イベントとキーボード イベントの他にさまざまなユーザー インターフェイス イベントを提供する。
高度なレイアウト機能を提供する。
ForeColor、BackColor、Height、Width など、ビジュアル表示に固有のさまざまなプロパティを格納する。
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 コントロールのクライアント領域の一角にクリック回数を描画できます。
推奨事項
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 フォーム コントロールを作成する」を参照してください。
参照
処理手順
方法 : シンプルな Windows フォーム コントロールを開発する
方法 : デザイン時機能を活用した Windows フォーム コントロールを作成する