首页 | 互联网 | 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打造个性化菜单

 

  1. 在Form1.VB中的MenuItem1的MeasureItem事件处理程序之后添加下列代码,下列代码是定义MenuItem2的DrawItem事件,其功能是对"新建"菜单项重新绘制:

Private Sub MenuItem2_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem2.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.LightGray ) , rfBound )
 Dim s As MenuItem = CType ( sender , MenuItem )
 Dim s1 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 -= 5
 e.Graphics.DrawString ( s1 , New Font ( "宋体" , 10 ) , New SolidBrush ( Color.Blue ) , rcText , sfTemp )
 e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.LightGray ) ) , rfBound1 )
 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 Or FontStyle.Underline ) , New SolidBrush ( Color.Red ) , rcText , sfTemp )
  e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) ) , rfBound1 )
  e.DrawFocusRectangle ( )
 End If
End Sub

  2. MenuItem2的DrawItem事件处理代码之后添加下列代码,下列代码是定义MenuItem2的MeasureItem事件,在此事件中实现设定"新建"菜单项的长度和高度:

Private Sub MenuItem2_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem2.MeasureItem
 e.ItemWidth = 60
 '设定菜单项的宽度
 e.ItemHeight = 30
 '设定菜单项的高度
End Sub

  3. 在完成上述操作步骤后,再在MenuItem2的MeasureItem事件处理程序之后添加下列代码,下列代码是定义MenuItem3的DrawItem事件,其功能是对"打开"菜单项重新绘制:

Private Sub MenuItem3_DrawItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.DrawItemEventArgs ) Handles MenuItem3.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类型实例差不多,但在后面代码中绘制菜单的函数是有区别的
 Dim s As MenuItem = CType ( sender , MenuItem )
 Dim s1 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 -= 5
 e.Graphics.DrawString ( s1 , New Font ( "Veranda" , 10 ) , New SolidBrush ( Color.Blue ) , rcText , sfTemp )
 e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.LightGray ) ) , rfBound1 )
 If e.State = ( DrawItemState.NoAccelerator Or DrawItemState.Selected ) Then
  e.Graphics.FillRectangle ( New SolidBrush ( Color.LightYellow ) , rfBound )
  e.Graphics.DrawString ( s1 , New Font ( "Veranda" , 10 , FontStyle.Bold Or FontStyle.Underline ) , New SolidBrush ( Color.Red ) , rcText , sfTemp )
  e.Graphics.DrawRectangle ( New Pen ( New SolidBrush ( Color.Black ) ) , rfBound1 )
  e.DrawFocusRectangle ( )
 End If
End Sub

  4. MenuItem3的DrawItem事件处理代码之后添加下列代码,下列代码是定义MenuItem3的MeasureItem事件,在此事件中实现设定"新建"菜单项的长度和高度:

Private Sub MenuItem3_MeasureItem ( ByVal sender As Object , ByVal e As System.Windows.Forms.MeasureItemEventArgs ) Handles MenuItem3.MeasureItem
 e.ItemWidth = 60
 '设定菜单项的宽度
 e.ItemHeight = 30
 '设定菜单项的高度
End Sub

  在上述步骤都正确完成后,本文介绍的手工绘制菜单就完成,此时单击快捷键F5运行。

  程序就可以得到图05所示的运行界面。

  四.总结:

  Visual Basic .net中实现绘制菜单最重要的是掌握DrawItem事件和MeasureItem事件用法及其绘制菜单时所要使用到的各种图形图象方法,如:绘制名称,色彩填充等。当然在绘制菜单时,首先把菜单项的"OwnerDraw"属性设定为"True"。因为这是触发DrawItem事件和MeasureItem事件的前提。本文实现的菜单虽不美观,但本文介绍的方法却是很实用的,在上述项目的基础上进行一定的修改,如再调用其他的绘制方法,一定可以完成一个更美观的菜单来。


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

【责编:Kittoy】

中国IT教育

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

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
· VB.NET中的字符数据类型和其他数据类型
· vb.net 通过app.config来改变编译路径的问题
· .NET开发中正则表达式中BUG一例
· VB.NET编程中的字节校验例子
· 文件夹选项-消失了 注册表被禁用怎么办?
· Visual C# 编程操作Excel
· asp.net ajax 使用updatepanel更新后的提示
· C#线程池的实现
· 如何通过Web Services上传和下载文件
· ASP.NET跨页面传值技巧总结
 社区讨论
 博客论点
 频道精选
· 新版CCNA考试大纲 07年8月1日生效
· 新手学习宝典:Linux常用命令全集
· 知已知彼,深入了解系统安全知识
· 从入门到精通 java初学者实践系列教程
· 共同学习——Oracle入门基础专题
· ADO.net与PowerBuilder的综合比较
· 评论:中国互联网“钱”途何在?
· 中科院:龙芯要成"中国奔腾" 能卖1亿颗
 Dotnet频道相关导航
技术导航:
 C#
 ASP.NET
 VC.NET
 VB.NET
 XML&WebService
 .NET FRAMEWORK
产品导航
 存储
 新品导购 | 评测 | 存储交换 | 磁盘存储
 数据备份 | 网络存储 | 光存储
 服务器
 行情 | 新闻 | 产品导购 | 评测