实现一个具有弹性且多样化的菜单、内容菜单与状态栏
特别值得一提的是,在Visual C# 2005中建立工具列、菜单、内容菜单(快捷菜单)、以及状态列时,建议您了解ToolStrip控件、MenuStrip控件、ContextMenuStrip控件、StatusBar控件、以及四个控件之间密不可分的关系。以下即为一例:
在此,我们要使用程序范例CH9_DemoForm001.cs来示范如何创建一个具有弹性且多样化的菜单、内容菜单与状态栏。从中,您将会对这三个控件的功能特性与运作方式有更清楚的认识。接下来,我们一一介绍其外观特性与设计技巧:
图1-9
图1-10
图1-9所示是程序范例CH9_DemoForm001.cs的运行画面。我们发现,本窗体中的菜单非常特别,因为它除了传统形式的主菜单项目与单层或多层的下拉菜单之外,还拥有其它类型的ToolStripItem控件,包括:文本标签(ToolStripLabel)、下拉列表框(ToolStripComboBox)、按钮(ToolStripButton)、按钮与下拉列表的组合式控件(ToolStripSplitButton)以及一个文字超级链接(ToolStripLabel)。
基本上,我们是在设计阶段就已经构建了菜单的主体(如图1-10所示),此一菜单主体的各个菜单项目(包括主菜单项目与子菜单项目)都是一个ToolStripMenuItem对象,至于各个ToolStripItem控件则是通过程序代码来添加到MenuStrip控件中。将各个ToolStripItem控件添加到MenuStrip控件中的程序代码撰写在 CreateInitialMenus() 程序中,并且会在窗体的Load事件处理函数中加以调用,其程序代码如下所列:
private void CreateInitialMenus()
{
// 先添加三个菜单项目到“复选列表”
// 菜单的下拉菜单中。
for(int i = 1;i <= 3;i++)
{
AddOption();
}
// 创建一个用来显示文字标签的ToolStripLabel控件。
ToolStripLabel menuLabel = new ToolStripLabel();
menuLabel.Text = "请选取:";
// 将ToolStripLabel控件新增到MenuStrip控件
// 的Items集合中,以便将它加至菜单中。
MenuStrip1.Items.Add(menuLabel);
// 创建一个用来显示下拉列表框
// 的 ToolStripComboBox 控件。
ToolStripComboBox menuComboBox =
new ToolStripComboBox();
menuComboBox.Items.Add("停靠上边界");
menuComboBox.Items.Add("停靠下边界");
menuComboBox.Items.Add("停靠左边界");
menuComboBox.Items.Add("停靠右边界");
menuComboBox.SelectedIndex = 0;
menuComboBox.ToolTipText = "选取菜单的停靠位置";
// 设定当选取ToolStripComboBox控件中的不同选项时
// 就执行事件处理函数 ComboBox_SelectedIndexChanged。
menuComboBox.SelectedIndexChanged += new
System.EventHandler(this.ComboBox_SelectedIndexChanged);
// 将ToolStripComboBox控件添加到MenuStrip控件
// 的Items集合中,以便将它加到菜单中。
MenuStrip1.Items.Add(menuComboBox);
// 依序创建三个拥有按钮外观的ToolStripButton控件。
ToolStripButton button1 = new ToolStripButton();
ToolStripButton button2 = new ToolStripButton();
ToolStripButton button3 = new ToolStripButton();
// 依序设定这三个ToolStripButton控件的图片。
button1.Image = Resources.SampleImage1;
button2.Image = Resources.SampleImage2;
button3.Image = Resources.SampleImage3;
// 依序设定这三个ToolStripButton控件的工具提示信息。
button1.ToolTipText = "蓝色";
button2.ToolTipText = "红色";
button3.ToolTipText = "绿色";
// 依序设定这三个ToolStripButton控件的Name属性。
button1.Name = "Blue";
button2.Name = "Red";
button3.Name = "Green";
// 设定当引发这三个ToolStripButton控件的Click事件
// 时就执行事件处理函数ColorButton_Click。
button1.Click +=
new System.EventHandler(this.ColorButton_Click);
button2.Click +=
new System.EventHandler(this.ColorButton_Click);
button3.Click +=
new System.EventHandler(this.ColorButton_Click);
// 将这三个ToolStripButton控件新增到MenuStrip控件
// 的Items集合中,以便将它加至菜单中。
MenuStrip1.Items.Add(button1);
MenuStrip1.Items.Add(button2);
MenuStrip1.Items.Add(button3);
// 创建一个结合按钮与下拉列表
// 的ToolStripSplitButton控件。
ToolStripSplitButton colorSplitButton = new ToolStripSplitButton();
// 设定ToolStripSplitButton控件的文字。
colorSplitButton.Text = "蓝色";
// 设定当单击ToolStripSplitButton控件的标准按钮时
// 就执行事件处理函数SplitButton_Click。
colorSplitButton.ButtonClick += new
System.EventHandler(this.SplitButton_Click);
// 创建三个ToolStripMenuItem对象。
ToolStripMenuItem tsmiColorOption1 =
new ToolStripMenuItem();
ToolStripMenuItem tsmiColorOption2 =
new ToolStripMenuItem();
ToolStripMenuItem tsmiColorOption3 =
new ToolStripMenuItem();
// 设定这三个ToolStripMenuItem对象的文字。
tsmiColorOption1.Text = "蓝色";
tsmiColorOption2.Text = "红色";
tsmiColorOption3.Text = "绿色";
// 设定这三个ToolStripMenuItem对象的工具提示信息。
tsmiColorOption1.ToolTipText = "蓝色";
tsmiColorOption2.ToolTipText = "红色";
tsmiColorOption3.ToolTipText = "绿色";
// 设定这三个ToolStripMenuItem对象的名称。
tsmiColorOption1.Name = "Blue";
tsmiColorOption2.Name = "Red";
tsmiColorOption3.Name = "Green";
// 设定这三个ToolStripMenuItem对象的图片。
tsmiColorOption1.Image = Resources.SampleImage1;
tsmiColorOption2.Image = Resources.SampleImage2;
tsmiColorOption3.Image = Resources.SampleImage3;
// 设定当引发这三个ToolStripMenuItem对象的Click事件
// 时就执行事件处理函数DropDownColorItem_Click。
tsmiColorOption1.Click += new
System.EventHandler(this.DropDownColorItem_Click);
tsmiColorOption2.Click += new
System.EventHandler(this.DropDownColorItem_Click);
tsmiColorOption3.Click += new
System.EventHandler(this.DropDownColorItem_Click);
// 将这三个ToolStripMenuItem对象
// 新增至ToolStripSplitButton控件
// 的DropDownItems集合中,以便使
// 它们成为ToolStripSplitButton控件的选项。
colorSplitButton.DropDownItems.Add(tsmiColorOption1);
colorSplitButton.DropDownItems.Add(tsmiColorOption2);
colorSplitButton.DropDownItems.Add(tsmiColorOption3);
// 将这三个ToolStripSplitButton控件
// 添加到MenuStrip控件的Items集合中,
// 以便将它加到菜单中。
MenuStrip1.Items.Add(colorSplitButton);
// 创建一个用来显示文字超级链接的ToolStripLabel控件。
ToolStripLabel myLinkLabel = new ToolStripLabel();
myLinkLabel.Text = "http://www.microsoft.com";
myLinkLabel.IsLink = true;
myLinkLabel.AutoToolTip = true;
// 设定当引发文字超级链接的Click事件时
// 就执行事件处理函数myLinkLabel_Click。
myLinkLabel.Click += new
System.EventHandler(this.myLinkLabel_Click);
// 将文字超级链接添加到MenuStrip控件
// 的Items集合中,以便将它加至菜单中。
MenuStrip1.Items.Add(myLinkLabel);
}
图1-11
如图1-11所示,当您将鼠标指针移至某一个菜单项目的上方时,菜单项目不仅会显示出工具提示信息,其文字还会显示在状态栏中的ToolStripButton控件上。事实上,ToolStripItem类本身就拥有ToolTipText属性,也就是说,您不需要在窗体上额外添加一个ToolTip控件,就可以直接藉由设定各种ToolStripItem控件的ToolTipText属性来设定工具提示信息。至于菜单项目的文字之所以显示在状态栏中的ToolStripButton控件上,那是因为我们替这些菜单项目的MouseEnter与MouseLeave事件处理函数撰写了下列程序代码:
private void MenuItem_MouseEnter(object sender, System.EventArgs e)
{
ToolStripMenuItem selectedItem = (ToolStripMenuItem)(sender);
tsbSelectedItem.Text = selectedItem.Text;
}
private void MenuItem_MouseLeave(object sender, System.EventArgs e)
{
tsbSelectedItem.Text = "";
}
图1-12
图1-13
如图1-12所示,您可以从“窗体透明度”的下拉菜单中选取特定的选项来设定窗体的透明度。值得一提的技巧是,我们是将要赋给窗体Opacity属性的数值事先保存在菜单项目的Tag属性中(如图1-13所示),并使用同一个事件处理函数来处理这四个菜单项目的Click事件:
private void changeOpacityToolStripMenuItem_Click(
object sender, EventArgs e)
{
ToolStripMenuItem menuItem = (ToolStripMenuItem)(sender);
double opacity = Convert.ToDouble(menuItem.Tag.ToString());
this.Opacity = opacity;
// 透明度是彼此互斥的,请确认只有目前的设定被复选。
ToolStripMenuItem menuChangeOpacity =
(ToolStripMenuItem)(tsmiOptions.DropDownItems[1]);
foreach(ToolStripMenuItem item in
menuChangeOpacity.DropDownItems)
{
item.Checked = false;
}
menuItem.Checked = true;
}
本程序范例的状态栏中拥有三个ToolStripItem控件,由左至右分别是ToolStripButton、ToolStripProgressBar与ToolStripStatusLabel。在此我们要把焦点摆在其中的ToolStripStatusLabel。为了让用户在设计阶段知道状态栏中的最右侧存在一个ToolStripStatusLabel控件,我们特别将其Text属性设定成“章立民”以便让它显示出文字。然而在程序实际运行时,我们会在此ToolStripStatusLabel控件中显示一个图标与当时的日期时间,更特别的是,它会填满整个状态栏的剩余空间(如图1-14所示)。这涉及到了一个非常重要的属性,它就是Spring属性。只要您将ToolStripStatusLabel控件的Spring属性设定成True,则当调整窗体的大小时,ToolStripStatusLabel会自动填满StatusStrip上的可用空间。
窗体之Load事件处理函数中的下面这一段程序代码,即是在设定状态栏中最右侧的ToolStripStatusLabel控件的相关属性:
// 设定状态栏(StatusStrip)中名称为 tsbDateTime
// 之ToolStripStatusLabel 控件的各个属性。
this.tsbDateTime.AutoToolTip = true;
this.tsbDateTime.Text = DateTime.Now.ToString();
this.tsbDateTime.Image = Resources.CLOCK02.ToBitmap();
this.tsbDateTime.TextAlign = ContentAlignment.MiddleRight;
this.tsbDateTime.ImageAlign = ContentAlignment.BottomRight;
this.tsbDateTime.TextImageRelation =
TextImageRelation.TextBeforeImage;
this.tsbDateTime.Spring = true;
图1-14
结语
最后,深切地期望大家在阅读完「Visual C# 2005程序开发与界面设计秘诀」一书之后,能够在Visual C# 2005的学习之路上更加顺畅,祝福您。