使用 ToolStrip 轻松创建选项卡式 MDI 界面
只需将 MdiTabStrip 放在您的 Mdi 容器窗体上,您就拥有了一个选项卡式 Mdi 界面
下载源代码:这里

引言
我非常喜欢“它只有一个按钮,并且我们已经为您按下了它”类型的 UI 开发。 我希望这个控件遵循这个格言。 只需将其放在 Mdi 容器窗体上,它将跟踪所有打开的窗口,确保它们最大化,并显示活动窗口。
背景
我的客户一次打开很多窗口。 Windows 菜单(跟踪 Mdi 子活动)工作正常,但不够直观,并且远离操作位置。 我想要一个选项卡式 Mdi 界面,能够单击选项卡的一部分来关闭窗口,类似于 IE 7。
事实证明 ToolStrip 是一个非常适合专业化的类。 ToolStripSplitButton 是从我们的可关闭选项卡继承的理想按钮,因为我们所需要做的就是覆盖下拉区域并在此处放置一个关闭“x”,然后捕获一些事件。
使用代码
只需将 MdiTabStrip 控件放在您的 Mdi 容器窗体上(Mdi 容器窗体是“IsMdiContainer”属性设置为 true 的窗体)。
如果您想从 MdiTabStrip 继承,您可以创建自己的 MdiTabStripButton 实例。 只需覆盖此方法
/// <summary> /// Creates and returns a new MdiTabStripButton. You can override /// this method to return a derived version of MdiTabStripButton if /// you wish. /// </summary> /// <param name="f"></param> /// <returns></returns> protected virtual MdiTabStripButton CreateMdiButton(Form f) { // return new MyCustomMdiTabStripButton(f); return new MdiTabStripButton(f); }
然后您将从 MdiTabStripButton 继承,并且可以覆盖 OnPaint() 或 DoDrawBorder() 方法
/// <summary> /// Adds a gradient line to the top of the tab button. You can override /// this to do whatever you would like. /// </summary> /// <param name="g"></param> protected virtual void DoDrawBorder(Graphics g) { g.SmoothingMode = SmoothingMode.Default; using (Pen p = new Pen(BorderColor, 2F)) { p.Brush = new LinearGradientBrush( new Point(0, 0), new Point(Width / 2 + 2, 2), BackColor, BorderColor); g.DrawLine(p, 0, 1, Width / 2 + 2, 1); p.Brush = new LinearGradientBrush( new Point(Width / 2 - 2, 2), new Point(Width, 0), BorderColor, BackColor); g.DrawLine(p, Width / 2 - 2, 1, Width, 1); } }
您可以在 MdiTabStrip 上设置几个属性。 可以查看注释代码,也可以将一个控件放在窗体上并在属性浏览器中查看。
每个属性都有一个对应的静态 Default 属性,例如 ActiveForeColor 将具有一个静态 DefaultActiveForeColor 属性。 这是开发控件时要遵循的一个好的设计模式,以便开发人员可以更轻松地在一个地方自定义您的控件以适应他们的环境。
在 Cx.Windows.Forms 命名空间中有两个用于 Mdi 子窗体的 Form 类,您可以从中继承。 第一个类 MdiChildForm 只是确保它是添加到 Mdi 父窗体的 MdiChildren 集合中的第一个窗体时会最大化。 它还覆盖了 CreateParams,以便无法访问窗体上正常的关闭“x”(因为它现在将在选项卡上)。 不是绝对必要,但可能看起来更专业。
第二个窗体 NoResizeChildForm 删除了控制框,以便最小化和最大化按钮消失。 如果您想强制用户保持子窗口最大化,则适合使用此窗体。
历史
首次发布,2008 年 5 月 12 日