- 精品下载 | 实用查询 | 词典查询 | 桌面壁纸 | 网址 | 笑话 | FLASH频道 | 天气文章资讯 | 站长工具 | 证件办理 | 闪字生成 | 广告代码 | 在线手册 | 有问必答
您现在的位置: 蓝派网 >> 文章中心 >> 网络编程 >> .NET >> WinForm >> 正文
站内文章搜索:           

Windows Forms菜单程序(2)

作者:佚名    文章来源:网络转载    更新时间 :2007-11-25 13:34:56
五、响应菜单事件

   在菜单编程中,我们需要点击菜单项使程序执行一个命令或者是改变菜单的状态等。这样才能使菜单与用户达到有好的交互。这就需要编写菜单事件的响应函数,使其执行相应的功能。

  在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中的其它所有对象一样,要控制菜单执行相应的程序,需要为菜单对象添加事件的响应方法。

 
【相关文章:】
没有相关文章

发表评论】【打印此文】【关闭窗口】【点击数:
★好玩的休闲小游戏★
网友评论:
数据载入中,请稍后……