|
<p ><ccid_nobr>菜单是软件界面设计的一个重要组成方面。它描述着一个软件的大致功能和风格。所以在程序设计中处理好、设计好菜单,对于一个软件开发是否成功有着比较重要的意义。<br/>Visual C#是.Net框架中的一个重要组成部分,也是微软公司推出的下一代主流程序开发语言。它在设计、开发程序界面的时候和以前的某些程序开发语言有所不同。这一点也表现在其的菜单编程方面。本文就是来探讨一下如何用Visual C#进行菜单编程。<br/>面向菜单编程中遇到的主要的问题大致可以分为二种:添加菜单项、删除菜单项。当然在处理以上二类问题时候,还会遇到诸如:如何添加菜单项所对应的事件,如何为菜单项添加快捷键等一些小的问题。下面就这些问题来具体进行论述。<br/><br/><b>一. 程序设计和运行环境:</b><br/>(1)微软视窗2000服务器版本<br/>(2).Net FrameWork SDK Beta 2<br/><br/><b>二. 程序的主要功能:</b><br/>在本程序中,已经定义了二个主菜单项。程序的主要功能是通过"添加菜单"按钮在第二个主菜单项下(即"运行菜单项目"下)加入一个子菜单。通过"删除菜单"按钮删除第二个主菜单项中的最后一个子菜单。下图01是"添加菜单"按钮按动三次后的界面,图02是在"添加按钮"按动三次后,在按动"删除菜单"按钮后的程序运行界面:<br/><div align="center"><img src="http://www.hh010.com/upload_files/article/244/9_q4jjjw9906.gif"><br/>图01:"添加菜单"按钮按动三次后的界面</div><br/><br/><div align="center"><img src="http://www.hh010.com/upload_files/article/244/9_sf80ti9907.gif"><br/>图02:在"添加按钮"按动三次后,在按动"删除菜单"按钮后的界面</div><br/><b>三. 菜单设计中遇到的主要问题及解决办法:</b><br/>(1)如何动态加入一个菜单项目:<br/>在.Net FrameWork SDK中有一个叫做System.Windows.Forms.dll文件,其中定义了一个名为System.Windows.Froms的名称空间,此名称空间中封装了很多和界面设计相关的类、对象。Visual C#在进行菜单编程的时候就需要用到在此名称空间中定义的二个对象:MainMenu、MenuItem。用过Delphi的程序员都知道在在Delphi中,也有MainMenu这个对象,MainMenu在程序设计中表现为菜单项的容器,而MenuItem就是要往这个容器中添加的内容。所以在一个窗体中这种容器往往只需要一个,即需要一个MainMenu,但却往往要多个MenuItem,即需要多个菜单项。通过以下二个例子来具体说明如何进行菜单加入操作:<br/>例01:只是在窗体中加入一个主菜单项目:<br/><table width="580" border="1" cellspacing="0" cellpadding="0" bordercolorlight="black" bordercolordark="#ffffff"><tr><td bgcolor="e6e6e6" class="code">using System.Windows.Forms ;<br/>class RuntimeMenus : Form<br/>{<br/>private MainMenu myMenu ;<br/>private MenuItem mnuFile ;<br/>public RuntimeMenus ( )<br/>{<br/>//初始化 Main Menus<br/>myMenu = new MainMenu ( ) ;<br/>mnuFile = new MenuItem ( "文件" ) ;<br/>x = new MenuItem ( "文件" ) ;<br/>//往 Main Menu里面加入菜单<br/>myMenu.MenuItems.Add ( mnuFile ) ;<br/>this.Menu = myMenu ;<br/>}<br/>public static void Main ( )<br/>{<br/>Application.Run ( new RuntimeMenus ( ) ) ;<br/>}<br/>}</td></tr></table><br/> 成功程序编译后运行界面如下:<br/><div align="center"><img src="http://www.hh010.com/upload_files/article/244/9_jp0d3w9908.gif"></div><br/><table width="580" border="1" cellspacing="0" cellpadding="0" bordercolorlight="black" bordercolordark="#ffffff"><tr><td bgcolor="e6e6e6" class="code">using System ;<br/>using System.Windows.Forms ;<br/>class RuntimeMenus : Form<br/>{<br/>private MainMenu myMenu ;<br/>private MenuItem mnuFile,mnuExit ;<br/>public RuntimeMenus ( )<br/>{<br/>//初始化 Main Menus<br/>myMenu = new MainMenu ( ) ;<br/>mnuFile = new MenuItem ( "文件" ) ;<br/>//设定子菜单的响应事件和快捷键<br/>mnuExit = new MenuItem ( "退出" , new EventHandler ( btnClose_Click ) , Shortcut.CtrlX ) ;<br/>//往 Main Menu里面加入菜单<br/>myMenu.MenuItems.Add ( mnuFile ) ;<br/>mnuFile.MenuItems.Add ( mnuExit ) ;<br/>this.Menu = myMenu ;<br/>}<br/>protected void btnClose_Click ( object sender , EventArgs e )<br/>{<br/>Application.Exit ( ) ;<br/>}<br/><br/>public static void Main ( )<br/>{<br/>Application.Run ( new RuntimeMenus ( ) ) ;<br/>}<br/>}</td></tr></table><br/>成功编译此例子后,运行就可以得到如下界面:<br/><div align="center"><img src="http://www.hh010.com/upload_files/article/244/9_0bhbjw9909.gif"><br/>图04:加入子菜单并设定快捷键和响应事件</div><br/>通过以上二个小例子,我们就可以基本掌握如何正确添加主菜单和子菜单,并为之设定快捷键和响应事件。<br/>(2)如何动态删除菜单:<br/>删除菜单比起添加一个菜单要来的相对容易了许多。在删除的时候,主要用到的是MenuItem对象的RemoveAt方法,此方法说带的参数是一个整型,是一个子菜单在主菜单中由上到下的相对位置,譬如以下语言:<br/><table width="580" border="1" cellspacing="0" cellpadding="0" bordercolorlight="black" bordercolordark="#ffffff"><tr><td bgcolor="e6e6e6" class="code">mnuRtime.MenuItems.RemoveAt ( 2 ) ;</td></tr></table><br/>意思是在mnuRtime主菜单中删除由上到下的第三个子菜单。(由上至下第一个对应的指是"0")。<br/><br/><b>四. 程序源代码(menu.cs):</b><br/><table width="580" border="1" cellspacing="0" cellpadding="0" bordercolorlight="black" bordercolordark="#ffffff"><tr><td bgcolor="e6e6e6" class="code">using System ;<br/>using System.Windows.Forms ;<br/>using System.Drawing ;<br/>using System.ComponentModel ;<br/>class RuntimeMenus : Form<br/>{<br/>private MainMenu myMenu ;<br/>private MenuItem mnuFile , mnuExit , mnuRtime ;<br/>private Button btnAdd , btnRemove , btnClose ;<br/>static int i ;<br/>public RuntimeMenus ( )<br/>{<br/>InitializeComponents ( ) ;<br/>}<br/><br/>public void InitializeComponents ( )<br/>{<br/>//初始化 Main Menus<br/>myMenu = new MainMenu ( ) ;<br/>mnuFile = new MenuItem ( "文件" ) ;<br/>mnuRtime = new MenuItem ( "运行菜单项目" ) ;<br/><br/>//往 Main Menu里面加入菜单<br/>myMenu.MenuItems.Add ( mnuFile ) ;<br/>myMenu.MenuItems.Add ( mnuRtime ) ;<br/><br/>//初始化 Exit 菜单项,设定了事件和快捷键<br/>mnuExit = new MenuItem ( "退出" , new EventHandler ( btnClose_Click ) , Shortcut.CtrlX ) ;<br/>//把菜单项加入到文件File菜单中<br/>mnuFile.MenuItems.Add ( mnuExit ) ;</p><p>//初始化添加按钮<br/>btnAdd = new Button ( ) ;<br/>btnAdd.Location = new Point ( 275 , 20 ) ;<br/>btnAdd.Text = "添加菜单" ;<br/>btnAdd.Click += new EventHandler ( btnAdd_Click ) ;<br/>btnAdd.Size = new Size ( 100 , 30 ) ;</p><p>//初始化删除按钮<br/>btnRemove = new Button ( ) ;<br/>btnRemove.Location = new Point ( 275 , 60 ) ;<br/>btnRemove.Text = "删除菜单" ;<br/>btnRemove.Click += new EventHandler ( btnRemove_Click ) ;<br/>btnRemove.Size = new Size ( 100 , 30 ) ;</p><p>//初始化关闭按钮<br/>btnClose = new Button ( ) ;<br/>btnClose.Location = new Point ( 275 , 100 ) ;<br/>btnClose.Text = "退出" ;<br/>btnClose.Click += new EventHandler ( btnClose_Click ) ;<br/>btnClose.Size = new Size ( 100 , 30 ) ;<br/><br/>//在窗体中加入按钮<br/>this.Controls.Add ( btnAdd ) ;<br/>this.Controls.Add ( btnRemove ) ;<br/>this.Controls.Add ( btnClose ) ;</p><p>//设置窗体的属性<br/>this.MaximizeBox = false ;<br/>this.MinimizeBox = false ;<br/>this.Text = "动态处理菜单程序窗口!" ;<br/>// 设定本窗体的MainMenu<br/>this.Menu = myMenu ;<br/>this.Size = new Size ( 400 , 250 ) ;<br/>this.CancelButton = btnClose ;<br/>this.StartPosition = FormStartPosition.CenterScreen ;<br/><br/>}</p><p>//以下是动态加入菜单项<br/>protected void btnAdd_Click ( object sender , EventArgs e )<br/>{<br/>mnuRtime.MenuItems.Add ( "运行菜单 " + ( i + 1 ) , new EventHandler ( mnuRtime_Click ) ) ;<br/>i++ ;<br/>}<br/><br/>//以下是动态删除菜单项<br/>protected void btnRemove_Click ( object sender , EventArgs e )<br/>{<br/>mnuRtime.MenuItems.RemoveAt ( i - 1 ) ;<br/>i = i - 1 ;<br/>}</p><p>protected void mnuRtime_Click ( object sender , EventArgs e )<br/>{<br/>String s = sender.ToString ( ) ;<br/>MessageBox.Show ( "你选择的是 " + s.Substring ( 28 ) , "菜单选择窗口!" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br/>}</p><p>//退出应用程序<br/>protected void btnClose_Click ( object sender , EventArgs e )<br/>{<br/>Application.Exit ( ) ;<br/>}</p><p>public static void Main ( )<br/>{<br/>Application.Run ( new RuntimeMenus ( ) ) ;<br/>}<br/>}</td></tr></table><br/>按照以下语句编译完menu.cs:<br/><table width="580" border="1" cellspacing="0" cellpadding="0" bordercolorlight="black" bordercolordark="#ffffff"><tr><td bgcolor="e6e6e6" class="code">csc /t:winexe /r:system.dll /r:system.windows.forms.dll /r:system.drawing.dll menu.cs</td></tr></table><br/>就可以得到menu.exe ,执行此文件就可以得到图01和图02所示的运行界面了。<br/><br/><b>五. 总结:</b><br/>本文主要是介绍了在用Visual C#进行有关菜单编程中,可能遇到有些问题。在解决这些问题的时候主要用到的是名称空间System.Windows.Forms中定义的二个对象MainMenu、MenuItem和这二个对象中定义的一些方法。当然这些方法还有一些其他的用法,有兴趣的读者可以参考有关书籍和浏览MSDN网站。<br/><br/>(责任编辑 <ccid_nobr>尤北</ccid_nobr>)<p ></ccid_nobr><p align="center"></p></p> |
|