菜单是软件界面设计的一个重要组成方面 。它描述着一个软件的大致功能和风格。所以在程序设计中处理好、 设计好菜单,对于一个软件开发是否成功有着比较重要的意义。Visual C#是.Net框架中的一个重要组成部分,也 是微软公司推出的下一代主流程序开发语言。它在设计、开发程序界 面的时候和以前的某些程序开发语言有所不同。这一点也表现在其的 菜单编程方面。本文就是来探讨一下如何用Visual
C#进行菜单编程。
面向菜单编程中遇到的主要的问题大致 可以分为二种:添加菜单项、删除菜单项。当然在处理以上二类问题 时候,还会遇到诸如:如何添加菜单项所对应的事件,如何为菜单项 添加快捷键等一些小的问题。下面就这些问题来具体进行论述。一. 程序设计和运行环境:
(1)微软视窗2000 服务器版本
(2).Net FrameWork SDK Beta 2
二. 程序的主要功能:
在本程序 中,已经定义了二个主菜单项。程序的主要功能是通过"添加菜单" 按钮在第二个主菜单项下(即"运行菜单项目"下)加入一个子菜单 。通过"删除菜单"按钮删除第二个主菜单项中的最后一个子菜单。 下图01是"添加菜单"按钮按动三次后的界面,图02是在"添加 按钮"按动三次后,在按动"删除菜单"按钮后的程序运行界面:< br>
图01:"添加菜单"按钮按动三次后的界面< br>
图02:在"添加按钮"按动三次后,在按动" 删除菜单"按钮后的界面
三. 菜单设计中遇到的主要问题 及解决办法:
(1)如何动态加入一个菜单项目:
在.Net FrameWork SDK中有一个叫做Syste m.Windows.Forms.dll文件,其中定义了一个名 为System.Windows.Froms的名称空间,此名称 空间中封装了很多和界面设计相关的类、对象。Visual C# 在进行菜单编程的时候就需要用到在此名称空间中定义的二个对象: MainMenu、MenuItem。用过Delphi的程序员 都知道在在Delphi中,也有MainMenu这个对象,Ma inMenu在程序设计中表现为菜单项的容器,而MenuIte m就是要往这个容器中添加的内容。所以在一个窗体中这种容器往往 只需要一个,即需要一个MainMenu,但却往往要多个Men uItem,即需要多个菜单项。通过以下二个例子来具体说明如何 进行菜单加入操作:
例01:只是在窗体中加入一个主菜单 项目:
using System.Windows.Fo rms ;
class RuntimeMenus : Form {private MainMenu myMenu ;
priv ate MenuItem mnuFile ;
public R untimeMenus ( ){//初始化 Main Men usmyMenu = new MainMenu ( ) ;
m nuFile = new MenuItem ( "文件" ) ;
x = new MenuItem ( "文件" ) ;
/ /往 Main Menu里面加入菜单myMenu.MenuI tems.Add ( mnuFile ) ;
this.Men u = myMenu ;
}public static voi d Main ( ){Application.Run ( n ew RuntimeMenus ( ) ) ;
}}
成功程序编译后运行界面如下:
us ing System ;
using System.Windo ws.Forms ;
class RuntimeMenus : Form{private MainMenu myMenu ;
private MenuItem mnuFile,mnuE xit ;
public RuntimeMenus ( ){/ /初始化 Main MenusmyMenu = new Ma inMenu ( ) ;
mnuFile = new Menu Item ( "文件" ) ;
//设定子菜单的响应事件和快捷 键mnuExit = new MenuItem ( "退出" , new EventHandler ( btnClose _Click ) , Shortcut.CtrlX ) ;
/ /往 Main Menu里面加入菜单myMenu.MenuI tems.Add ( mnuFile ) ;
mnuFile. MenuItems.Add ( mnuExit ) ;
thi s.Menu = myMenu ;
}protected vo id btnClose_Click ( object sen der , EventArgs e ){Applicatio n.Exit ( ) ;
}public static voi d Main ( ){Application.Run ( n ew RuntimeMenus ( ) ) ;
}}
成 功编译此例子后,运行就可以得到如下界面:
图04:加入子菜单并设定快捷键和响应事件
通过以上二个 小例子,我们就可以基本掌握如何正确添加主菜单和子菜单,并为之 设定快捷键和响应事件。
(2)如何动态删除菜单:
删除菜单比起添加一个菜单要来的相对容易了许多。在删除的时候 ,主要用到的是MenuItem对象的RemoveAt方法,此 方法说带的参数是一个整型,是一个子菜单在主菜单中由上到下的相 对位置,譬如以下语言:
mnuRtime.MenuIt ems.RemoveAt ( 2 ) ;
意思是在mn uRtime主菜单中删除由上到下的第三个子菜单。(由上至下第 一个对应的指是"0")。
四. 程序源代码(menu. cs):
using System ;
using Sy stem.Windows.Forms ;
using Syst em.Drawing ;
using System.Compo nentModel ;
class RuntimeMenus : Form{private MainMenu myMenu ;
private MenuItem mnuFile , m nuExit , mnuRtime ;
private But ton btnAdd , btnRemove , btnCl ose ;
static int i ;
public Runt imeMenus ( ){InitializeCompone nts ( ) ;
}public void Initiali zeComponents ( ){//初始化 Main Me nusmyMenu = new MainMenu ( ) ;
mnuFile = new MenuItem ( "文件" ) ;
mnuRtime = new MenuItem ( " 运行菜单项目" ) ;
//往 Main Menu里面加入菜单 myMenu.MenuItems.Add ( mnuFile ) ;
myMenu.MenuItems.Add ( mnu Rtime ) ;
//初始化 Exit 菜单项,设定了事件和 快捷键mnuExit = new MenuItem ( "退 出" , new EventHandler ( btnClo se_Click ) , Shortcut.CtrlX ) ;
//把菜单项加入到文件File菜单中mnuFile.Men uItems.Add ( mnuExit ) ;
// 初始化添加按钮btnAdd = new Button ( ) ;
btnAdd.Location = new Point ( 275 , 20 ) ;
btnAdd.Text = "添 加菜单" ;
btnAdd.Click += new Even tHandler ( btnAdd_Click ) ;
btn Add.Size = new Size ( 100 , 30 ) ;
//初始化删除按钮btnRemove = n ew Button ( ) ;
btnRemove.Locat ion = new Point ( 275 , 60 ) ;
btnRemove.Text = "删除菜单" ;
btnRe move.Click += new EventHandler ( btnRemove_Click ) ;
btnRemov e.Size = new Size ( 100 , 30 ) ;
//初始化关闭按钮btnClose = new Button ( ) ;
btnClose.Location = new Point ( 275 , 100 ) ;
btn Close.Text = "退出" ;
btnClose.Cl ick += new EventHandler ( btnC lose_Click ) ;
btnClose.Size = new Size ( 100 , 30 ) ;
//在窗体中加 入按钮this.Controls.Add ( btnAdd ) ;
this.Controls.Add ( btnRemo ve ) ;
this.Controls.Add ( btnC lose ) ;
//设置窗体的属性this.Maxi mizeBox = false ;
this.Minimize Box = false ;
this.Text = "动态处理 菜单程序窗口!" ;
// 设定本窗体的MainMenuthi s.Menu = myMenu ;
this.Size = n ew Size ( 400 , 250 ) ;
this.Ca ncelButton = btnClose ;
this.St artPosition = FormStartPositio n.CenterScreen ;
}
//以下是动态加入 菜单项protected void btnAdd_Click ( object sender , EventArgs e ){mnuRtime.MenuItems.Add ( "运 行菜单 " + ( i + 1 ) , new EventH andler ( mnuRtime_Click ) ) ;
i ++ ;
}//以下是动态删除菜单项protected voi d btnRemove_Click ( object sen der , EventArgs e ){mnuRtime.M enuItems.RemoveAt ( i - 1 ) ;
i = i - 1 ;
}
protected void mnuRtime_Click ( object sender , EventArgs e ){String s = se nder.ToString ( ) ;
MessageBox. Show ( "你选择的是 " + s.Substring ( 28 ) , "菜单选择窗口!" , MessageBo xButtons.OK , MessageBoxIcon.I nformation ) ;
}
//退出应用程序pro tected void btnClose_Click ( o bject sender , EventArgs e ){A pplication.Exit ( ) ;
}
publ ic static void Main ( ){Applic ation.Run ( new RuntimeMenus ( ) ) ;
}}
按照以下语句编译完menu.cs:< br>csc /t:winexe /r:system.dll /r:system.windows.forms.dll / r:system.drawing.dll menu.cs就可以得到menu.exe ,执行此文件就可以得到图01 和图02所示的运行界面了。
五. 总结:
本文主 要是介绍了在用Visual C#进行有关菜单编程中,可能遇到 有些问题。在解决这些问题的时候主要用到的是名称空间Syste m.Windows.Forms中定义的二个对象MainMen u、MenuItem和这二个对象中定义的一些方法。当然这些方 法还有一些其他的用法,有兴趣的读者可以参考有关书籍和浏览MS DN网站。