十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
五.绘制个性化菜单
创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的前进网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
先执行以下操作步骤 下列步骤是通过菜单编辑器设计一个简单的菜单 为后面重新绘制做基础
启动Visual Studio Net
选择菜单【文件】|【新建】|【项目】后 弹出【新建项目】对话框
将【项目类型】设置为【Visual Basic项目】
将【模板】设置为【Windows应用程序】
在【名称】文本框中输入【自己画菜单】
在【位置】的文本框中输入【E:\VS NET项目】 然后单击【确定】按钮 这样在 E:\VS NET项目 目录中就产生了名称为 自己画菜单 的文件夹 并在里面创建了名称为 自己画菜单 的项目文件
把Visual Studio Net的当前窗口切换到【Form vb(设计)】窗口 并从【工具箱】中的【Windows窗体组件】选项卡中往Form 窗体中拖入下列组件
一个MainMenu组件 名称为 MainMenu
选中 MainMenu 组件 单击鼠标右键 在弹出的菜单中选择 编辑菜单 并按照图 所示界面设计菜单
图 【自己画菜单】项目设计界面之一
此时保存上述步骤 并单击快捷键F 则得到图 所示界面
图 【自己画菜单】运行界面之一
这样通过菜单编辑器就完成了一个非常普通的菜单 下面就对此菜单进行改造 在改造之前 要先设定项目中的三个MenuItem类实例的OwnerDraw属性值为 True 因为只有此属性值为 True 才会触发绘制菜单时所需要的DrawItem事件和MeasureItem事件 之后再在上面项目的基础上执行下一步操作
把Visual Stuido Net的当前窗口切换到Form vb的代码编辑窗口 并在InitializeComponent过程之后添加下列代码 下列代码是绘制 文件 菜单项 其作用是改变 文件 菜单项的字体 大小和菜单项的 其具体的绘制方法请参考下列代码中的注释
Private Sub MenuItem _DrawItem ( ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs ) Handles MenuItem DrawItem Dim rfBound As RectangleF = New RectangleF ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到RectangleF类型实例中 Dim rfBound As Rectangle = New Rectangle ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到Rectangle类型实例中 Rectangle类型实例和RectangleF类型实例差不多 但在后面代码中绘制菜单的函数是有区别的 e Graphics FillRectangle(New SolidBrush(Color LightGreen) rfBound) 以LightGreen色彩填充MenuItem 菜单项对应的矩形区域 Dim s As MenuItem = CType ( sender MenuItem ) Dim s As String = s Text 获得MenuItem 菜单项的名称 Dim sfTemp As StringFormat = New StringFormat ( ) sfTemp Alignment = StringAlignment Center 设定要画的菜单名称的对齐方式 中间对齐 e Graphics DrawString ( s New Font ( 宋体 FontStyle Bold ) New SolidBrush ( Color Black ) rfBound sfTemp ) 以中间对齐方式 指定字体 大小 在指定的矩形区域重画菜单 If e State = ( DrawItemState NoAccelerator Or DrawItemState Selected ) Then 根据菜单项的当前绘制状态来绘制菜单项 e Graphics FillRectangle ( New SolidBrush ( Color LightYellow ) rfBound ) 对菜单项所在的矩形区域进行色彩填充 e Graphics DrawString ( s New Font ( 宋体 FontStyle Bold ) New SolidBrush ( Color Black ) rfBound sfTemp ) 对菜单项名称绘制 End If e DrawFocusRectangle ( ) 在 DrawItemEventArgs参数得到矩形范围内绘制聚焦框 e Graphics DrawRectangle ( New Pen ( New SolidBrush ( Color Black ) ) rfBound ) 对菜单项的矩形区域绘制矩形框End Sub
操作完成后 保存修改 此时再单击快捷键F 运行程序 可得到如图 所示的界面
图 【自己画菜单】运行界面之二
可见绘制的 文件 菜单项并没有完全显示出来 并且后面的菜单项也没有显示 这是因为菜单项的显示区域并没有设定 而缺省的空间又不能完全显示造成的 设定菜单项的显示区域大小是通过MeasureItem事件来完成的 具体操作是在MenuItem 的DrawItem事件后添加下列代码 下列代码是是定义MenuItem 的MeasureItem事件 在此事件中设定菜单项的宽度(当然也可以设定高度等)
Private Sub MenuItem _MeasureItem ( ByVal sender As Object ByVal e As System Windows Forms MeasureItemEventArgs ) Handles MenuItem MeasureItem e ItemWidth = 设定菜单项的宽度End Sub
保存上述修改后 单击快捷键F 运行程序可得到图 所示界面
图 【自己画菜单】运行界面之三
可见 文件 菜单项就算绘制出来了 由于其他菜单项没有绘制处理 所以也未显示 其他菜单项的绘制方法和 文件 菜单项的绘制方法基本相似 以下是在上述完成的基础上 对其他菜单项进行绘制 从而得到图 所示菜单的具体实现步骤
图 【自己画菜单】运行界面之四
在Form vb中的MenuItem 的MeasureItem事件处理程序之后添加下列代码 下列代码是定义MenuItem 的DrawItem事件 其功能是对 新建 菜单项重新绘制
Private Sub MenuItem _DrawItem ( ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs ) Handles MenuItem DrawItem Dim rfBound As RectangleF = New RectangleF ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到RectangleF类型实例中 Dim rfBound As Rectangle = New Rectangle ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到Rectangle类型实例中 Rectangle类型实例和RectangleF类型实例差不多 但在后面代码中绘制菜单的函数是有区别的 e Graphics FillRectangle ( New SolidBrush ( Color LightGray ) rfBound ) Dim s As MenuItem = CType ( sender MenuItem ) Dim s As String = s Text 获得菜单项对应的文本名称 Dim sfTemp As StringFormat = New StringFormat ( ) sfTemp Alignment = StringAlignment Center 设定文本在矩形区域的对齐方式 sfTemp LineAlignment = StringAlignment Center Dim rcText As RectangleF = rfBound rcText Width = e Graphics DrawString ( s New Font ( 宋体 ) New SolidBrush ( Color Blue ) rcText sfTemp ) e Graphics DrawRectangle ( New Pen ( New SolidBrush ( Color LightGray ) ) rfBound ) If e State = ( DrawItemState NoAccelerator Or DrawItemState Selected ) Thene Graphics FillRectangle ( New SolidBrush ( Color LightYellow ) rfBound ) e Graphics DrawString ( s New Font ( 宋体 FontStyle Bold Or FontStyle Underline ) New SolidBrush ( Color Red ) rcText sfTemp ) e Graphics DrawRectangle ( New Pen ( New SolidBrush ( Color Black ) ) rfBound ) e DrawFocusRectangle ( ) End IfEnd Sub
MenuItem 的DrawItem事件处理代码之后添加下列代码 下列代码是定义MenuItem 的MeasureItem事件 在此事件中实现设定 新建 菜单项的长度和高度
Private Sub MenuItem _MeasureItem ( ByVal sender As Object ByVal e As System Windows Forms MeasureItemEventArgs ) Handles MenuItem MeasureItem e ItemWidth = 设定菜单项的宽度 e ItemHeight = 设定菜单项的高度End Sub
在完成上述操作步骤后 再在MenuItem 的MeasureItem事件处理程序之后添加下列代码 下列代码是定义MenuItem 的DrawItem事件 其功能是对 打开 菜单项重新绘制
Private Sub MenuItem _DrawItem ( ByVal sender As Object ByVal e As System Windows Forms DrawItemEventArgs ) Handles MenuItem DrawItemDim rfBound As RectangleF = New RectangleF ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到RectangleF类型实例中Dim rfBound As Rectangle = New Rectangle ( e Bounds X e Bounds Y e Bounds Width e Bounds Height ) 根据DrawItemEventArgs参数获得菜单项矩形区域并存储到Rectangle类型实例中 Rectangle类型实例和RectangleF类型实例差不多 但在后面代码中绘制菜单的函数是有区别的Dim s As MenuItem = CType ( sender MenuItem ) Dim s As String = s TextDim sfTemp As StringFormat = New StringFormat ( ) sfTemp Alignment = StringAlignment CentersfTemp LineAlignment = StringAlignment CenterDim rcText As RectangleF = rfBoundrcText Width = e Graphics DrawString ( s New Font ( Veranda ) New SolidBrush ( Color Blue ) rcText sfTemp ) e Graphics DrawRectangle ( New Pen ( New SolidBrush ( Color LightGray ) ) rfBound ) If e State = ( DrawItemState NoAccelerator Or DrawItemState Selected ) Then e Graphics FillRectangle ( New SolidBrush ( Color LightYellow ) rfBound ) e Graphics DrawString ( s New Font ( Veranda FontStyle Bold Or FontStyle Underline ) New SolidBrush ( Color Red ) rcText sfTemp ) e Graphics DrawRectangle ( New Pen ( New SolidBrush ( Color Black ) ) rfBound ) e DrawFocusRectangle ( ) End IfEnd Sub
MenuItem 的DrawItem事件处理代码之后添加下列代码 下列代码是定义MenuItem 的MeasureItem事件 在此事件中实现设定 新建 菜单项的长度和高度
Private Sub MenuItem _MeasureItem ( ByVal sender As Object ByVal e As System Windows Forms MeasureItemEventArgs ) Handles MenuItem MeasureItem e ItemWidth = 设定菜单项的宽度 e ItemHeight = 设定菜单项的高度End Sub
在上述步骤都正确完成后 本文介绍的手工绘制菜单就完成 此时单击快捷键F 运行 程序就可以得到图 所示的运行界面
六.总结
本文主要内容是介绍VB NET设计和创建菜单 其中不仅介绍了使用菜单设计器来静态设计菜单 还介绍了使用MainMenu类 MenuItem类和ContextMenu类动态创建菜单的实现方法 在动态创建时 首先要了解要创建的菜单类型 是下拉菜单 首先要创建一个MainMenu实例 是弹出菜单 首先要创建一个ContextMenu实例 然后根据菜单中的组成结构 即菜单项中的父子关系 创建出相应菜单 最后就是显示出菜单 如果是下拉菜单 指派给Form的Menu属性 如果是弹出菜单 指派给可视组件或Form的ContextMenu属性 这样动态创建菜单才能够显示出来 动态创建菜单的工作才算完成
此外还介绍了在Visual Basic Net中绘制个性化菜单的实现方法和注意事项 在绘制个性化菜单时最重要的是掌握DrawItem事件和MeasureItem事件用法 及绘制菜单时所要使用到的方法 虽然本文绘制的菜单并不美观 但你可以通过本文介绍的方法来修改 从而实现更美观 更有个性的菜单 最后请记住 在绘制菜单时 首先把菜单项的 OwnerDraw 属性设定为 True
lishixinzhi/Article/program/net/201311/15454
VB 6.0 :菜单编辑器的用法
做VB 项目时经常需要用菜单编辑器来创建自己需要的菜单,因此需要对其具体用法非常娴熟。下面把从网上下载过来的资料结合自己使用的体会整理出一份文档以供日后参考。
附加以下图片以帮助说明与理解。
图片:菜单编辑器的使用
在出现VB6.0窗体的情况下,在菜单中选“工具”,再在其下拉菜单下选“菜单编辑器”。然后按如下说明操作:
一. “菜单编辑器”对话框 。
使用菜单编辑器可以为应用程序创建自定义菜单并定义其属性。
二. 对话框选项。
1. “标题” :使用该选项可以输入菜单名或命令名,这些名字出现在菜单条或菜单之
中。 如果想在菜单中建立分隔符条,则应在Caption 框中键入一个连字符 (-)。为了能够通过键盘访问菜单项,可在一个字母前插入 符号。在运行时,该字母带有下划线( 符号是不可见的),按 ALT 键和该字母就可访问菜单或命令。如果要在菜单中显示 符号,则应在标题中连续输入两个 符号。
2. “名称” :用来为菜单项输入控件名。控件名是标识符,仅用于访问代码中的菜单项;它不会出现在菜单中。
3. “索引” :可指定一个数字值来确定控件在控件数组中的位置。该位置与控件的屏
幕位置无关。
4. “快捷键” :可在列表框中为每个命令选择快捷键。
5. “帮助上下文 ID” 。允许为 context ID 指定唯一数值。在 HelpFile 属性指定的帮助文件中用该数值查找适当的帮助主题。
6. “协调位置” :该列表框中共有四个可选项,他们决定是否及如何在容器窗体中显
示菜单。
7. “复选” :允许在菜单项的左边设置复选标记。通常用它来指出切换选项的开关状
态。
8. “有效” :由此选项可决定是否让菜单项对事件做出响应,而如果希望该项失效并
以浅灰色显示出来,则也可取消对该复选框的选用。
9. “可见”:决定是否将菜单项显示在菜单上。
10. “显示窗口列表” :在 MDI 应用程序中,确定菜单控件是否包含一个打开的 MDI
子窗体列表。
11. “右箭头” :每次单击都把选定的菜单向右移一个等级。一共可以创建四个子菜单
等级。
12. “左箭头” :每次单击都把选定的菜单向上移一个等级。一共可以创建四个子菜单
等级。
13. “上箭头” :每次单击都把选定的菜单项在同级菜单内向上移动一个位置。
14. “下箭头” :“下箭头” 。每次单击都把选定的菜单项在同级菜单内向下移动一个位置。
15. “菜单列表” :该列表框显示菜单项的分级列表。将子菜单项缩进以指出它们的分
级位置或等级。
16. “下一个” :将选定项移动到下一行,往往是为建立下一个菜单项准备。
17. “插入” :在列表框的当前选定行上方插入一行。
18. “删除” :删除当前选定行。
19. “确定” :关闭菜单编辑器,并对选定的最后一个窗体进行修改。菜单可以在设计
时使用,但在设计时可以通过选定一个菜单,来打开菜单单击事件的“代码”窗口,而不是执行事件代码。
20. “取消” :关闭菜单编辑器,取消所有修改。
2010-4-24 从网上下载并整理
你好,如果你在VB.NET中遇到菜单框显示不一致的问题,可以尝试以下解决方法:
1.检查菜单项的属性:打开菜单设计器,在属性面板中检查每个菜单项的属性,确保它们都设置为相同的值。
2.检查控件的样式:在控件属性中检查样式属性,如果设置了不同的样式可能会导致菜单框的显示不一致。
3.更新.NET框架版本:如果以上方法都不能解决问题,可能是因为使用的.NET框架版本太旧而导致。可以尝试更新.NET框架版本。
希望以上方法能够解决你的问题。你好,如果你在VB.NET中遇到菜单框显示不一致的问题,可以尝试以下解决方法:
1.检查菜单项的属性:打开菜单设计器,在属性面板中检查每个菜单项的属性,确保它们都设置为相同的值。
2.检查控件的样式:在控件属性中检查样式属性,如果设置了不同的样式可能会导致菜单框的显示不一致。
3.更新.NET框架版本:如果以上方法都不能解决问题,可能是因为使用的.NET框架版本太旧而导致。可以尝试更新.NET框架版本。
希望以上方法能够解决你的问题。