C# - メニューをつくろう。MenuStripのサンプル　コードべた書き（Visual Studio不使用）

目次： [C# - Windows Formsでよく使うコントロールたち （Visual Studioなし環境向け） - Qiita](https://qiita.com/kob58im/items/a6cff48ce6bfbcf41c39)

# まえがき

`MenuStrip`を使うサンプルソースはサクッと見つかったけど、重なり防止の部分のケアが欲しかったので、メモ代わりに置いておきます。

# 画面キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/91576103-dfa8-2082-5d3d-14e00ca24f77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/e043f038-4924-c774-03e3-be1f1a02dbbc.png)


# ソースコード

```csharp

using System;
using System.Drawing;
using System.Windows.Forms;

class MenuStripSample:Form
{
    MenuStripSample()
    {
        ClientSize = new Size(500, 300);


        var menuStrip = new MenuStrip();
        
        SuspendLayout();
        menuStrip.SuspendLayout();


        var menuItemFile       = new ToolStripMenuItem(){ Text = "ファイル(&F)"};
        var menuItemFileExport = new ToolStripMenuItem(){ Text = "エクスポート"};
        var menuItemEdit       = new ToolStripMenuItem(){ Text = "編集(&E)"};
        menuStrip.Items.Add(menuItemFile);
        menuStrip.Items.Add(menuItemEdit);

        menuItemFile.DropDownItems.Add( new ToolStripMenuItem("開く(&O)...", null, (s,e)=>{MessageBox.Show("ひらく！");}, Keys.Control | Keys.O) );
        menuItemFile.DropDownItems.Add( new ToolStripSeparator() );
        menuItemFile.DropDownItems.Add( new ToolStripMenuItem("保存(&S)", null, (s,e)=>{MessageBox.Show("ほぞん！");}, Keys.Control | Keys.S) );
        menuItemFile.DropDownItems.Add( new ToolStripSeparator() );
        menuItemFile.DropDownItems.Add( menuItemFileExport );

        menuItemFileExport.DropDownItems.Add(new ToolStripMenuItem("bmpファイルとしてエクスポート", null, (s,e)=>{MessageBox.Show("えくすぽーと その1");}, null) );
        menuItemFileExport.DropDownItems.Add(new ToolStripMenuItem("pngファイルとしてエクスポート", null, (s,e)=>{MessageBox.Show("えくすぽーと その2");}, null) );

        menuItemEdit.DropDownItems.Add( new ToolStripMenuItem("ほげほげ", null, (s,e)=>{MessageBox.Show("ほげ");}, null) );
        menuItemEdit.DropDownItems.Add( new ToolStripMenuItem("Foo Bar",  null, (s,e)=>{MessageBox.Show("Foo");}, null) );


        ///////
        // メニュー以外を作成しているコード部分
        var panel = new Panel(){Dock = DockStyle.Fill};
        Controls.Add(panel);

        var btn1 = new Button(){Location = new Point(0,0), Size = new Size(100,30), Text = "ボタン1"};
        var btn2 = new Button(){Dock = DockStyle.Bottom,   Height = 30,             Text = "ボタン2"};
        btn1.Click += (s,e)=>{MessageBox.Show("ボタン1が押されました");};
        btn2.Click += (s,e)=>{MessageBox.Show("ボタン2が押されました");};
        panel.Controls.Add(btn1);
        panel.Controls.Add(btn2);
        //
        ///////

        Controls.Add(menuStrip);   // 注意：panel より先に登録してしまうと、panelとmenuStripが重なって表示されてしまう。
        MainMenuStrip = menuStrip;

        menuStrip.ResumeLayout(false);
        menuStrip.PerformLayout();
        ResumeLayout(false);
        PerformLayout();
    }

    [STAThread]
    static void Main()
    {
        Application.Run(new MenuStripSample());
    }
}
```


# 参考サイト

 - [フォームにメインメニューを付ける - .NET Tips (VB.NET,C#...)](https://dobon.net/vb/dotnet/control/menustrip.html#section12)
 - [コントロールのレイアウトを一時中断して、パフォーマンスを向上させる ／「ResumeLayout()」と「ResumeLayout(false) + PerformLayout」の違い - .NET Tips (VB.NET,C#...)](https://dobon.net/vb/dotnet/control/suspendlayout.html)
 - [ToolStripMenuItem Constructor (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.toolstripmenuitem.-ctor?view=netcore-3.1#System_Windows_Forms_ToolStripMenuItem__ctor_System_String_System_Drawing_Image_System_EventHandler_System_Windows_Forms_Keys_)
 - [ToolStrip／StatusStripコントロールがほかのコントロールに重なるのを解消するには？［C#、VB、VS 2005、VS 2008］ - ＠IT](https://www.atmarkit.co.jp/fdotnet/dotnettips/971toolstripadjust/toolstripadjust.html)