次の方法で共有


チュートリアル: C を使用して複合コントロールを作成する#

複合コントロールは、カスタム グラフィカル インターフェイスを作成および再利用するための手段を提供します。 複合コントロールは、基本的に視覚的表現を持つコンポーネントです。 そのため、ユーザー入力の検証、表示プロパティの変更、または作成者が必要とするその他のタスクの実行によって機能を拡張できる 1 つ以上の Windows フォーム コントロール、コンポーネント、またはコード ブロックで構成される場合があります。 複合コントロールは、他のコントロールと同じ方法で Windows フォームに配置できます。 このチュートリアルの最初の部分では、 ctlClockと呼ばれる単純な複合コントロールを作成します。 チュートリアルの 2 番目の部分では、継承によって ctlClock の機能を拡張します。

プロジェクトの作成

新しいプロジェクトを作成するときは、その名前を指定してルート名前空間、アセンブリ名、プロジェクト名を設定し、既定のコンポーネントが正しい名前空間にあることを確認します。

ctlClockLib コントロール ライブラリと ctlClock コントロールを作成するには

  1. Visual Studio で、新しい Windows フォーム コントロール ライブラリ プロジェクトを 作成し、 ctlClockLib という名前を付けます。

    プロジェクト名 ctlClockLibは、既定でルート名前空間にも割り当てられます。 ルート名前空間は、アセンブリ内のコンポーネントの名前を修飾するために使用されます。 たとえば、2 つのアセンブリに ctlClock という名前のコンポーネントが用意されている場合は、次を使用して ctlClock コンポーネントを指定できます。 ctlClockLib.ctlClock.

  2. ソリューション エクスプローラーでUserControl1.csを右クリックし、[名前の変更] をクリックします。 ファイル名を ctlClock.cs に変更します。 コード要素 "UserControl1" へのすべての参照の名前を変更するかどうかを確認するメッセージが表示されたら、[ はい ] ボタンをクリックします。

    既定では、複合コントロールはシステムによって提供される UserControl クラスから継承されます。 UserControl クラスは、すべての複合コントロールに必要な機能を提供し、標準のメソッドとプロパティを実装します。

  3. [ ファイル ] メニューの [ すべて保存 ] をクリックしてプロジェクトを保存します。

複合コントロールに Windows コントロールとコンポーネントを追加する

ビジュアル インターフェイスは、複合コントロールの重要な部分です。 このビジュアル インターフェイスは、1 つ以上の Windows コントロールをデザイナー 画面に追加することによって実装されます。 次のデモでは、Windows コントロールを複合コントロールに組み込み、機能を実装するコードを記述します。

複合コントロールにラベルとタイマーを追加するには

  1. ソリューション エクスプローラーでctlClock.csを右クリックし、[デザイナーの表示] をクリックします。

  2. ツールボックスで、[共通コントロール] ノードを展開し、[ラベル] をダブルクリックします。

    Labelという名前のlabel1 コントロールがデザイナー画面のコントロールに追加されます。

  3. デザイナーで label1 をクリックします。 [プロパティ] ウィンドウで、次のプロパティを設定します。

    プロパティ 変更後の値
    名前 lblDisplay
    テキスト (blank space)
    TextAlign MiddleCenter
    Font.Size 14
  4. ツールボックスで、[コンポーネント] ノードを展開し、[タイマー] をダブルクリックします。

    Timerはコンポーネントであるため、実行時に視覚的な表現はありません。 したがって、デザイナー画面のコントロールではなく、 コンポーネント デザイナー (デザイナー 画面の下部にあるトレイ) に表示されます。

  5. コンポーネント デザイナーで、timer1 をクリックし、Interval プロパティを 1000 に設定し、Enabled プロパティを true に設定します。

    Interval プロパティは、Timerコンポーネントがティックする頻度を制御します。 timer1 がティックするたびに、timer1_Tick イベント内でコードが実行されます。 間隔は、ティック間のミリ秒数を表します。

  6. コンポーネント デザイナーで、timer1 をダブルクリックして、timer1_TickctlClock イベントに移動します。

  7. 次のコードサンプルに似せてコードを修正してください。 アクセス修飾子は必ず private から protected に変更してください。

    protected void timer1_Tick(object sender, System.EventArgs e)
    {
        // Causes the label to display the current time.
        lblDisplay.Text = DateTime.Now.ToLongTimeString();
    }
    

    このコードにより、現在の時刻が lblDisplayに表示されます。 timer1の間隔は 1000 に設定されているため、このイベントは 1000 ミリ秒ごとに発生するため、現在の時刻が 1 秒ごとに更新されます。

  8. virtual キーワードでオーバーライドできるようにメソッドを変更します。 詳細については、以下の「ユーザー コントロールからの継承」セクションを参照してください。

    protected virtual void timer1_Tick(object sender, System.EventArgs e)
    
  9. [ ファイル ] メニューの [ すべて保存 ] をクリックしてプロジェクトを保存します。

複合コントロールにプロパティを追加する

クロック コントロールは、 Label コントロールと Timer コンポーネントをカプセル化し、それぞれに固有のプロパティのセットを持つようになりました。 これらのコントロールの個々のプロパティには、コントロールの後続のユーザーがアクセスすることはできませんが、適切なコード ブロックを記述することで、カスタム プロパティを作成して公開できます。 次の手順では、ユーザーが背景とテキストの色を変更できるようにするプロパティをコントロールに追加します。

複合コントロールにプロパティを追加するには

  1. ソリューション エクスプローラーでctlClock.csを右クリックし、[コードの表示] をクリックします。

    コントロールの コード エディター が開きます。

  2. public partial class ctlClock ステートメントを見つけます。 左中かっこ ({)の下に、次のコードを入力します。

    private Color colFColor;
    private Color colBColor;
    

    これらのステートメントは、作成しようとしているプロパティの値を格納するために使用するプライベート変数を作成します。

  3. 手順 2 の変数宣言の下に、次のコードを入力するか貼り付けます。

    // Declares the name and type of the property.
    public Color ClockBackColor
    {
        // Retrieves the value of the private variable colBColor.
        get
        {
            return colBColor;
        }
        // Stores the selected value in the private variable colBColor, and
        // updates the background color of the label control lblDisplay.
        set
        {
            colBColor = value;
            lblDisplay.BackColor = colBColor;
        }
    }
    // Provides a similar set of instructions for the foreground color.
    public Color ClockForeColor
    {
        get
        {
            return colFColor;
        }
        set
        {
            colFColor = value;
            lblDisplay.ForeColor = colFColor;
        }
    }
    

    上記のコードでは、 ClockForeColorClockBackColorの 2 つのカスタム プロパティを、このコントロールの後続のユーザーが使用できるようにします。 getステートメントとset ステートメントは、プロパティ値の格納と取得、およびプロパティに適した機能を実装するコードを提供します。

  4. [ ファイル ] メニューの [ すべて保存 ] をクリックしてプロジェクトを保存します。

コントロールをテストする

コントロールはスタンドアロン アプリケーションではありません。これらはコンテナーでホストされている必要があります。 UserControl テスト コンテナーを使用して、コントロールの実行時の動作をテストし、そのプロパティを実行します。 詳細については、「方法: UserControlの Run-Time 動作をテストする」を参照してください。

コントロールをテストするには

  1. F5 キーを押してプロジェクトをビルドし、UserControl テスト コンテナーでコントロールを実行します。

  2. テスト コンテナーのプロパティ グリッドで、 ClockBackColor プロパティを見つけ、プロパティを選択してカラー パレットを表示します。

  3. 色をクリックして選択します。

    コントロールの背景色は、選択した色に変わります。

  4. 同様の一連のイベントを使用して、 ClockForeColor プロパティが期待どおりに機能していることを確認します。

    このセクションと前のセクションでは、コンポーネントと Windows コントロールをコードとパッケージ化と組み合わせて、複合コントロールの形式でカスタム機能を提供する方法について説明しました。 複合コントロールのプロパティを公開する方法と、コントロールが完了した後でコントロールをテストする方法について学習しました。 次のセクションでは、 ctlClock をベースとして使用して継承された複合コントロールを構築する方法について説明します。

複合コントロールから継承する

前のセクションでは、Windows コントロール、コンポーネント、コードを再利用可能な複合コントロールに結合する方法について説明しました。 複合コントロールを、他のコントロールを構築できるベースとして使用できるようになりました。 基底クラスからクラスを派生させるプロセスは、 継承と呼ばれます。 このセクションでは、 ctlAlarmClockという複合コントロールを作成します。 このコントロールは、親コントロール ( ctlClock) から派生します。 親メソッドをオーバーライドし、新しいメソッドとプロパティを追加することで、 ctlClock の機能を拡張する方法について説明します。

継承されたコントロールを作成する最初の手順は、その親から派生することです。 このアクションにより、親コントロールのすべてのプロパティ、メソッド、およびグラフィカル特性を持つ新しいコントロールが作成されますが、新しい機能や変更された機能を追加するためのベースとして機能することもできます。

継承されたコントロールを作成するには

  1. ソリューション エクスプローラーでctlClockLib を右クリックし、[追加] をポイントして、[ユーザー コントロール] をクリックします。

    [新しい項目の追加] ダイアログ ボックスが開きます。

  2. [継承されたユーザー コントロール] テンプレートを選択します。

  3. [ 名前 ] ボックスに「 ctlAlarmClock.cs」と入力し、[ 追加] をクリックします。

    [ 継承ピッカー ] ダイアログ ボックスが表示されます。

  4. [ コンポーネント名]で、 ctlClock をダブルクリックします。

  5. ソリューション エクスプローラーで、現在のプロジェクトを参照します。

    ctlAlarmClock.csというファイルが現在のプロジェクトに追加されました。

アラームのプロパティを追加する

プロパティは、複合コントロールに追加されるのと同じ方法で、継承されたコントロールに追加されます。 次に、プロパティ宣言構文を使用して、アラームがオフになる日時の値を格納する AlarmTime と、アラームが設定されているかどうかを示す AlarmSet の 2 つのプロパティをコントロールに追加します。

複合コントロールにプロパティを追加するには

  1. ソリューション エクスプローラーでctlAlarmClock を右クリックし、[コードの表示] をクリックします。

  2. public class ステートメントを見つけます。 コントロールは ctlClockLib.ctlClockから継承されることに注意してください。 開き中かっこ({) ステートメント)内に、次のコードを入力します。

    private DateTime dteAlarmTime;
    private bool blnAlarmSet;
    // These properties will be declared as public to allow future
    // developers to access them.
    public DateTime AlarmTime
    {
        get
        {
            return dteAlarmTime;
        }
        set
        {
            dteAlarmTime = value;
        }
    }
    public bool AlarmSet
    {
        get
        {
            return blnAlarmSet;
        }
        set
        {
            blnAlarmSet = value;
        }
    }
    

コントロールのグラフィカル インターフェイスに追加する

継承されたコントロールには、継承するコントロールと同じビジュアル インターフェイスがあります。 親コントロールと同じ構成コントロールを所有していますが、特に公開されていない限り、構成コントロールのプロパティは使用できません。 複合コントロールに追加するのと同じ方法で、継承された複合コントロールのグラフィカル インターフェイスに追加できます。 アラーム クロックのビジュアル インターフェイスに追加を続けるには、アラームが鳴ったときに点滅するラベル コントロールを追加します。

ラベル コントロールを追加するには

  1. ソリューション エクスプローラーでctlAlarmClock を右クリックし、[デザイナーの表示] をクリックします。

    メイン ウィンドウに ctlAlarmClock のデザイナーが開きます。

  2. コントロールの表示部分をクリックし、[プロパティ] ウィンドウを表示します。

    すべてのプロパティが表示されている間は、淡色表示されます。 これは、これらのプロパティが lblDisplay ネイティブであり、[プロパティ] ウィンドウで変更またはアクセスできないことを示します。 既定では、複合コントロールに含まれるコントロールは privateされ、プロパティにはアクセスできません。

    複合コントロールの後続のユーザーがその内部コントロールにアクセスできるようにする場合は、 public または protectedとして宣言します。 これにより、適切なコードを使用して、複合コントロールに含まれるコントロールのプロパティを設定および変更できます。

  3. 複合コントロールに Label コントロールを追加します。

  4. マウスを使用して、 Label コントロールを表示ボックスのすぐ下にドラッグします。 [プロパティ] ウィンドウで、次のプロパティを設定します。

    プロパティ 設定
    名前 lblAlarm
    テキスト 警報!
    TextAlign MiddleCenter
    表示 false

アラーム機能を追加する

前の手順では、複合コントロールでアラーム機能を有効にするプロパティとコントロールを追加しました。 この手順では、現在の時刻とアラーム時刻を比較し、同じ場合にアラームをフラッシュするコードを追加します。 timer1_TickctlClockメソッドをオーバーライドし、コードを追加することで、ctlAlarmClock固有のすべての機能を保持しながら、ctlClockの機能を拡張します。

ctlClock の timer1_Tick メソッドをオーバーライドするには

  1. コード エディターで、private bool blnAlarmSet; ステートメントを見つけます。 その直下に、次のステートメントを追加します。

    private bool blnColorTicker;
    
  2. コード エディターで、クラス定義の最後にある閉じ中括弧 (}) を見つけます。 中かっこの直前に次のコードを追加してください。

    protected override void timer1_Tick(object sender, System.EventArgs e)
    {
        // Calls the Timer1_Tick method of ctlClock.
        base.timer1_Tick(sender, e);
        // Checks to see if the alarm is set.
        if (AlarmSet == false)
            return;
        else
            // If the date, hour, and minute of the alarm time are the same as
            // the current time, flash an alarm.
        {
            if (AlarmTime.Date == DateTime.Now.Date && AlarmTime.Hour ==
                DateTime.Now.Hour && AlarmTime.Minute == DateTime.Now.Minute)
            {
                // Sets lblAlarmVisible to true, and changes the background color based on
                // the value of blnColorTicker. The background color of the label
                // will flash once per tick of the clock.
                lblAlarm.Visible = true;
                if (blnColorTicker == false)
                {
                    lblAlarm.BackColor = Color.Red;
                    blnColorTicker = true;
                }
                else
                {
                    lblAlarm.BackColor = Color.Blue;
                    blnColorTicker = false;
                }
            }
            else
            {
                // Once the alarm has sounded for a minute, the label is made
                // invisible again.
                lblAlarm.Visible = false;
            }
        }
    }
    

    このコードを追加すると、いくつかのタスクが実行されます。 override ステートメントは、基本コントロールから継承されたメソッドの代わりにこのメソッドを使用するようにコントロールに指示します。 このメソッドが呼び出されると、 base.timer1_Tick ステートメントを呼び出してオーバーライドするメソッドが呼び出され、元のコントロールに組み込まれているすべての機能がこのコントロールに再現されます。 その後、アラーム機能を組み込むために追加のコードを実行します。 アラームが発生すると、点滅するラベル コントロールが表示されます。

    目覚まし時計の制御はほぼ完了です。 残っているのは、オフにする方法を実装することだけです。 これを行うには、 lblAlarm_Click メソッドにコードを追加します。

シャットオフ メソッドを実装するには

  1. ソリューション エクスプローラーでctlAlarmClock.csを右クリックし、[デザイナーの表示] をクリックします。

    デザイナーが開きます。

  2. コントロールにボタンを追加します。 ボタンのプロパティを次のように設定します。

    プロパティ 価値
    名前 btnAlarmOff
    テキスト アラームを無効にする
  3. デザイナーで、 btnAlarmOff をダブルクリックします。

    コード エディターが開き、private void btnAlarmOff_Click行が表示されます。

  4. 次のコードのように、このメソッドを変更します。

    private void btnAlarmOff_Click(object sender, System.EventArgs e)
    {
        // Turns off the alarm.
        AlarmSet = false;
        // Hides the flashing label.
        lblAlarm.Visible = false;
    }
    
  5. [ ファイル ] メニューの [ すべて保存 ] をクリックしてプロジェクトを保存します。

フォームで継承されたコントロールを使用する

基本クラス コントロールをテストしたのと同じ方法で、継承したコントロールをテストできます。 ctlClock: F5 キーを押してプロジェクトをビルドし、 UserControl テスト コンテナーでコントロールを実行します。 詳細については、「方法: UserControlの Run-Time 動作をテストする」を参照してください。

使用するコントロールを配置するには、フォームでホストする必要があります。 標準の複合コントロールと同様に、継承された複合コントロールは単独では使用できず、フォームまたはその他のコンテナーでホストする必要があります。 ctlAlarmClockの機能の詳細が増えるので、それをテストするには追加のコードが必要です。 この手順では、 ctlAlarmClockの機能をテストする簡単なプログラムを記述します。 AlarmTimectlAlarmClock プロパティを設定して表示するコードを記述し、その固有の関数をテストします。

コントロールをビルドしてテスト フォームに追加するには

  1. ソリューション エクスプローラーでctlClockLib を右クリックし、[ビルド] をクリックします。

  2. ソリューションに新しい Windows フォーム アプリケーション プロジェクトを追加し、Test という名前を付 けます

  3. ソリューション エクスプローラーで、テスト プロジェクトの [参照] ノードを右クリックします。 [ 参照の追加] をクリックして、[ 参照の追加 ] ダイアログ ボックスを表示します。 [ プロジェクト] というラベルの付いたタブをクリックします。 ctlClockLib プロジェクトがプロジェクトの下に表示されます。 プロジェクトをダブルクリックして、テスト プロジェクトへの参照を追加します。

  4. ソリューション エクスプローラーで、[テスト] を右クリックし、[ビルド] をクリックします。

  5. ツールボックスで、ctlClockLib コンポーネント ノードを展開します。

  6. ctlAlarmClock をダブルクリックして、ctlAlarmClockのコピーをフォームに追加します。

  7. ツールボックスDateTimePicker を見つけてダブルクリックし、フォームにDateTimePicker コントロールを追加し、[Label] をダブルクリックして コントロールを追加します。

  8. マウスを使用して、フォーム上の便利な場所にコントロールを配置します。

  9. これらのコントロールのプロパティは、次のように設定します。

    コントロール プロパティ 価値
    label1 テキスト (blank space)
    名前 lblTest
    dateTimePicker1 名前 dtpTest
    形式 Time
  10. デザイナーで、 dtpTest をダブルクリックします。

    コード エディターprivate void dtpTest_ValueChangedに開きます。

  11. 次のようにコードを変更します。

    private void dtpTest_ValueChanged(object sender, System.EventArgs e)
    {
        ctlAlarmClock1.AlarmTime = dtpTest.Value;
        ctlAlarmClock1.AlarmSet = true;
        lblTest.Text = "Alarm Time is " +
            ctlAlarmClock1.AlarmTime.ToShortTimeString();
    }
    
  12. ソリューション エクスプローラーで、[テスト] を右クリックし、[スタートアップ プロジェクトとして設定] をクリックします。

  13. [デバッグ] メニューの [デバッグの開始] をクリックします。

    テスト プログラムが開始されます。 ctlAlarmClock コントロールで現在の時刻が更新され、開始時刻が DateTimePicker コントロールに表示されることに注意してください。

  14. 時間の分が表示される DateTimePicker をクリックします。

  15. キーボードを使用して、 ctlAlarmClockで表示されている現在の時刻より 1 分大きい分の値を設定します。

    アラーム設定の時間が lblTestに表示されます。 表示された時刻がアラーム設定時間に達するまで待ちます。 アラームが設定された時刻に達すると、 lblAlarm が点滅します。

  16. btnAlarmOffをクリックしてアラームをオフにします。 アラームをリセットできるようになりました。

この記事では、いくつかの主要な概念について説明しました。 コントロールとコンポーネントを複合コントロール コンテナーに組み合わせて複合コントロールを作成する方法について学習しました。 コントロールにプロパティを追加し、カスタム機能を実装するコードを記述する方法について学習しました。 最後のセクションでは、継承によって特定の複合コントロールの機能を拡張し、それらのメソッドをオーバーライドしてホスト メソッドの機能を変更する方法について学習しました。

こちらも参照ください