今回は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#で本番のような開発手法もとれそうです。
コメント