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#で本番のような開発手法もとれそうです。

コメント