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

使用 VB.NET 创建具有 Microsoft Office 视觉风格的上下文菜单条

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2011年12月11日

CPOL

1分钟阅读

viewsIcon

31832

downloadIcon

2269

使用 VB.NET 创建具有 Microsoft Office 视觉风格的上下文菜单条

MBContextMenuStripDemo.gif

引言

为什么需要另一个 ContextMenuStrip? 标准的 ContextMenuStrip 功能过于有限,而且我没有找到一个满足我所有需求的自定义控件。这是一个具有 Microsoft Office 2007 视觉风格的用户控件。它使用起来很简单,只需将其拖放到窗体上,然后像使用普通的 ContextMenuStrip 一样使用它即可。

背景

MBContextMenuStrip 是一个 ContextMenuStrip ,它继承了简单 ContextMenuStrip 控件的所有属性。我在 MBContextMenuStrip 中添加了类似于 Microsoft Office 2007 的视觉效果。使用的语言是 VB.NET。有很多类提供相同的功能,但为此我们需要在应用程序中编写至少两行代码来添加渲染器类。MBContextMenuStrip 是一个已经包含 MBRenderer 类的 ContextMenuStrip 。你只需添加 MBContextMenuStrip.dll 的引用,然后通过拖放即可使用。

代码

这个 ContextMenuStrip 的概念来自 Microsoft Office 2007 的右键菜单。我将 MBContextMenuStrip 的方法组织成如下层级结构。

以下方法负责渲染类似于 Microsoft Office 的简单 ContextMenuStrip

此方法渲染 MBContextMenuStrip 项的背景。

Protected Overrides Sub OnRenderMenuItemBackground_
(ByVal e As System.Windows.Forms.ToolStripItemRenderEventArgs)
        If e.Item.Selected Then
            Dim g As Graphics = e.Graphics
            g.SmoothingMode = SmoothingMode.HighQuality
            Dim pa As GraphicsPath = New GraphicsPath()
            Dim rect As Rectangle = New Rectangle_
            (2, 1, e.Item.Size.Width - 2, e.Item.Size.Height - 1)
            DrawArc(rect, pa)
            Dim lgbrush As LinearGradientBrush = New LinearGradientBrush_
            (rect, Color.White, Color.White, LinearGradientMode.Vertical)
            Dim pos As Single() = New Single(3) {0.0F, 0.4F, 0.45F, 1.0F}
            Dim colors As Color() = New Color(3) {GetColor(0, 50, 100), _
            GetColor(0, 0, 30), Color.FromArgb(R0, G0, B0), GetColor(0, 50, 100)}
            Dim mix As ColorBlend = New ColorBlend()
            mix.Colors = colors
            mix.Positions = pos
            lgbrush.InterpolationColors = mix
            g.FillPath(lgbrush, pa)
            g.DrawPath(New Pen(StrokeColor), pa)
            lgbrush.Dispose()
        Else
            MyBase.OnRenderMenuItemBackground(e)
        End If
    End Sub

此方法渲染 MBContextMenuStrip 项的图像。

Protected Overrides Sub OnRenderItemImage_
(ByVal e As System.Windows.Forms.ToolStripItemImageRenderEventArgs)
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality
        If Not (e.Image Is Nothing) Then
            imageheight = e.Item.Height - offsety * 2
            imagewidth = _
		((Convert.ToDouble(imageheight) / e.Image.Height) * e.Image.Width)
        End If
        e.Graphics.DrawImage(e.Image, New Rectangle_
		(offsetx, offsety, imagewidth, imageheight))
    End Sub
This method Handles painting of MBContextMenuStrip:
Public Sub DrawArc(ByVal re As Rectangle, ByVal pa As GraphicsPath)
        Dim _radiusX0Y0 As Int32 = _radius, _radiusXFY0 As Int32 = _
        _radius, _radiusX0YF As Int32 = _radius, _radiusXFYF As Int32 = _radius
        pa.AddArc(re.X, re.Y, _radiusX0Y0, _radiusX0Y0, 180, 90)
        pa.AddArc(re.Width - _radiusXFY0, re.Y, _radiusXFY0, _radiusXFY0, 270, 90)
        pa.AddArc(re.Width - _radiusXFYF, _
	re.Height - _radiusXFYF, _radiusXFYF, _radiusXFYF, 0, 90)
        pa.AddArc(re.X, re.Height - _radiusX0YF, _radiusX0YF, _radiusX0YF, 90, 90)
        pa.CloseFigure()
    End Sub

Using the Code

在你的应用程序中使用 MBContextMenuStrip 非常简单。只需将提供的 DLL 的引用添加到你的应用程序,然后拖放即可。

MBContextMenuStripControl.gif

历史

  • MBContextMenuStrip 版本 1.0
© . All rights reserved.