手机分类
  导航: 电脑时代在线 · 程序设计 · C#语言 · C#界面与窗体
有问题吗?看 疑难解答 电脑术语

Windows Forms菜单设计详尽攻略

 
硬件盘点
手机推荐
 
『Windows Forms菜单设计详尽攻略』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2006-2-2 

  [前言:] C#不但继承了C++、Java等面向对象的强大功能特性,同时还是继承了VB、Delphi等编程语言的可视化快速开发功能,也称其为当前第一个完全面向组件的语言。虽然微软将把C#语言作为在WEB上开发一种主流工具来推广,但其在传统客户/服务器模式的程序设计中,特别是在微软.Net平台系统下,C#其强大,易用的特性将会成为Windows应用软件开发人员首选工具。

  而在Windows程序设计中,菜单作为用户与程序交互的首选工具,那么在.Net中C#又是如何快速的构造Windows Forms中的菜单呢?怎样才能掌握Windows Forms菜单的实质,在程序设计中做到得心应手,为所欲为的进行窗体菜单程序的开发呢?这篇文章将给您最全面的回答。

  一、Windows Forms菜单程序简介

  我们知道,在Windows程序中,菜单是一个必不可少的程序元素。通过使用菜单,可以把对程序的各种操作命令非常规范有效的表示给用户。一个Windows程序菜单一般包括一个主菜单(主菜单下面包含许多子菜单)及很多弹出式菜单。单击菜单项程序将执行相应的功能;另外在程序窗体的许多地方单击鼠标右键将会弹出一个针对性的快捷菜单(也可以称为弹出式菜单),单击将执行相应的功能,使得软件的应用变得更加简单,更加人性化。Microsoft视窗系统及其应用软件站稳桌面系统及软件的霸主地位,友好的菜单应用立下不小的功劳。

  与传统的Windows程序一样,Windows Forms程序中的菜单也包括一般的菜单及弹出菜单两种。一般的菜单主要是指窗体的主菜单及子菜单。菜单从属特性外观及主要功能又可分类:命令式菜单、选择菜单、链接菜单及分隔菜单等等。

  大家一定使用过快速开发(RAD)语言工具(如VB、Delphi等)设计过菜单程序。使用这些开发工具,你只需要把用鼠标把菜单控件拖放到窗体上,并通过简单的菜单外观及属性等设置即可完成非常友好的菜单程序开发。在.Net中,C#是支持快速开发的,因此,通过使用相应的开发工具(如Visual Studio .Net)也可以通过简单的鼠标拖放操作完成大部份的菜单程序设计。当然,由于C#的强大的功能,使用.Net提供的菜单类,你也可以通过记事本等纯文本编辑工具就能写出具有良好用户界面的菜单程序。

  但是只有在充分掌握Windows Forms菜单的实质以后,我们才能在程序设计中做到得心应手,为所欲为的进行窗体菜单程序的开发。

  二、菜单程序使用类及体系结构

  在.NET类库中,定义了一个非常庞大的基础类,以供用户在各种编程使用。在这些类中,有几个专为用户编写菜单程序所用的类,通过使用这几个类,你可以设计出自己想要的任何菜单。下面分别进行简单的介绍:

  2.1 Windows Forms菜单类体系结构

  .Net类库中,菜单类的定义体系结构如下:

  Object

   MarshalByRefObject

    Component

     Menu

      ContextMenu

      MainMenu

      MenuItem

  从上面结构中,我们可以看出,菜单程序设计主要用到三个从Menu类继承的类:ContextMenu、MainMenu与MenuItem,它们分别封装了对弹出式菜单、主菜单及菜单项的定义。

  另外,.Net类库还提供了一个Menu.MenuItemCollection集合类来方便对各菜单项的管理。其定义如下:

  public class Menu.MenuItemCollection:IList,ICollection,Ienumerable;

  2.2 System.Windows.Forms.Menu类

  该类是一个抽象类,其是各种类型菜单的基类,封装了一个Windows Forms菜单的大部份公共属性。

  在菜单应用程序设计中,我们不直接(也不能)使用该类,而是使用其派生类MainMenu、MenuItem、ContextMenu等进行菜单开发;但可以从该类派生出自己更具个性化的菜单。

  在该类中有定义了一个非常重要的属性:MenuItems,其表示该对象所包含的菜单项集合。

  2.3 System.Windows.Forms.MenuItem类

  该类封装了一个菜单项中的各种成员,所有的菜单项都是由MenuItem对象构成的。该类包含了对一个菜单项的详细定义,如菜单项目的各种属性、响应事件及方法等。MenuItem对象是各种菜单的基本元素,在后面我们将详细讲解菜单项的使用。

  2.4 System.Windows.Forms.MainMenu类

  作为一个窗体主菜单的容器,其实例产生一个窗体的主菜单对象。你可以直接通过该类的构造函数生成MainMenu对象。其构造函数有两种形式:

  MainMenu():不带任何参数,将生成一个不带菜单项的主菜单对象。

  MainMenu(MenuItem[] menus):带一个菜单项数据参数,将生成一个主菜单对象,并包括参数中拥有的菜单,作为菜单项。

  MainMenu的Menu类的基础上,添加了一个属性:RightToLeft,把属性设为RightToLeft.Yes可以使你的主菜单从窗体的右边排到左边(这种表示是一些国家的语言习惯)。

  MainMenu对象提供一个方法CloneMenu(),使得用户可以方便的复制主菜单对象。除此之外,还可以通过GetForm()方法查看当前主菜单所在的窗体。

  2.5 System.Windows.Forms.ContextMenu类

  该类封装了对弹出式菜单各种特性及功能的定义。使用该类,当你在一个控件上点击右键,或者是在窗体的任何一个区域点击右键,将可以弹出一个快捷菜单。

  生成一个弹出式菜单对象,可以使用该类有两个构造函数。其中ContextMenu()生成一个不含任何菜单项的弹出式菜单;ContextMenu(MenuItem[] menus)生成一个包括参数中所指定的菜单项的弹出式菜单。

  ContextMenu类在Menu的基础上增加了两个属性,其中一个是RightToLeft可以使菜单项从右到左对齐,另一个SourceControl属性返回一个Control值表示当前所显示弹出菜单对应的控件。

  在ContextMenu类中,通过Show()方法可以使程序主动显示弹出菜单。当弹出菜单弹出时将引发一个Popup事件,你可以在定义该事件的响应方法使弹出菜单显示前做一些操作;你也可以通过虚拟的OnPopup()方法引发弹出菜单的Popup事件。

  2.6 System.Windows.Forms.Menu.MenuItemCollection类

  表示系列菜单项(MenuItem)对象的集合,并提供管理集合中元素的各种方法。该类从Object中继承,并通过Ilist、Icollection等接口继承了.Net中关于集合的各种操作,其在.Net类库中说明如下:

  public class Menu.MenuItemCollection : IList,ICollection,IEnumerable
通过使用菜单项集合类,你可以使用集合的各种操作方法,从而非常方便的管理一系列的菜单项,如一个主菜单上的所有菜单项及一个主菜单下的所有子菜单等。

  同.Net中的所有集合对象一样,该类Count属性返回集合中的菜单项;还可以通过索引(Index)访问集合中的菜单项;你可以通过集合的Add()、AddRange()向集合中加入菜单项对象,也可以通过Remove()及RemoveAt()等方法删除集合中的元素等等。

  三、菜单项对象(MenuItem)

  3.1 简介

  前面介绍过,System.Windows.Forms.MenuItem类封装了对菜单项目的各种属性、响应事件及方法的定义,MenuItem对象是形成各种Windows Forms菜单的基本元素。因此,不管是那一种类型的菜单,其中都必须含有菜单项,这样对我们实际应用才有意义。

  在.Net类库中,所有类型的菜单项都是通过MenuItem类定义的,该类及其父类Menu定义了菜单项的各种成员。有了一个MenuItem对象后,就可以把它加入到任何类型的菜单中使用(如把其加入到MainMenu对象中形成主菜单、加入到ContextMenu对象中形成弹出式菜单而加入到一个MenuItem对象的MenuItems属性中形成一个下级菜单等)。

  3.2 生成MenuItem对象

  生成MenuItem (菜单项)对象,可以使用MenuItem类的构造函数。下面分别介绍的MenuItem支持五个常用构造函数:

  (1)、MenuItem():该构造函数不含任何参数,其创建一个空菜单项对象,你可以通过其属性设置菜单的外观及事件。如下面的代码:

MenuItem menuItem1 = new MenuItem();

menuItem1.Text = "&File";

  (2)、MenuItem(string text):该构造函数含有一个字符串作为参数,这样你将生成一个文本属性值为text的菜单项对象。如:

MenuItem menuItem1=new MenuItem(“File”);

  (3)、MenuItem(string text,EventHandler onClick):该构造函数将生成一个以字符串text作为文本属性的菜单项,并且为其Click事件添加一个响应方法。如:

MenuItem menuItem1 = new MenuItem("&New",new System.EventHandler(MenuItem1_Click));

  其中MenuItem1_Click()函数定义如下:

private void MenuItem1_Click(object sender, System.EventArgs e)
{
}

  (4)、MenuItem(string text,MenuItem[] items):构造函数将生成一个以字符串text文本的菜单项,同时将把第二个参数菜单项数组中的各项作为该菜单项的子菜单。如下面的代码将添加一个文本显示为Color且包含三个子菜单的菜单项:

MenuItem menu1=new MenuItem(“Red”);
MenuItem menu2=new MenuItem(“Blue”);
MenuItem menu3=new MenuItem(“Black”);
MenuItem menuItem1 = new MenuItem("&Colors",new MenuItem[]{menu1,menu2,menu3});

  (5)、MenuItem(string text,EventHandler onClick,Shortcut shortcut):该构造函数包含三个参数,其中一个文本框,一个EventHandler代表及一个快捷访问键。该构造函数将生成一个文本为Text,快捷键为shortcut的菜单项,并且为该菜单项的Click事件添加一个响应方法。如下面代码将生成一个菜单项文本显示为New,Click事件响应方法为MenuItem1_Click(),访问快捷键为Alt+N及Ctrl+L的菜单项:

MenuItem MenuItem1 = new MenuItem("&New",new System.EventHandler(MenuItem1_Click),Shortcut.CtrlL);

  3.3 使用MenuItem对象属性

  在.Net Windows Forms中,所有类型的菜单项目都是MenuItem对象。那么如何表现丰富多彩的菜单外观呢?在这里,MenuItem类为我们提供了所有这方面的属性,以供你有实际项目中应用。通过这些属性,你可以定义选择菜单、命令菜单、菜单分隔符及菜单了下级菜单等。这些属性设置一般都是非常简单的,你只要选择你的菜单项是否是属于某一类型的菜单(true or false)即可。如下面的代码使菜单项menuItem1的前面有一个“√”:

menuItem1.Checked=true;

  下面简单介绍MenuItem中比较有用的属性:

  (1)、BarBreak属性

   如果其值为True,表示当前菜单项将换到下一栏显示,并有一条分隔线。

  (2)、Break属性

   如果其值为True,表示当前菜单项将换到下一栏显示,没有分隔线。

  (3)、Checked属性

   其表示当前的菜单项是否被选中。如果一个菜单项被选取中,菜单的前面将有一个“√”。

  (4)、DefaultItem属性

  该属性如果为真表示当前菜单项是一个默认菜单,并用粗体显示。一个菜单如果是默认菜单,则当你双击该菜单项属的主菜单时,该菜单将被选中。

  (5)、Enabled属性

   用于设置当前菜单项是否可用,当Enalbed为true时,菜单项可用,否则将显示成为恢色的形式且你不可以点击。

  (6)、Index属性

   该属性其返回一个int型数据表示该菜单所在主菜单中的序号。

  (7)、IsParent属性

   该属性返回当前菜单是否包含有子菜单,如果有则返回true。

  (8)、MenuID属性

   返回当前菜单项的ID值。

  (9)、Parent属性

   该属性返回一个Menu类数据表示当前菜单的父菜单。注意:Menu类是所有菜单位类的基类。

  (10)、Shortcut属性

   该属性用于访问及设置菜单项的快捷键。

  (11)、ShowShortcut属性

   布尔类型,用于访问及设置是否要在当前菜单中显示快捷键,果为true则显示,系统默认值为true。

  (12)、Text属性

   表示菜单项的显示文本。如果在显示文本中加一个”&”字符表示其后的键为菜单项的快捷访问键,此时“&”后面的字符将显示成下划线的形式。如:“&File”表示使用Alt+F快捷访问菜单。而文本为“-”时,表示此菜单项项为一条横线,这一特性经常用于菜单显示外观设计中用到。

  (13)、Visible属性

   布尔类型,表示菜单项是否可见,如该值设为false将隐藏菜单。系统默认值为true。

  3.4 示例程序

  下面我们用Visual Studio .Net专门写了一个演示MenuItem (菜单项)对像丰富外观特性的程序,其中关键的代码及注释如下:

private void button1_Click(object sender, System.EventArgs e)

{

MenuItem menu1=new MenuItem("弹出菜单一");//生成一个菜单项

MenuItem menu2=new MenuItem("弹出菜单二");

MenuItem menu3=new MenuItem("-");//菜单分隔线

MenuItem menu4=new MenuItem("弹出菜单三");

MenuItem menu5=new MenuItem("弹出菜单四");

menu1.Checked=true;//在菜单前面打一√

menu2.BarBreak=true;//断开并分栏

menu2.Enabled=false;//此菜单项不可用,呈恢色显示

menu4.Shortcut=Shortcut.Alt1;//给菜单定义一个快捷访问键

menu4.ShowShortcut=true;//在菜单上显示快捷键

file://把前面的菜单作为菜单项添加成为当前窗体的子菜单

this.ContextMenu=new ContextMenu(new MenuItem[]{menu1,menu2,menu3,menu4,menu5});//为当前窗体添加弹出式菜单

}

  程序运行将有一个主菜单,主菜单的各项属性有所不同。通过点击“添加弹出菜单”按钮可以为窗体添加弹出菜单,此时在窗体上点右键可以查看我们所添加的弹出菜单各项效果。如下图所示:



  四、为窗体添加菜单

  4.1 添加主菜单

  在.NET的System.Windows.Forms.Form(窗体)类中,有一个类型为MainMenu的属Menu,你只需要把一个MainMenu对象赋值给窗体的Menu属性即可以为窗体添加主菜单。

  当使有MainMenu()构造生成主菜单对象时,主菜单对象中没有任何菜单,你可以直接通过主菜单对象(MainMenu)的MenuItems集合来管理(添加或者删除)菜单项,然后该对象直接赋给窗体的Menu属性即可在窗体上看到主菜单。如下面的语句为当前窗体添加有一个菜单项“File”的主菜单:

MainMenu Menu1=new MainMenu();

Menu1.MenuItems.Add(new MenuItem(“File”));

this.Menu=Menu1;

  当使用MainMenu(MenuItem[])构造函数生成主菜单对象时,主菜单对象将包含由参数菜单项对象中指定的一系列子菜单。如下面的代码为当前窗体添加有两个菜单项(“File”及“Edit”)的主菜单:

MainMenu Menu1=new MainMenu(new MenuItem[]{new MenuItem(“File”),new MenuItem(“Edit”)});

this.Menu=Menu1;

  访问一个窗体的主菜单有两种方法:

  首先,可以通过一个主菜单(MainMenu)对象的MenuItems集合进行。通过MenuItems集合的索引,可以定位到一个具体的菜单项。然后你可以给菜单项添加事件响应方法或是改变菜单项的一些属性等操作。例如,下面我们把主菜单对象mainMenu1赋以窗体后,你可以通过下面语句访问主菜单第一项的文本属性值:

mainMenu1.MenuItems[0].Text=“Files”;

  其次,你也可以通过窗体(Form)的Menu属性对主菜单的项进行操作。Form类的Menu属性返回的是一个MainMenu对象,由于对象是引类型数据,因此两种操作的实质上都是指向同一个对象的。如上面表示第一项主菜单项文本的语句也可以如下表示:

this.Menu.MenuItems[0].Text=“Files”;

[1] [2] 下一页  


如果您有什么疑问,可以至论坛提出或者解答他人的疑问   返回页面顶部

】【关闭窗口
·上一篇教程:
·下一篇教程: 没有了
·导航: 电脑时代在线 · 程序设计 · C#语言 · C#界面与窗体
相关文章
 
搞笑自拍|图片故事|美女图库|体坛宝贝|明星爆料|世界奇观|风光摄影|历史回忆|大千世界
Photshop超炫图片
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部  
网站文本地图
  版权所有:电脑时代在线 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2007 www.PCvz.com online services. all rights reserved. 蜀ICP备05015578
Template designed by LaoJiang. Optimized for 1024x768 to Firefox,Opera and MS-IE. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光