Visual C#的菜单编程

(王天 2001年11月13日 10:55)

菜单是软件界面设计的一个重要组成方面。它描述着一个软件的大致功能和风格。所以在程序设计中处理好、设计好菜单,对于一个软件开发是否成功有着比较重要的意义。

Visual C#是.Net框架中的一个重要组成部分,也是微软公司推出的下一代主流程序开发语言。它在设计、开发程序界面的时候和以前的某些程序开发语言有所不同。这一点也表现在其的菜单编程方面。本文就是来探讨一下如何用Visual C#进行菜单编程。

面向菜单编程中遇到的主要的问题大致可以分为二种:添加菜单项、删除菜单项。当然在处理以上二类问题时候,还会遇到诸如:如何添加菜单项所对应的事件,如何为菜单项添加快捷键等一些小的问题。下面就这些问题来具体进行论述。

一. 程序设计和运行环境

(1)微软视窗2000服务器版本
(2).Net FrameWork SDK Beta 2

二. 程序的主要功能

在本程序中,已经定义了二个主菜单项。程序的主要功能是通过"添加菜单"按钮在第二个主菜单项下(即"运行菜单项目"下)加入一个子菜单。通过"删除菜单"按钮删除第二个主菜单项中的最后一个子菜单。下图01是"添加菜单"按钮按动三次后的界面,图02是在"添加按钮"按动三次后,在按动"删除菜单"按钮后的程序运行界面:

menu5_1
图01:"添加菜单"按钮按动三次后的界面

menu5_2
图02:在"添加按钮"按动三次后,在按动"删除菜单"按钮后的界面

三. 菜单设计中遇到的主要问题及解决办法

(1)如何动态加入一个菜单项目

在.Net FrameWork SDK中有一个叫做System.Windows.Forms.dll文件,其中定义了一个名为System.Windows.Froms的名称空间,此名称空间中封装了很多和界面设计相关的类、对象。Visual C#在进行菜单编程的时候就需要用到在此名称空间中定义的二个对象:MainMenu、MenuItem。用过Delphi的程序员都知道在在Delphi中,也有MainMenu这个对象,MainMenu在程序设计中表现为菜单项的容器,而MenuItem就是要往这个容器中添加的内容。所以在一个窗体中这种容器往往只需要一个,即需要一个MainMenu,但却往往要多个MenuItem,即需要多个菜单项。通过以下二个例子来具体说明如何进行菜单加入操作:

例01:只是在窗体中加入一个主菜单项目:

using System.Windows.Forms;
class RuntimeMenus : Form
{
    private MainMenu myMenu;
    private MenuItem mnuFile;
    public RuntimeMenus()
    {
        //初始化 Main Menus
        myMenu = new MainMenu();
        mnuFile = new MenuItem("文件");
        x = new MenuItem("文件");
        //往 Main Menu里面加入菜单
        myMenu.MenuItems.Add(mnuFile);
        this.Menu = myMenu;
    }
    public static void Main()
    {
        Application.Run (new RuntimeMenus());
    }
}

成功程序编译后运行界面如下:

menu5_3

using System;
using System.Windows.Forms;

class RuntimeMenus : Form
{
    private MainMenu myMenu;
    private MenuItem mnuFile, mnuExit;
    public RuntimeMenus()
    {
        //初始化 Main Menus
        myMenu = new MainMenu();
        mnuFile = new MenuItem("文件");
        //设定子菜单的响应事件和快捷键
        mnuExit = new MenuItem("退出", new EventHandler(btnClose_Click), Shortcut.CtrlX);
        //往 Main Menu里面加入菜单
        myMenu.MenuItems.Add(mnuFile);
        mnuFile.MenuItems.Add(mnuExit);
        this.Menu = myMenu;
    }
    protected void btnClose_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    public static void Main()
    {
        Application.Run(new RuntimeMenus());
    }
}

成功编译此例子后,运行就可以得到如下界面:

menu_4
图04:加入子菜单并设定快捷键和响应事件

通过以上二个小例子,我们就可以基本掌握如何正确添加主菜单和子菜单,并为之设定快捷键和响应事件。

(2)如何动态删除菜单

删除菜单比起添加一个菜单要来的相对容易了许多。在删除的时候,主要用到的是MenuItem对象的RemoveAt方法,此方法说带的参数是一个整型,是一个子菜单在主菜单中由上到下的相对位置,譬如以下语言:

mnuRtime.MenuItems.RemoveAt(2);

意思是在mnuRtime主菜单中删除由上到下的第三个子菜单。(由上至下第一个对应的指是"0")。

四. 程序源代码(menu.cs)

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

class RuntimeMenus : Form
{
    private MainMenu myMenu;
    private MenuItem mnuFile, mnuExit, mnuRtime;
    private Button btnAdd, btnRemove, btnClose;
    static int i;
    public RuntimeMenus()
    {
        InitializeComponents();
    }

    public void InitializeComponents()
    {
        //初始化 Main Menus
        myMenu = new MainMenu();
        mnuFile = new MenuItem("文件");
        mnuRtime = new MenuItem("运行菜单项目");

        //往 Main Menu里面加入菜单
        myMenu.MenuItems.Add(mnuFile);
        myMenu.MenuItems.Add(mnuRtime);

        //初始化 Exit 菜单项,设定了事件和快捷键
        mnuExit = new MenuItem("退出", new EventHandler(btnClose_Click), Shortcut.CtrlX);
        //把菜单项加入到文件File菜单中
        mnuFile.MenuItems.Add(mnuExit);

        //初始化添加按钮
        btnAdd = new Button();
        btnAdd.Location = new Point(275, 20);
        btnAdd.Text = "添加菜单";
        btnAdd.Click += new EventHandler(btnAdd_Click);
        btnAdd.Size = new Size(100, 30);

        //初始化删除按钮
        btnRemove = new Button();
        btnRemove.Location = new Point(275, 60);
        btnRemove.Text = "删除菜单";
        btnRemove.Click += new EventHandler(btnRemove_Click);
        btnRemove.Size = new Size(100, 30);

        //初始化关闭按钮
        btnClose = new Button();
        btnClose.Location = new Point(275, 100);
        btnClose.Text = "退出";
        btnClose.Click += new EventHandler(btnClose_Click);
        btnClose.Size = new Size(100, 30);

        //在窗体中加入按钮
        this.Controls.Add(btnAdd);
        this.Controls.Add(btnRemove);
        this.Controls.Add(btnClose);

        //设置窗体的属性
        this.MaximizeBox = false;
        this.MinimizeBox = false;
        this.Text = "动态处理菜单程序窗口!";
        // 设定本窗体的MainMenu
        this.Menu = myMenu;
        this.Size = new Size(400, 250);
        this.CancelButton = btnClose;
        this.StartPosition = FormStartPosition.CenterScreen;
    }

    //以下是动态加入菜单项
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        mnuRtime.MenuItems.Add("运行菜单 " + (i + 1), new EventHandler(mnuRtime_Click));
        i++;
    }

    //以下是动态删除菜单项
    protected void btnRemove_Click(object sender, EventArgs e)
    {
        mnuRtime.MenuItems.RemoveAt(i - 1);
        i = i - 1;
    }

    protected void mnuRtime_Click(object sender, EventArgs e)
    {
        String s = sender.ToString();
        MessageBox.Show("你选择的是 " + s.Substring(28), "菜单选择窗口!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

    //退出应用程序
    protected void btnClose_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }

    public static void Main()
    {
        Application.Run(new RuntimeMenus());
    }
}

按照以下语句编译完menu.cs:

csc /t:winexe /r:system.dll /r:system.windows.forms.dll /r:system.drawing.dll menu.cs

就可以得到menu.exe ,执行此文件就可以得到图01和图02所示的运行界面了。

五. 总结

本文主要是介绍了在用Visual C#进行有关菜单编程中,可能遇到有些问题。在解决这些问题的时候主要用到的是名称空间System.Windows.Forms中定义的二个对象MainMenu、MenuItem和这二个对象中定义的一些方法。当然这些方法还有一些其他的用法,有兴趣的读者可以参考有关书籍和浏览MSDN网站。

Contributors: FHL