65.9K
CodeProject 正在变化。 阅读更多。
Home

玩转 MDI 客户端区域

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.95/5 (11投票s)

2008年7月31日

CPOL

1分钟阅读

viewsIcon

66905

如何修改客户端区域属性、居中控件以及进行其他有趣的技巧。

引言

当你将窗体指定为 MDI 容器时,.NET 框架会在你的窗体上停靠一个 MdiClient 控件。不幸的是,框架没有公开该控件的任何属性,这使得更改客户端区域背景颜色或居中控件变得困难。至少,乍一看是这样。

实现方法

MdiClient 控件就像任何其他控件一样,即使它由框架隐式管理。作为控件,可以在 FormControls 集合中找到它。以下是使用 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 放入客户端区域,然后在 FormResize 事件中使用以下代码

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 大小的能力将开启一些有趣的可能性。

© . All rights reserved.