扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
.Net Frame Work SDK为Visual Basic .Net实现个性化菜单提供了许多工具。其中最重要是二个事件及其参数:DrawItem事件和其中的DrawItemEventArgs参数,MeasureItem事件和其中的MeasureItemEventArgs参数。
1. DrawItem事件和其中的DrawItemEventArgs参数:
DrawItem事件是当菜单项的OwnerDraw属性设置为True并且发出绘制菜单项的请求时才发生。个性化菜单制作的处理方法就是在此事件中完成的。在DrawItem事件处理程序中将接收一个 DrawItemEventArgs类型的参数,它包含与此事件相关的数据,这些数据对绘制菜单是很重要的。表01是DrawItemEventArgs类型参数提供特定于此事件的信息。
属性 说明
BackColor 获取所绘制的项的背景色。
Bounds 获取表示所绘制项的边界的矩形。
Font 获取分配给所绘制项的字体。
ForeColor 获取所绘制项的前景色。
Graphics 获取要在其上绘制项的图形表面。
Index 获取所绘制项的索引值。
State 获取所绘制项的状态。
表01:DrawItemEventArgs类型参数提供DrawItem事件特定的信息
2. MeasureItem事件和其中的MeasureItemEventArgs参数:
触发MeasureItem事件必须将菜单项的OwnerDraw属性设置为True,个性化菜单制作可通过此事件来获取、设定菜单项的大小等。MeasureItem事件处理程序中接收一个MeasureItemEventArgs类型的参数,此参数对获取、设定菜单项的大小是非常重要的。表02是MeasureItemEventArgs类型参数提供MeasureItem事件的特定信息。
属性 说明
Graphics 获取要测量的Graphics对象。
Index 获取、设置需要有高度和宽度的项索引。
ItemHeight 获取、设置由Index指定的项高度。
ItemWidth 获取、设置由Index指定的项
表02是MeasureItemEventArgs类型参数提供MeasureItem事件的特定信息
二.本文介绍程序的设计、调试、运行的软件环境:
(1).微软公司视窗2000服务器版
(2).Visual Studio .Net正式版,.Net Framework SDK版本号3705
三.循序渐进绘制自己的菜单:
为了加深理解,我们用菜单编辑器设计一个简单的菜单,然后在此基础上加上个性化定制,重新绘制个性化的菜单。以下步骤就是利用Visual Studio的菜单编辑器制作一个简单的菜单:
1. 启动Visual Studio .Net。
2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。
3. 将【项目类型】设置为【Visual Basic项目】。
4. 将【模板】设置为【Windows应用程序】。
5. 在【名称】文本框中输入【Visual Basic .Net编程之DIY--自己画菜单】。
6. 在【位置】的文本框中输入【E:\VS.net项目】,然后单击【确定】按钮,这样在"E:\VS.NET项目"目录中就产生了名称为"Visual Basic .Net编程之DIY--自己画菜单"的文件夹,并在里面创建了名称为"Visual Basic .Net编程之DIY--自己画菜单"的项目文件。
7. 把Visual Studio .Net的当前窗口切换到【Form1.vb(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往Form1窗体中拖入下列组件:一个MainMenu组件,名称为"MainMenu1"。
8. 选中"MainMenu1"组件,单击鼠标右键,在弹出的菜单中选择"编辑菜单"。并按照图01所示界面设计菜单:
9. 此时保存上述步骤,并单击快捷键F5,则得到图02所示界面:
把Visual Stuido .net的当前窗口切换到Form1.VB的代码编辑窗口,并在InitializeComponent过程之后添加下列代码,下列代码是绘制"文件"菜单项,其作用是改变"文件"菜单项的字体、大小和菜单项的,其具体的绘制方法请参考下列代码中的注释:
Private Sub MenuItem1_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem1.DrawItem
Dim rfBound As RectangleF = New RectangleF ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height )
'根据DrawItemEventArgs参数获得菜单项矩形区域并存储到RectangleF类型实例中
Dim rfBound1 As Rectangle = New Rectangle ( e.Bounds.X , e.Bounds.Y , e.Bounds.Width - 1 , e.Bounds.Height )
'根据DrawItemEventArgs参数获得菜单项矩形区域并存储到Rectangle类型实例中
'Rectangle类型实例和RectangleF类型实例差不多,但在后面代码中绘制菜单的函数是有区别的
e.Graphics.FillRectangle(New SolidBrush(Color.LightGreen), rfBound)
'以LightGreen色彩填充MenuItem1菜单项对应的矩形区域
Dim s As MenuItem = CType ( sender , MenuItem )
Dim s1 As String = s.Text
'获得MenuItem1菜单项的名称
Dim sfTemp As StringFormat = New StringFormat ( )
sfTemp.Alignment = StringAlignment.Center
'设定要画的菜单名称的对齐方式,中间对齐
e.Graphics.DrawString ( s1 , New Font ( "宋体" , 10 , 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 ( s1 , New Font ( "宋体" , 10 , FontStyle.Bold ) , New SolidBrush ( Color.Black ) , rfBound , sfTemp )
'对菜单项名称绘制
End If
e.DrawFocusRectangle ( )
'在 DrawItemEventArgs参数得到矩形范围内绘制聚焦框。
e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) , 1 ) , rfBound1 )
'对菜单项的矩形区域绘制矩形框
End Sub
操作完成后,保存修改。此时再单击快捷键F5运行程序,可得到如图03所示的界面:
可见绘制的"文件"菜单项并没有完全显示出来,并且后面的菜单项也没有显示。这是因为菜单项的显示区域并没有设定,而缺省的空间又不能完全显示造成的。设定菜单项的显示区域大小是通过MeasureItem事件来完成的。具体操作是在MenuItem1的DrawItem事件后添加下列代码,下列代码是是定义MenuItem1的MeasureItem事件,在此事件中设定菜单项的宽度(当然也可以设定高度等):
Private Sub MenuItem1_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem1.MeasureItem
e.ItemWidth = 60
'设定菜单项的宽度
End Sub
保存上述修改后,单击快捷键F5运行程序可得到图04所示界面:
可见"文件"菜单项就算绘制出来了,由于其他菜单项没有绘制处理,所以也未显示。其他菜单项的绘制方法和"文件"菜单项的绘制方法基本相似,以下是在上述完成的基础上,对其他菜单项进行绘制,从而得到图05所示菜单的具体实现步骤:
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者