はじめに
備忘録です。久々に MDI を触ったので、書き残しておきます。
環境
- Visual Studio 2022
- .NET Framework 4.8.1
MDI とは
1 つの親フォームの中に、複数の子フォームを開いて管理する UI 方式です。古い Office ソフトなどで使用されていました。
制御処理
それでは、よく実装する子フォームの制御処理を列挙していきます。
1. フォームを重複生成しない画面表示
private void ShowForm<T>() where T : Form, new()
{
var existing = _mainForm.MdiChildren.OfType<T>().FirstOrDefault();
if (existing != null)
{
// 既に表示済の場合、アクティブ化する
existing.WindowState = FormWindowState.Normal;
existing.Activate();
return;
}
// 生成
var form = new T { MdiParent = _mainForm };
form.Show();
}
2. すべて最小化
private void MinimizeAll()
{
foreach (var child in _mainForm.MdiChildren)
{
child.WindowState = FormWindowState.Minimized;
}
}
3. すべて元に戻す
private void RestoreAll()
{
foreach (var child in _mainForm.MdiChildren)
{
child.WindowState = FormWindowState.Normal;
}
}
4. すべて閉じる
private void CloseAll()
{
foreach (var child in _mainForm.MdiChildren.ToArray())
{
child.Close();
}
}
5. 左にドッキング
private void DockLeft()
{
// スクロールバーが表示されるのを防ぐため、オフセット値で少し余白を空ける
int offsetHeight = 54;
var active = _mainForm.ActiveMdiChild;
if (active is null)
{
return;
}
active.WindowState = FormWindowState.Normal;
var client = _mainForm.ClientSize;
active.Bounds = new Rectangle(
0,
0,
active.Width,
client.Height - offsetHeight
);
}
6. 右にドッキング
private void DockRight()
{
// スクロールバーが表示されるのを防ぐため、オフセット値で少し余白を空ける
int offsetX = 6;
int offsetHeight = 54;
var active = _mainForm.ActiveMdiChild;
if (active is null)
{
return;
}
active.WindowState = FormWindowState.Normal;
var client = _mainForm.ClientSize;
active.Bounds = new Rectangle(
client.Width - active.Width - offsetX,
0,
active.Width,
client.Height - offsetHeight
);
}
おわりに
MDI もいつのまにか見なくなりましたね。
