Orchisみたいなメニュー型ランチャーで良く見るアレですね。
C#でももちろん再現可能です。
ありそうで地味にサンプルが転がってなかったので自作してみました。
公開中のランチャでも同じロジックを使用しています。
private void CreateContextMenuItem()
{
ToolStripMenuItem item = new ToolStripMenuItem();
item.Text = rootfolderName;
item.Name = rootfolderPath;
item.Click += ContextClick;
item.Image = FolderImage;
//ルートフォルダのパスが存在する場合のみ処理する
if (System.IO.Directory.Exists(rootfolderPath))
{
//引数のフォルダ直下のファイルを取得して引数のToolStripMenuItemに追加する関数
void getFile(string path, ToolStripMenuItem tmp_item)
{
IEnumerable<string> files = System.IO.Directory.EnumerateFiles(path);
foreach (var file in files)
{
ToolStripMenuItem item2 = new ToolStripMenuItem();
item2.Name = file;
item2.Text = System.IO.Path.GetFileName(file);
item2.Image = Icon.ExtractAssociatedIcon(file).ToBitmap();
item2.Click += ContextClick;
tmp_item.DropDownItems.Add(item2);
}
}
//ルートフォルダ直下のファイルをルートパスのToolStripMenuItemに追加する
getFile(rootfolderPath, item);
//引数のフォルダ直下に存在するフォルダーとgetFile関数でファイルを取得する。
//再帰関数にすることで、ルートフォルダ配下のすべてのフォルダーとファイルを取得する
void GetFolders(string path, ToolStripMenuItem tmp_item)
{
IEnumerable<string> subFolders = System.IO.Directory.EnumerateDirectories(path);
foreach (string subFolder in subFolders)
{
ToolStripMenuItem item2 = new ToolStripMenuItem();
item2.Name = subFolder;
item2.Text = System.IO.Path.GetFileName(subFolder);
item2.Image = FolderImage;
item2.Click += ContextClick;
getFile(subFolder, item2);
tmp_item.DropDownItems.Add(item2);
GetFolders(subFolder, item2);
}
}
GetFolders(rootfolderPath, item);
}
//作成したアイテムをコンテキストメニューに追加する
contextMenuStrip1.Items.Add(item)
}
//コンテキストメニューのアイテムをクリックしたときの処理
private void ContextClick(object? sender, EventArgs e)
{
ToolStripMenuItem t = (sender as ToolStripMenuItem);
var startInfo = new System.Diagnostics.ProcessStartInfo(t.Name);
startInfo.UseShellExecute = true;
System.Diagnostics.Process.Start(startInfo);
}
独習C# 第5版
Comments