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

MDI 子フォームは、ユーザー操作の中心であるため、マルチドキュメント インターフェイス (MDI) アプリケーションの重要な要素です。

次の手順では、Visual Studio を使用して、ほとんどのワード プロセッシング アプリケーションに似ている RichTextBox コントロールを表示する MDI 子フォームを作成します。 System.Windows.Forms コントロールを、DataGridView コントロールやコントロールを組み合わせたその他のコントロールで置き換えることで、さまざまな可能性のある MDI 子ウィンドウ (およびその拡張としての MDI アプリケーション) を作成できます。

MDI 子フォームを作成する

  1. 新しい Windows フォーム アプリケーション プロジェクトを Visual Studio に作成します。 フォームの [プロパティ] ウィンドウで、IsMdiContainer プロパティを trueWindowsState プロパティを Maximized に設定します。

    これによって、フォームが子ウィンドウの MDI コンテナーとして指定されます。

  2. Toolbox から、MenuStrip コントロールをフォームにドラッグします。 Text プロパティを [ファイル] に設定します。

  3. [項目] プロパティの隣にある省略記号 (...) をクリックして、 [追加] をクリックし、2 つの子ツール ストリップのメニュー項目を追加します。 これらの項目の Text プロパティを [新規][ウィンドウ] に設定します。

  4. ソリューション エクスプローラーで、プロジェクトを右クリックし、 [追加]>[新しい項目] を選択します。

  5. [新しい項目の追加] ダイアログ ボックスで、 [テンプレート] ペインから [Windows フォーム] (Visual Basic または Visual C#) または [Windows フォーム アプリケーション (.NET)] (Visual C++) を選択します。 [名前] ボックスで、フォームに Form2 という名前を付けます。 [開く] を選択すると、フォームがプロジェクトに追加されます。

    注意

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

    このフォームは、MDI 子フォーム用のテンプレートになります。

    Windows フォーム デザイナーが開き、Form2 を表示します。

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

  7. [プロパティ] ウィンドウで、Anchor プロパティを [上、左] に設定し、Dock プロパティを [塗りつぶし] に設定します。

    これにより、フォームがサイズ変更された場合でも、RichTextBox コントロールが MDI 子フォームの領域を完全に塗りつぶします。

  8. [新規] メニュー項目をダブルクリックして、Click イベント ハンドラーを作成します。

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

    注意

    次の例では、イベント ハンドラーが MenuItem2Click イベントを処理します。 アプリケーションのアーキテクチャの仕様によっては、 [新規] メニュー項目が 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();
       }
    

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

    #include "Form2.h"
    
  10. [プロパティ] ウィンドウの上部にあるドロップダウンリストで、 [ファイル] メニュー ストリップに該当するメニュー ストリップを選択し、MdiWindowListItem プロパティを Window ToolStripMenuItem に設定します。

    これにより、 [ウィンドウ] メニューで開いている MDI 子ウィンドウと、アクティブな子ウィンドウの横にチェック マークが付いている一覧が維持されます。

  11. F5 キーを押してアプリケーションを実行します。 [ファイル] メニューから [新規] を選択して、 [ウィンドウ] メニュー項目で追跡される新しい MDI 子フォームを作成できます。

    注意

    MDI 子フォームが (通常はメニュー項目のメニュー構造を持つ) MainMenu コンポーネントを持っていて、(通常はメニュー項目のメニュー構造を持つ) 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 子フォームを強制的に閉じることができます。

関連項目