知识大全 Visual Basic .Net打造个性化菜单
Posted 菜单
篇首语:智慧并不产生于学历,而是来自对于知识的终生不懈的追求。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Visual Basic .Net打造个性化菜单相关的知识,希望对你有一定的参考价值。
Visual Basic .Net打造个性化菜单 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
菜单(Menu)是程序界面的重要架构部件 自从有了可视化编程工具 使用其中的菜单编辑器就可以方便 快捷的编辑 设计菜单 但要想制作出个性化的菜单 哪怕对菜单项的任何改变 如 改变菜单的字体类型 大小等 只使用菜单编辑器是无法完成了 可视化编程工具Visual 也是如此 本文的主要内容就是介绍利用Visual Basic Net手工绘制个性化菜单的实现方法 一.简介 Net Frame Work SDK 为在VB Net绘制菜单提供的工具
Net Frame Work SDK为Visual Basic Net实现个性化菜单提供了许多工具 其中最重要是二个事件及其参数 DrawItem事件和其中的DrawItemEventArgs参数 MeasureItem事件和其中的MeasureItemEventArgs参数
DrawItem事件和其中的DrawItemEventArgs参数
DrawItem事件是当菜单项的OwnerDraw属性设置为True并且发出绘制菜单项的请求时才发生 个性化菜单制作的处理方法就是在此事件中完成的 在DrawItem事件处理程序中将接收一个 DrawItemEventArgs类型的参数 它包含与此事件相关的数据 这些数据对绘制菜单是很重要的 表 是DrawItemEventArgs类型参数提供特定于此事件的信息
属性 说明 BackColor 获取所绘制的项的背景色 Bounds 获取表示所绘制项的边界的矩形 Font 获取分配给所绘制项的字体 ForeColor 获取所绘制项的前景色 Graphics 获取要在其上绘制项的图形表面 Index 获取所绘制项的索引值 State 获取所绘制项的状态
表 DrawItemEventArgs类型参数提供DrawItem事件特定的信息 MeasureItem事件和其中的MeasureItemEventArgs参数
触发MeasureItem事件必须将菜单项的OwnerDraw属性设置为True 个性化菜单制作可通过此事件来获取 设定菜单项的大小等 MeasureItem事件处理程序中接收一个MeasureItemEventArgs类型的参数 此参数对获取 设定菜单项的大小是非常重要的 表 是MeasureItemEventArgs类型参数提供MeasureItem事件的特定信息
属性 说明 Graphics 获取要测量的Graphics对象 Index 获取 设置需要有高度和宽度的项索引 ItemHeight 获取 设置由Index指定的项高度 ItemWidth 获取 设置由Index指定的项
表 是MeasureItemEventArgs类型参数提供MeasureItem事件的特定信息 二.本文介绍程序的设计 调试 运行的软件环境
( ) 微软公司视窗 服务器版
( ) Visual Studio Net正式版 Net Framework SDK版本号
三.循序渐进绘制自己的菜单
为了加深理解 我们用菜单编辑器设计一个简单的菜单 然后在此基础上加上个性化定制 重新绘制个性化的菜单 以下步骤就是利用Visual Studio的菜单编辑器制作一个简单的菜单
启动Visual Studio Net
选择菜单【文件】|【新建】|【项目】后 弹出【新建项目】对话框
将【项目类型】设置为【Visual Basic项目】
将【模板】设置为【Windows应用程序】
在【名称】文本框中输入【Visual Basic Net编程之DIY 自己画菜单】
在【位置】的文本框中输入【E:\\项目】 然后单击【确定】按钮 这样在 E:\\VS NET项目 目录中就产生了名称为 Visual Basic Net编程之DIY 自己画菜单 的文件夹 并在里面创建了名称为 Visual Basic Net编程之DIY 自己画菜单 的项目文件
把Visual Studio Net的当前窗口切换到【Form vb(设计)】窗口 并从【工具箱】中的【Windows窗体组件】选项卡中往Form 窗体中拖入下列组件 一个MainMenu组件 名称为 MainMenu
选中 MainMenu 组件 单击鼠标右键 在弹出的菜单中选择 编辑菜单 并按照图 所示界面设计菜单
图 【Visual Basic Net编程之DIY 自己画菜单】项目设计界面之一此时保存上述步骤 并单击快捷键F 则得到图 所示界面
图 【Visual Basic Net编程之DIY 自己画菜单】运行界面之一这样通过菜单编辑器就完成了一个非常普通的菜单 下面就对此菜单进行改造 在改造之前 要先设定项目中的三个MenuItem类实例的OwnerDraw属性值为 True 因为只有此属性值为 True 才会触发绘制菜单时所需要的DrawItem事件和MeasureItem事件 之后再在上面项目的基础上执行下一步操作
把Visual 的当前窗口切换到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 运行程序 可得到如图 所示的界面
图 【Visual Basic Net编程之DIY 自己画菜单】运行界面之二
可见绘制的 文件 菜单项并没有完全显示出来 并且后面的菜单项也没有显示 这是因为菜单项的显示区域并没有设定 而缺省的空间又不能完全显示造成的 设定菜单项的显示区域大小是通过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 运行程序可得到图 所示界面
图 【Visual Basic Net编程之DIY 自己画菜单】运行界面之三
可见 文件 菜单项就算绘制出来了 由于其他菜单项没有绘制处理 所以也未显示 其他菜单项的绘制方法和 文件 菜单项的绘制方法基本相似 以下是在上述完成的基础上 对其他菜单项进行绘制 从而得到图 所示菜单的具体实现步骤
图 【Visual Basic Net编程之DIY 自己画菜单】运行界面之四
在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 ) Then e 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 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类型实例差不多 但在后面代码中绘制菜单的函数是有区别的 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 ( 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 运行
程序就可以得到图 所示的运行界面
四.总结
cha138/Article/program/net/201311/13385相关参考
VisualBasic.Net基本语句 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一Try…
VisualBasic.Net实现TCP协议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!TCP协
实战VisualBasic.Net对话框 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 对话框和
知识大全 使用Visual Basic.NET重载事件处理程序
使用VisualBasic.NET重载事件处理程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
VisualBasic.NET中组件的叠加使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 状
知识大全 使用 Visual Basic .NET 访问注册表
使用VisualBasic.NET访问注册表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!使用Vi
知识大全 一步一步创建Visual Basic .NET 控件
一步一步创建VisualBasic.NET控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!我从来
知识大全 Visual Basic.Net引人注目的语言革新
VisualBasic.Net引人注目的语言革新 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Visual Basic.NET和GDI+共创图标编辑器
VisualBasic.NET和GDI+共创图标编辑器 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
知识大全 在Visual Basic.NET使用ADO访问数据库
在VisualBasic.NET使用ADO访问数据库 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!