Windows Forms菜单程序(2)
在菜单编程中,我们需要点击菜单项使程序执行一个命令或者是改变菜单的状态等。这样才能使菜单与用户达到有好的交互。这就需要编写菜单事件的响应函数,使其执行相应的功能。
在Windows Forms中,MenuItem为我们提供了很多的事件,比如当你在菜单项上点击时引发的Click事件,在拖动菜单项时引发的DrawItem事件及当选择菜单项时引发的Select事件等。通过为这些事件编写响应方法,我们就可以使用菜单来控制程序了。
那么如何为一个事件添加响应方法呢?在C#中,增加了一个新的数据类型delegate(代表)来解决事件处理问题。代表数据类型非常类似于C语言中的指针,其与指针不同的是,其是代码是安全的,可管理的。通过使用delegate(代表),你可以通过“+=”(加等于)操作符非常容易地为.Net对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的“-=”(减等于)操作符取消这些响应方法。如下面为一个按钮(button1)Click事件添加响应方法的代码:
button1.Click+= new System.EventHandler(Test);
其中Test函数说明如下:
private void Test(object sender, System.EventArgs e)
{
file://想要执行的具体代码。
}
在上面对事件响应方法Test()的定义中,有两个参数,一个分别表示引发事件的对象(object)sender,由于引发事件的对象不可预知的,因此我们把其声明成为object类型,所有的对象都适用;另一个代表引发事件的具体信息(如引发事件时鼠标的x,y值等),由于各种类型的事件中可能不同,这要根据类中事件成员的说明决定。那么在编程中怎么知道使用哪种类型呢,这可以通过查看类中事件的声明,如上面对于Button类Click事件的定义(该定义直接从Control中继承):
public event EventHandler Click;
在上面声明事件的语句中,Eventhandler是一个delegate(代表)类型,其是如下定义的:
public delegate void EventHandler(object sender,EventArgs e);
与所有的.Net对象一样,要为一个菜单项添加Click事件的响应方法也可以通过类似的方法进行,如下所示:
this.Menu=new MainMenu(new MenuItem[]{new MenuItem(“File”),new MenuItem(“Edit”)});
this.Menu.MenuItems[0].Click+= new System.EventHandler(Test);
this.Menu.MenuItems[0].Click+= new System.EventHandler(menuItem2_Click);
private void Test(object sender, System.EventArgs e)
{
file://想要执行的具体代码。
}
private void MenuItem2_Click(object sender, System.EventArgs e)
{
MessageBox.Show("你点击了第二个菜单项","提示信息");//弹出一个对话框,显示提示信息。
}
这样,当你点击菜单项时,程序可以执行相应的功能。而要为一个菜单项(如menuItem1)添加DrawItem(拖动)事件响应方法,则可以通过下面的语句实现:
menuItem1.DrawItem+=new System.Windows.Forms.DrawItemEventHandler(MyMethod);//menuItem1为MenuItem对象
private void MyMethod(object sender,DrawItemEventArgs e)//注意函数的弟二个参数
{
MessageBox.Show("DrawItem事件引发了","提示信息");//弹出一个对话框,显示提示信息。
}
前面我们讲了菜单项是构成各种菜单的基本元素,由于我们添加事件响应方法是直接通过访问菜单项进行的,因此为菜单添加事件响应方法与主菜单或弹出式菜单无关。
六、综合实例
最后,我们使用Visual Studio .Net开发了一个涉及到菜单操作各方面的实例程序,该程序演示了如何通过C#代码在Windows Forms窗体中添加主菜单、如何为窗体添加弹出式菜单、为菜单项添加事件响应方法及管理各菜单项并存取其属性值等。
下面列出其中部份关键的代码及注释:
private void InitializeComponent()//自定义窗体类初始化函数,Visual Studio ..Net自动产生
{
//这里只列出了部份代码
this.button4.Text = "删除弹出菜单";
this.button4.Click += new System.EventHandler(this.button4_Click);
this.button1.Text = "添加主菜单";
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button2.Text = "添加弹出菜单";
this.button2.Click += new System.EventHandler(this.button2_Click);
this.button3.Click += new System.EventHandler(this.button3_Click);
}
private void button1_Click(object sender, System.EventArgs e)////当用户点击按钮button1(添加主菜单)时执行该方法
{
MenuItem menuItem1=new MenuItem();
MenuItem menuItem2=new MenuItem();
MenuItem menuItem3=new MenuItem();
MenuItem menuItem4=new MenuItem();
MainMenu mainMenu1=new MainMenu();
// 设置菜单项的显示文本.
menuItem1.Text = "Edit";
menuItem2.Text = "Font Size";
menuItem3.Text = "Small";
// 设置菜单项的Checked属性为true
menuItem3.Checked = true;
// 为菜单定义一个快捷访问键.
menuItem3.Shortcut = Shortcut.CtrlS;
// 设置菜单项文本
menuItem4.Text = "Large";
// 为菜单定义一个快捷访问键.
menuItem4.Shortcut = Shortcut.CtrlL;
// Set the index of the menu item so it is placed below the first submenu item.
menuItem4.Index = 1;
// 把菜单menuItem3及menuItem3加到menuItme2的子菜单中.
menuItem2.MenuItems.Add(menuItem3);
menuItem2.MenuItems.Add(menuItem4);
// 把菜单menuItem2加为菜单一的子菜单
menuItem1.MenuItems.Add(menuItem2);
// 为窗体添加主菜单
mainMenu1.MenuItems.Add(new MenuItem("File"));
mainMenu1.MenuItems.Add(menuItem1);
mainMenu1.MenuItems.Add(new MenuItem("View"));
mainMenu1.MenuItems.Add(new MenuItem("Tools"));
mainMenu1.MenuItems.Add(new MenuItem("Windows"));
this.Menu=mainMenu1;
file://为部份菜单项添加Click事件响应方法
this.Menu.MenuItems[0].Click+=new System.EventHandler(this.Test);
menuItem3.Click+=new System.EventHandler(this.Test);
this.Menu.MenuItems[2].Click+=new System.EventHandler(this.Test);
}
private void button2_Click(object sender, System.EventArgs e)//当用户点击按钮button2(添加弹出菜单)时执行该方法
{
file://为当前窗体添加弹出式菜单
this.ContextMenu=new ContextMenu(new MenuItem[]{new MenuItem("PopMenu1"),new MenuItem("PopMenu2"),new MenuItem("PopMenu3"),new MenuItem("PopMenu4")});
file://设置弹出菜单第一项的Click事件响应方法为Test()
this.ContextMenu.MenuItems[0].Click+=new System.EventHandler(this.Test);
}
private void button3_Click(object sender, System.EventArgs e)//当用户点击按钮button3(删除主菜单)时执行该方法
{
try
{
MenuItem temp=new MenuItem();
file://把窗体主菜单的最后一项赋给temp对象,注意对象是引用类型
temp=this.Menu.MenuItems[this.Menu.MenuItems.Count-1];
file://显示删除的提示信息
MessageBox.Show("将要删除了菜单:"+temp.Text,"提示信息!");
file://删除主菜单
this.Menu.MenuItems.Remove(temp);
}
catch
{
MessageBox.Show("操作无效,可能是已经没有菜单供您删除!","提示信息");
}
}
private void button4_Click(object sender, System.EventArgs e)//当用户点击按钮button4(删除弹出菜单)时执行该方法
{
try
{
MenuItem temp=new MenuItem();
file://取得当前窗体弹出菜单的最后一项的引用
temp=this.ContextMenu.MenuItems[this.ContextMenu.MenuItems.Count-1];
file://显示提示信息
MessageBox.Show("将要删除了菜单:"+temp.Text,"提示信息!");
// 删除最弹出菜单的最后一项
this.ContextMenu.MenuItems.Remove(temp);
}
catch
{
MessageBox.Show("操作无效,可能是已经没有菜单供您删除!","提示信息");
}
}
private void Test(object sender,System.EventArgs e)
{
file://当执行时弹出提示信息显示框,注意此句中对sender对象的强制类型转换
MessageBox.Show("你通过菜单:"+((MenuItem)sender).Text+"执行本程序!","提示信息");
}
执行该程序将为显示一个没有任何菜单的窗体,你可以通过按钮为窗体添加主菜单及弹出式菜单,还可以通过按钮逐个删除菜单项,点击部份菜单项还会看到其Click事件响应方法的运行的提示信息等。如下图所示:
总结:
通过学习我们知道,.Net为我们提供了一系列关于菜单程序设计的类,通过这些类你可以构建基本上所有的菜单应用程序。
在.Net中,主菜单及弹出式菜单分别是由MainMenu及ContextMenu类定义;所有的菜单都是由菜单项(MenuItem类)构成,也就是说不管是哪一种类型的菜单,其基本的元素都是MenuItem对象。
除了部分类(如集合类)以外,在Windows Forms中,大部分菜单相关的类都是由Menu类继承而来,在Menu中提供了一个MenuItems的菜单项目集合,通过其可以达到非常方便的管理一个菜单系列中的菜单项(如添加、删除等),还可以构建一个菜单项的下级子菜单等。
与.Net中的其它所有对象一样,要控制菜单执行相应的程序,需要为菜单对象添加事件的响应方法。
【相关文章:】
没有相关文章
【发表评论】【打印此文】【关闭窗口】【点击数: 】
