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

完全可定制的菜单栏、工具栏、上下文菜单栏和状态栏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (19投票s)

2010年3月3日

CPOL

4分钟阅读

viewsIcon

59258

downloadIcon

3374

更改设计时用于渲染菜单栏、工具栏、上下文菜单栏和状态栏控件的颜色。

imgRed.jpg

引言

正如您可能知道也可能不知道的,MenuStripToolStripContextMenuStripStatusStrip 控件(以下简称“Strips”或“Strip 控件”)在很大程度上是可定制的。它们使用 ToolStrip(Professional)Renderer 类来渲染自身,并且可以继承该类并重写其绘制行为。当然,这需要付出一些努力,因为您基本上是在手动编写绘制代码。

如果您只想更改任何 Strip 控件的*颜色*,但保留所有元素的形状(例如矩形按钮等),那么有一个更快的方法。ToolStripProfessionalRenderer 的构造函数接受一个 ProfessionalColorTable,它就像 Strip 控件的主题。当提供 ProfessionalColorTable 时,ToolStripProfessionalRenderer 会使用 ProfessionalColorTable 中指定的颜色进行绘制。

虽然这是自定义 Strip 控件的一种更快的方法,但它仍然需要您编写代码(继承 ProfessionalColorTable 类并重写所有颜色属性,返回您自己的值)。这些控件的设计宗旨是让您可以在 Visual Studio 设计器中非常轻松地自定义任何 Strip 控件的颜色,而无需编写一行代码。

此外,您可以将更改的颜色保存在一个组件中,并供任意数量的 Strip 控件重复使用。因此,如果您需要 MenuStripToolStrip 看起来一样,您就不需要单独更改它们的颜色。您只需更改此组件的颜色,它们就会使用相同的颜色。

另外,您的自定义颜色定义可以保存到 XML 文件中,也可以从 XML 文件中加载,因此您甚至可以将它们分发给朋友或同事。

最后,有 6 种预设可用,您只需从列表中选择即可。颜色将被设置为模仿以下样式:

  • Office 2007 (蓝色)
  • Office 2003 蓝色(默认 Windows XP 风格,蓝色主题)
  • Office 2003 银色(默认 Windows XP 风格,银色主题)
  • Office 2003 橄榄绿(默认 Windows XP 风格,橄榄绿主题)
  • Office XP(默认 Windows Vista / Windows 7 风格)
  • Office Classic(经典主题的默认风格)

imgPresets.jpg

正如您所见,Windows XP 的三种默认样式也包含在内,因此您甚至可以在具有蓝色主题的 Windows XP 环境中使用银色主题。

背景

我将此项目作为我自己的一个项目。我认为 .NET Framework 提供了自定义 Strip 控件的功能,但却没有提供给普通用户(例如,以属性的形式)。我最初从一个简单的 MenuStrip 控件开始,它通过属性提供颜色,但由于属性太多,属性列表变得非常长且难以管理。当您希望 ToolStrip 看起来与 MenuStrip 一样时,您必须第二次设置颜色,这也是一个问题。或者,如果您需要更多的 Strip 控件,则需要设置更多次。总之:它仍然不实用。

有了这些控件,您只需一次性设置好颜色,通过简单的类别中的属性进行设置,然后就可以将该主题应用于任何您喜欢的 Strip 控件。

使用代码

您无需编写一行代码即可使用这些控件。所需的操作如下:

  • 构建包含这些文件的项目。
  • 将一个 AppearanceControl(构建后可在工具箱中找到)拖到您的窗体上。
  • 将一个或多个 Strip 控件(构建后可在工具箱中找到)拖到您的窗体上。
  • 将 Strip 控件的 Appearance 属性设置为窗体上的 AppearanceControl 组件(在属性网格中使用下拉列表)。
  • 探索 AppearanceControl 的属性。使用 Preset 属性设置预设主题,或使用 CustomAppearance 属性手动更改颜色。
  • 在弹出的外观编辑器窗口中,找到您需要的颜色属性并进行更改。在预览的 Strips 中即时查看结果。

imgEditor.jpg

注意:要使 Strips 使用 CustomAppearance 中定义的颜色,必须将 Preset 属性设置为 Custom

关注点

它是如何工作的?

AppearanceControl 组件在内部使用继承自 ProfessionalColorTable 的类的实例。它不是返回硬编码的值,而是返回 CustomAppearance 属性中设置的颜色。

Public Class CustomColorTable _
             Inherits ProfessionalColorTable

    Private ac As AppearanceControl = Nothing

    Public Sub New(ByVal appearanceControl As AppearanceControl)
        ac = appearanceControl
    End Sub

    Overrides ReadOnly Property ButtonSelectedHighlight() As Color
        Get
            Return ac.CustomAppearance.ButtonAppearance.SelectedAppearance.Highlight
        End Get
    End Property

    Overrides ReadOnly Property ButtonSelectedHighlightBorder() As Color
        Get
            Return ac.CustomAppearance.ButtonAppearance.SelectedAppearance.BorderHighlight
        End Get
    End Property

    '...
End Class

除了这个 CustomColorTable 类之外,每种预设都有一个 ColorTable,它*确实*使用硬编码的颜色值。

AppearanceControl 公开了一个 ToolStripProfessionalRenderer,其 ColorTable 设置为内部颜色表类之一。

最后,Strip 控件(CustomizableMenuStripCustomizableToolStripCustomizableContextMenuStripCustomizableStatusStrip)会监听其 AppearanceControl 的变化。当设置 Appearance 属性时,它们会将渲染器从默认渲染器更改为 AppearanceControl 公开的 Renderer 属性。

Protected Overridable Sub OnAppearanceControlChanged(ByVal e As EventArgs)
    If Me.Appearance IsNot Nothing Then
        AddHandler Me.Appearance.AppearanceChanged, _
                   AddressOf AppearanceControl_AppearanceChanged
        AddHandler Me.Appearance.Disposed, _
                   AddressOf AppearanceControl_Disposed
        Me.Renderer = Me.Appearance.Renderer
    Else
        Me.Renderer = New ToolStripProfessionalRenderer()
    End If
    Me.Invalidate()

    RaiseEvent AppearanceControlChanged(Me, e)
End Sub
© . All rights reserved.