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





5.00/5 (9投票s)
使用 VB.NET 创建具有 Microsoft Office 视觉风格的上下文菜单条

引言
为什么需要另一个 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 的引用添加到你的应用程序,然后拖放即可。

历史
MBContextMenuStrip
版本 1.0