C#でフォームにメニューバーを付けてみる

C# コンピュータ
C#

今回はC#でフォームにメニューバーを付けてみたいと思います。

ファイル名:MenuSumple.cs

using System;
using System.Windows.Forms;

class BaseForm {
    [STAThread]
    static void Main() {
        Form form = new Form1();
        
        Application.Run(form);
    }
}

ファイル名:Form1.cs

using System;
using System.Windows.Forms;
using System.Collections.Generic;

// メニューの階層をどう表現するか?

public class Form1 : Form {
    
    // コンストラクタ
    public Form1() {
        
        this.Load += Form1_Load;
    }
    
    
    // 開く項目の生成
    private ToolStripMenuItem CreateMenuItem_Open() {
        ToolStripMenuItem m = new ToolStripMenuItem();
        
        m.Name = "OPEN";
        m.Text = "開く";
        
        // クリックイベント
        m.Click += (sender, e) => {
            MessageBox.Show("メニューの開くがクリックされた。", "EVENT");
        };
        
        return m;
    }
    
    // 閉じる項目の生成
    private ToolStripMenuItem CreateMenuItem_Close() {
        ToolStripMenuItem m = new ToolStripMenuItem();
        
        m.Name = "CLOSE";
        m.Text = "閉じる";
        
        // クリックイベント
        m.Click += (sender, e) => {
            var menu_item = (ToolStripMenuItem)sender;
            var form = (Form)menu_item.OwnerItem.Owner.Parent;
            form.Close();
        };
        
        return m;
    }
    
    // 表示項目の生成
    private ToolStripMenuItem CreateMenuItem_View() {
        ToolStripMenuItem m = new ToolStripMenuItem();
        
        m.Name = "VIEW";
        m.Text = "表示";
        
        return m;
    }
    
    // ファイル項目の生成
    private ToolStripMenuItem CreateMenuItem_File() {
        ToolStripMenuItem m = new ToolStripMenuItem();
        
        m.Name = "FILE";
        m.Text = "ファイル";
        
        
        // ドロップダウンメニュー項目の追加
        var items = new List<ToolStripMenuItem>();
        
        items.Add(this.CreateMenuItem_Open());
        items.Add(this.CreateMenuItem_Close());
        
        m.DropDownItems.AddRange(items.ToArray());
        
        return m;
    }
    
    // メニューバーの生成
    private MenuStrip CreateMenuBar() {
        MenuStrip m = new MenuStrip();
        
        m.Name = "MENUBAR";
        
        
        // メニュー項目の追加
        var items = new List<ToolStripMenuItem>();
        
        items.Add(this.CreateMenuItem_File());
        items.Add(this.CreateMenuItem_View());
        
        m.Items.AddRange(items.ToArray());
        
        return m;
    }
    
    // Form1のLoadイベント
    private void Form1_Load(object sender, EventArgs e) {
        
        var controls = new List<Control>();
        
        // メニューバーの生成
        controls.Add(this.CreateMenuBar());
        
        
        // コントロールの追加
        this.Controls.AddRange(controls.ToArray());
    }
}

ファイル名:MenuSample.csproj

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>  
   <AssemblyName>MenuSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  </PropertyGroup>  
  <ItemGroup>
    <Compile Include="*.cs"/>
  </ItemGroup>
  <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" TargetType="winexe" OutputAssembly="$(OutputPath)$(AssemblyName).exe"/>
  </Target>
  <Target Name="Clean" >  
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
  <Target Name="Run" DependsOnTargets="Rebuild">
      <Exec Command="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>

実行

PS>msbuild /t:run

結果

メニューの「ファイル」→「閉じる」を選択するとフォームが閉じます。その他はダミーです。

以前Powershellで作っていたプログラムの移植ですので、あまりC#らしくないかもしれません。
.Netのライブラリを使う場合C#とPowersehllで同じ事が出来るということは、とりあえずPowershellで試作してC#で本番のような開発手法もとれそうです。

コメント