首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 笔记本电脑 | 北大青鸟 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> VB.NET >> 正文

Visual Basic .Net打造个性化菜单

 


  这样通过菜单编辑器就完成了一个非常普通的菜单,下面就对此菜单进行改造,在改造之前,要先设定项目中的三个MenuItem类实例的OwnerDraw属性值为"True"。因为只有此属性值为"True"才会触发绘制菜单时所需要的DrawItem事件和MeasureItem事件。之后再在上面项目的基础上执行下一步操作:

  把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所示的界面:

 



图03:【Visual Basic .Net编程之DIY--自己画菜单】运行界面之二


  可见绘制的"文件"菜单项并没有完全显示出来,并且后面的菜单项也没有显示。这是因为菜单项的显示区域并没有设定,而缺省的空间又不能完全显示造成的。设定菜单项的显示区域大小是通过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所示界面:

 



图04:【Visual Basic .Net编程之DIY--自己画菜单】运行界面之三


  可见"文件"菜单项就算绘制出来了,由于其他菜单项没有绘制处理,所以也未显示。其他菜单项的绘制方法和"文件"菜单项的绘制方法基本相似,以下是在上述完成的基础上,对其他菜单项进行绘制,从而得到图05所示菜单的具体实现步骤:


图05:【Visual Basic .Net编程之DIY--自己画菜单】运行界面之四

上一页  [1] [2] [3] 下一页

【责编:Kittoy】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·算法分析与设计之五大常用算法
 ·开发必备 漫谈Java加密保护
 ·嵌入式开发--ARM技术专题
 ·C/C++指针,认真了解,灵活运用
 ·.NET开发:C#实用基础教程
 ·软件测试工具QTP学习专题
 ·嵌入式开发单片机解决方案专题
 ·Java开发环境 Greenfoot 程序员手册
 ·C++对象布局及多态实现的探索
 ·常见排序算法的实现
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航