方法 : MDI 子フォームを作成する

更新 : 2007 年 11 月

MDI 子フォームは、ユーザーとのやり取りの中心となるため、マルチ ドキュメント インターフェイス (MDI) アプリケーションの不可欠な要素です。

以下の手順では、一般的なワード プロセッシング アプリケーションと同様の機能を持ち、RichTextBox コントロールを表示する MDI 子フォームを作成しています。System.Windows.Forms コントロールを DataGridView などの他のコントロールに置き換えるか、または複数のコントロールを組み合わせることによって、さまざまな機能を持つ MDI 子ウィンドウ (または MDI アプリケーション) を作成できます。

7aw8zc76.alert_note(ja-jp,VS.90).gifメモ :

使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。

MDI 子フォームを作成するには

  1. [ファイル] と [ウィンドウ] の各トップレベル メニュー項目、および [新規作成] と [閉じる] の各サブメニュー項目を持つ MDI 親フォームを作成します。MDI 親フォームの作成方法の詳細については、「方法 : MDI 親フォームを作成する」を参照してください。

  2. [プロパティ] ウィンドウの上部にあるドロップダウン リスト ボックスで、[ウィンドウ] メニュー項目に対応するメニュー項目を選択し、MdiList プロパティを true に設定します。

    この設定によって、[ウィンドウ] メニュー内に、開かれた MDI 子ウィンドウの一覧が表示され、アクティブな子ウィンドウの横にチェック マークが付くようになります。

  3. ソリューション エクスプローラで、プロジェクトを右クリックし、[追加] をポイントして、[新しい項目の追加] をクリックします。

    このフォームが MDI 子フォームのテンプレートとなります。

    7aw8zc76.alert_note(ja-jp,VS.90).gifメモ :

    ここで作成する MDI 子フォームは、標準の Windows フォームです。したがって、Opacity プロパティを使用して、フォームを透明にするかどうかを制御できます。ただし、Opacity プロパティはトップレベル ウィンドウ用に設計されているものです。描画上の問題が発生する可能性があるため、MDI 子フォームには使用しないでください。

  4. [新しい項目の追加] ダイアログ ボックスで、[テンプレート] ペインの [Windows フォーム] (Visual Basic または Visual C# の場合) または [Windows フォーム] (Visual C++ の場合) を選択します。[ファイル名] ボックスに「Form2」というフォーム名を入力します。[開く] をクリックして、プロジェクトにこのフォームを追加します。

    Windows フォーム デザイナが開き、フォーム (Form2) が表示されます。

  5. ツールボックスから、フォームに RichTextBox コントロールをドラッグします。

  6. [プロパティ] ウィンドウで、Anchor プロパティを Top または Left に設定し、Dock プロパティを Fill に設定します。

    このように設定しておくと、フォームのサイズが変更された場合も、RichTextBox コントロールは MDI 子フォームの領域全体に表示されます。

  7. [新規作成] メニュー項目の Click イベント ハンドラを作成します。イベンド ハンドラの作成方法の詳細については、「方法 : デザイナを使用してイベント ハンドラを作成する」を参照してください。

  8. ユーザーが [新規作成] メニュー項目をクリックするときに新しい MDI 子フォームが作成されるように、次のようなコードを挿入します。

    7aw8zc76.alert_note(ja-jp,VS.90).gifメモ :

    次の例では、イベント ハンドラは MenuItem2 の Click イベントを処理します。アプリケーション アーキテクチャの仕様によっては、[新規作成] メニュー項目が MenuItem2 とは限らないことに注意してください。

    Protected Sub MDIChildNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
       Dim NewMDIChild As New Form2()
       'Set the Parent Form of the Child window.
       NewMDIChild.MdiParent = Me
       'Display the new form.
       NewMDIChild.Show()
    End Sub
    
    protected void MDIChildNew_Click(object sender, System.EventArgs e){
       Form2 newMDIChild = new Form2();
       // Set the Parent Form of the Child window.
       newMDIChild.MdiParent = this;
       // Display the new form.
       newMDIChild.Show();
    }
    
    private:
       void menuItem2_Click(System::Object ^ sender,
          System::EventArgs ^ e)
       {
          Form2^ newMDIChild = gcnew Form2();
          // Set the Parent Form of the Child window.
          newMDIChild->MdiParent = this;
          // Display the new form.
          newMDIChild->Show();
       }
    

    Visual C++ では、Form1.h の先頭に次の #include ディレクティブを追加します。

    #include "Form2.h"
    
  9. F5 キーを押してアプリケーションを実行します。[ファイル] メニューの [新規作成] を選択すると、新規の MDI 子フォームが作成され、[ウィンドウ] メニュー内の一覧に表示されるようになります。

    7aw8zc76.alert_note(ja-jp,VS.90).gifメモ :

    MainMenu コンポーネント (通常はメニュー項目のメニュー構造を持つ) が配置された MDI 親フォーム内で、MainMenu コンポーネント (通常はメニュー項目のメニュー構造を持つ) が配置された MDI 子フォームを開くと、MergeType プロパティ (およびオプションで MergeOrder プロパティ) を設定している場合、メニュー項目は自動的にマージされます。両方の MainMenu コンポーネントと、子フォームのすべてのメニュー項目の MergeType プロパティを MergeItems に設定します。また、両方のメニューのメニュー項目が指定した順序で表示されるように、MergeOrder プロパティを設定します。MDI 親フォームを閉じるときには、MDI 親フォームの Closing イベントより前に各 MDI 子フォームの Closing イベントが発生することに注意してください。MDI 子の Closing イベントをキャンセルしても、MDI 親の Closing イベントは発生しますが、MDI 親の Closing イベントの CancelEventArgs 引数は、true に設定されます。CancelEventArgs 引数を false に設定することにより、MDI 親フォームとすべての MDI 子フォームを強制的に閉じることができます。

参照

処理手順

方法 : MDI 親フォームを作成する

方法 : アクティブな MDI 子フォームを特定する

方法 : アクティブな MDI 子フォームにデータを送信する

方法 : MDI 子フォームを配置する

その他の技術情報

マルチ ドキュメント インターフェイス (MDI) アプリケーション