Vb教程 Vb.net教程 Vfp教程 C/C++教程 Vc/Vc++教程 Delphi教程 Java教程 Powerbuilder
  杀毒频道 | 短信频道 | 网络电视 | 论文中心 | 学上网 | 学软件 | 网页特效 | 电脑基础 | 论坛  
  NCRE | 软考 | CET | 职称英语 | 司法考试 | 报关员 | 公务员 | CATTI | CPA考试  
  Html教程 | Css教程 | Xml教程 | Asp教程 | Asp.net | Php教程 | Jsp教程 | Linux教程 | QQ技巧  
Photoshop Illustrator ImageReady Maya教程 3D Max教程 Lightscape Coredraw教程 Authorware Autocad教程 Freehand教程
Access教程 Mysql教程 Sql server Oracle教程 Word教程 Excel教程 Powerpoint Frontpage Asp.net源码 Php源代码
Flash教程 Fireworks Dreamweaver C#教程 outlook教程 系统安装 vbscript教程 Javascript Jsp源代码 Asp源代码
您的位置:首页 >> Vb.net教程 >> 正文

Visual Basic .Net打造个性化菜单

文章来源:天极

  菜单(Menu)是程序界面的重要架构部件,自从有了可视化编程工具,使用其中的菜单编辑器就可以方便、快捷的编辑、设计菜单。但要想制作出个性化的菜单,哪怕对菜单项的任何改变,如:改变菜单的字体类型、大小等,只使用菜单编辑器是无法完成了。可视化编程工具Visual Studio .net也是如此。本文的主要内容就是介绍利用Visual Basic .Net手工绘制个性化菜单的实现方法。
 
   一.简介.Net Frame Work SDK 为在VB.Net绘制菜单提供的工具:

  .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所示界面设计菜单:


图01:【Visual Basic .Net编程之DIY--自己画菜单】项目设计界面之一


   9. 此时保存上述步骤,并单击快捷键F5,则得到图02所示界面:


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


   这样通过菜单编辑器就完成了一个非常普通的菜单,下面就对此菜单进行改造,在改造之前,要先设定项目中的三个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. 在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事件的前提。本文实现的菜单虽不美观,但本文介绍的方法却是很实用的,在上述项目的基础上进行一定的修改,如再调用其他的绘制方法,一定可以完成一个更美观的菜单来。

[返回]

编程语言 web开发 数据库 网络技术 操作系统 服务器 网页设计 图形设计 办公软件 常用软件 学电脑

Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved.
关于本站 | 版权声明 | 联系我们 | 友情链接 |
编程入门网 版权所有