玩转 MDI 客户端区域






3.95/5 (11投票s)
如何修改客户端区域属性、居中控件以及进行其他有趣的技巧。
引言
当你将窗体指定为 MDI 容器时,.NET 框架会在你的窗体上停靠一个 MdiClient
控件。不幸的是,框架没有公开该控件的任何属性,这使得更改客户端区域背景颜色或居中控件变得困难。至少,乍一看是这样。
实现方法
MdiClient
控件就像任何其他控件一样,即使它由框架隐式管理。作为控件,可以在 Form
的 Controls
集合中找到它。以下是使用 VB 获取它的方法
Public Class Form1
Private ClientControl As MdiClient
Public Sub New()
InitializeComponent()
ClientControl = Nothing
For Each Ctl As Control In Me.Controls
ClientControl = TryCast(Ctl, MdiClient)
If ClientControl IsNot Nothing Then Exit For
Next
End Sub
End Class
这是 C# 版本
public partial class Form1 : Form
{
private MdiClient ClientControl;
public Form1()
{
InitializeComponent();
ClientControl = null;
foreach (Control Ctl in this.Controls)
{
ClientControl = Ctl as MdiClient;
if (ClientControl != null) break;
}
}
}
一旦你验证了 ClientControl
不是 Nothing
(或 null
),你就可以像对待任何其他控件一样对待它。也许,你的应用程序可以指向一个生产数据库和一个仅用于测试的数据库?更改 BackColor
属性以显示这一点。你希望一个徽标在 MDI 窗体调整大小时保持居中吗?将一个 PictureBox
放入客户端区域,然后在 Form
的 Resize
事件中使用以下代码
PictureBox1.Left = (ClientControl.Width \ 2) - (PictureBox1.Width \ 2)
PictureBox1.Top = (ClientControl.Height \ 2) - (PictureBox1.Height \ 2)
C#
PictureBox1.Left = (int)((ClientControl.Width / 2) - (PictureBox1.Width / 2));
PictureBox1.Top= (int)((ClientControl.Height/ 2) - (PictureBox1.Height/ 2));
探索途径
当你将 IsMdiContainer
设置为 true 时,框架所做的不仅仅是在窗体上添加一个 MdiControl。如果你尝试类似以下操作,可以清楚地看到这一点
If ClientControl IsNot Nothing Then
ClientControl.Dock = DockStyle.Right
ClientControl.Width = Me.ClientRectangle.Width \ 2
End If
C#
if (ClientControl != null)
{
ClientControl.Dock = DockStyle.Right;
ClientControl.Width = (int) (this.ClientRectangle.Width / 2)
}
暴露的窗体部分设置为 SystemColors.AppWorkspace
,无论你为 ClientControl
和窗体的 BackColor
赋予什么颜色。我还没有弄清楚如何将其更改为与窗体背景匹配,但当我做到时,动态调整 MdiClient
大小的能力将开启一些有趣的可能性。