Windows程序设计与架构
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 Windows常用控件

虽然Visual C++ 6.0也被称为完全可视化的开发工具,而且其中的一些用户界面(如对话框)等也可以自己画。但事实上,在Visual C++ 6.0里,很多界面程序员还不得不自己写代码创建和实现,而且MFC复杂的封装经常让人云里雾里。相比而言,VS.NET中的C#应用开发是名副其实的RAD(Rapid Application Development,快速应用开发)。

丰富而又易于使用的控件是一个良好的RAD应用开发平台所必须具有的条件之一。在VS.NET的工具箱中,可以看到.NET提供了很多Windows Forms控件,如标签、按钮、菜单等。

对于C# Windows应用而言,一个.NET控件对应于System.Windows.Forms名字空间下的一个类。控件的属性实际上就是对应类的属性,控件的事件就是对应类的事件成员。

要想熟练掌握.NET在Win Form程序设计,熟悉这些控件是很必要的。本节将逐一讲述Windows Forms常用控件及其使用方法。

1.4.1 标签、连接标签、文本框

1.标签

Windows窗体Label控件用于显示用户不能编辑的文本或图像。它们用于标识窗体上的对象;例如,描述单击某控件时该控件所进行的操作,或者显示相应信息以响应应用程序中的运行时事件或进程。例如,可以使用标签向文本框、列表框和组合框等添加描述性标题。也可以编写代码,使标签显示的文本为了响应运行时事件而做出更改。例如,如果应用程序需要几分钟时间处理更改,则可以在标签中显示处理状态的消息。

(1)常用属性

(2)常用事件

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中Label控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。

鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

一般地,在程序中设置Label的Text属性即可改变其显示,如下所示:

lab_Result.Text = "欢迎来到Windows Form程序开发世界";
2.链接标签

链接标签的名称为LinkLabel,对应System.Windows.Forms.LinkLabel类。Windows窗体LinkLabel控件使用户可以向Windows窗体应用程序添加Web样式的链接。一切可以使用Label控件的地方,都可以使用LinkLabel控件;还可以将文本的一部分设置为指向某个文件、文件夹或网页的链接。

(1)常用属性

(2)常用事件

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中LinkLabel控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

一般地,如需要再指定LinkLabel的链接,需由程序实现。如下面代码指定从第4个字符(从0开始记数)开始的两个字符为指向“www.microsoft.com”的链接;第8个字符开始的3个字符为指向“www.msdn.net”的链接。

linkLabel1.Links.Add( 3,2,"www.microsoft.com" );
linkLabel1.Links.Add( 7,3,"www.msdn.net" );

对用户单击链接的响应代码可以放在LinkClick事件的处理方法中,如下所示:

private void linkLabel_Home_LinkClicked(object sender,
System.Windows.Forms.LinkLabelLinkClickedEventArgs e){
        // 设置被单击链接为已访问
        linkLabel_Home.Links[linkLabel_Home.Links.IndexOf(e.Link)]. Visited = true;
        // 打开一个IE,浏览指定页面.System.Diagnostics.Process.Start的功能为运行一个程序
        System.Diagnostics.Process.Start("IEXPLORE.EXE",e.Link.LinkData.ToString());
}
3.文本框

Windows窗体文本框用于获取用户输入或显示文本。TextBox控件通常用于可编辑文本,不过也可使其成为只读控件。文本框可以显示多个行,对文本换行使其符合控件的大小及添加基本的格式设置。TextBox控件为在该控件中显示的或输入的文本提供一种格式化样式。若要显示多种类型的带格式文本,应使用RichTextBox控件。

控件显示的文本包含在Text属性中。默认情况下,最多可在一个文本框中输入2048个字符。如果将Multiline属性设置为true,则最多可输入32KB的文本。Text属性可以在设计时使用“属性”窗口设置,在运行时用代码设置,或者在运行时通过用户输入来设置。可以在运行时通过读取Text属性来检索文本框的当前内容。

(1)常用属性

(2)常用事件

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中TextBox控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

如需要在文本框的文本发生变化时,做某些处理,可以将处理代码放在其TextChanged事件处理方法中,如下所示:

private void textBox1_TextChanged(object sender,System.EventArgs e)
{
    string sText = textBox1.Text; //取得当前文本
    //然后执行处理….
}

在程序中,如想取得文框中的文本内容,直接访问其Text属性(单行)或Lines属性(多行)即可。

1.4.2 按钮、复选框、单选按钮

1.按钮

按钮的名称为Button,对应System.Windows.Forms.Button类。一般用于在应用程序中接受用户命令。Windows窗体Button控件允许用户通过单击来执行操作。当该按钮被单击时,它看起来像是被按下,然后被释放。每当用户单击按钮时,即调用Click事件处理程序。可将代码放入Click事件处理程序来执行所选择的任意操作。

按钮上显示的文本包含在Text属性中。如果文本超出按钮宽度,则换到下一行。但是,如果控件无法容纳文本的总体高度,则将剪裁文本。Text属性可以包含访问键,允许用户通过同时按Alt键和访问键来“单击”控件。文本的外观受Font属性和TextAlign属性控制。

Button控件还可以使用Image和ImageList属性显示图像。

(1)常用属性

(2)常用事件

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中Button控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

一般而言,Button控件对用户命令的响应都反映在其Click事件处理函数中,如下所示:

private void button1_Click(object sender,System.EventArgs e)
{
    this.Close(); //关闭父窗口
}
2.复选框

(1)概述

Windows窗体的CheckBox控件指示某特定条件是打开还是关闭。它常用于为用户提供“是/否”或“真/假”选项。可以成组使用复选框(CheckBox)控件以显示多重选项,用户可以从中选择一项或多项。

复选框(CheckBox)控件和单选按钮(RadioButton)控件的相似之处在于,它们都是用于指示用户所选的选项。它们的不同之处在于,在单选按钮组中一次只能选择一个单选按钮;但是对于复选框(CheckBox)控件,则可以选择任意数量的复选框。

复选框可以使用简单数据绑定连接到数据库中的元素。多个复选框可以使用GroupBox控件进行分组。这对于可视外观及用户界面设计很有用,因为成组控件可以在窗体设计器上一起移动。

CheckBox控件有Checked和CheckState两个重要属性。Checked属性返回true或false。CheckState属性返回Checked或Unchecked;如果ThreeState属性被设置为true,则CheckState还可能返回Indeterminate。处于不确定状态时,该框会显示为灰显外观,指示该选项不可用。

(2)常用属性

(3)常用事件

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中CheckBox控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

如果想在CheckBox状态发生改变时进行处理,可对其CheckChanged或CheckState Changed事件编写处理方法,如下所示:

private void checkBox1_CheckedChanged(object sender,
  System.EventArgs e){
  if (checkBox1.Checked){
      //为真时的处理代码
  }
  else{
      //为假时的处理代码
  }
  }

可以通过检查CheckBox的Checked或CheckState属性确定其当前状态,如下所示:

bool bChecked = checkBox1.Checked;
3.单选按钮

Windows窗体RadioButton控件为用户提供由两个或多个互斥选项组成的选项集。虽然单选按钮和复选框看似功能类似,却存在重要差异,即当用户选择某单选按钮时,同一组中的其他单选按钮不能被同时选定;相反,却可以选择任意数目的复选框。定义单选按钮组将告诉用户:“这里有一组选项,您可以从中选择一项且只能选择一项”。

当单击RadioButton控件时,其Checked属性设置为true,并且调用Click事件处理程序。当Checked属性的值更改时,将引发CheckedChanged事件。如果AutoCheck属性设置为true(默认值),则当选择单选按钮时,将自动清除该组中的所有其他单选按钮。通常仅当使用验证代码确保选定的单选按钮是允许的选项时,才将该属性设置为false。控件内显示的文本使用Text属性进行设置,该属性可以包含访问键快捷方式。访问键允许用户通过按Alt键和访问键来“单击”控件。如果Appearance属性设置为Button,则RadioButton控件的显示与命令按钮相似,选中时会显示为按下状态。通过使用Image和ImageList属性,单选按钮还可以显示图像。

(1)常用属性

(2)常用事件

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中RadioButton控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

如果当RadioButton状态发生改变时,想进行处理,可对其CheckedChanged事件编写处理方法,如下所示:

private void radioButton2_CheckedChanged(object sender,System.EventArgs e){
    if (radioButton2.Checked){
        //为真时的处理代码
    }
    else{
        //为假时的处理代码
    }
   }

可以通过检查RadioButton的Checked属性确定其当前状态,如下所示:

bool bChecked = radioButton1.Checked;

需要注意的是,RadioButton是成组工作的。当同一组单选按钮的一个被选中时,其他同组单选按钮则自动失去选中属性。如果在同一个表单中需要超过两组的单选按钮,可以用GroupBox(组框)将每个组框起来,这样,不同组的单选按钮就不会相互影响了。

1.4.3 图片框、图片列表

1.图片框

(1)概述

图片框的名称为PictureBox,对应System.Windows.Forms.PictureBox类。一般用于在应用程序显示图片。用于显示位图、GIF、JPEG、图元文件或图标格式的图形。

所显示的图片由Image属性确定,该属性可在运行时或设计时设置。另外,也可以通过设置ImageLocation属性,然后使用Load方法同步加载图像,或使用LoadAsync方法进行异步加载,来指定图像。SizeMode属性控制使图像和控件彼此适合的方式。

(2)常用属性

(3)常用事件

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中PictureBox控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。在其属性窗中,可以通过改变Image属性来指定显示的图片。

这里看一下在程序中关于PictureBox的初始化代码,如下所示:

System.Resources.ResourceManager resources = new
System.Resources.ResourceManager(typeof(Form1));
     this.pictureBox1.Image=((System.Drawing.Bitmap)(resources.GetObject("pictureBox1.Image")));
     this.pictureBox1.Location = new System.Drawing.Point(40,136);
     this.pictureBox1.Name = "pictureBox1";
     this.pictureBox1.Size = new System.Drawing.Size(32,32);
     this.pictureBox1.TabIndex = 4;
     this.pictureBox1.TabStop = false;

可以看出,事实上当程序中选定图片框要显示的图片来源时,这个图片将会以资源的形式存储到对应的资源文件中。用到时再将其提取出来,并强制转换成System. Drawing.Bitmap格式赋值给图片框控件的Image属性。而这一切都是VS.NET自动完成的。

2.图片列表

Windows窗体ImageList组件用于存储图像,这些图像随后可由控件显示。图像列表使程序员能够为一致的单个图像目录编写代码。例如,只需更改按钮的ImageIndex或ImageKey属性,就可旋转Button控件显示的图像。还可以使同一个图像列表与多个控件相关联。例如,如果使用ListView控件和TreeView控件显示同一个文件列表,则当更改图像列表中某个文件的图标时,新图标将同时显示在两个视图中。

可以将图像列表用于任何具有ImageList属性的控件,或者用于具有SmallImageList和LargeImageList属性的ListView控件。可与图像列表关联的控件包括ListView、TreeView、ToolBar、TabControl、Button、CheckBox、RadioButton和Label控件。若要使图像列表与一个控件关联,应将该控件的ImageList属性设置为ImageList组件的名称。

ImageList组件的主要属性是Images,它包含关联的控件将要使用的图片。每个单独的图像可通过其索引值或其键值来访问。ColorDepth属性确定呈现图像时所使用的颜色数量。所有图像都将以同样的大小显示,该大小由ImageSize属性设置。较大的图像将缩小至适当的尺寸。

如果使用Visual Studio 2005,则可以访问一个大型标准图像库,用户可以在自己的应用程序中使用该图像库。

(1)常用属性

(2)常用事件

由于图片列表控件是不可视的,因此,它只有一个Disposed事件,这个事件当对象被释放时触发。

(3)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ImagList控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性以及事件处理函数。修改图片列表所包含的图片对象集合可用如下方法:

  • 打开图片列表的属性窗。
  • 单击位于Images属性右方的按钮,即可进入图片集合修改界面,如图1-3所示。
  • 在“图片集合编辑器”中,可以增加或删除图片集合中的图片。

图1-3 图像集合编辑器

图片列表中的图片资源实际上也是存放在资源文件中的,这可以从以下代码看出来。

System.Resources.ResourceManager resources = new
System.Resources.ResourceManager(typeof(MainFrm));
this.imageList_tb_Main.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
this.imageList_tb_Main.ImageSize = new System.Drawing.Size(16,16);
this.imageList_tb_Main.ImageStream = ((System.Windows.Forms.ImageListStreamer)
(resources.GetObject("imageList_tb_Main.ImageStream")));
this.imageList_tb_Main.TransparentColor = System.Drawing.Color.Transparent;

除了在VS.NET属性框中指定图片集合之外,也可以在程序中动态改变图片集的成员,如下所示:

System.Drawing.Bitmap bitmap1=
(System.Drawing.Bitmap)(resources.GetObject("Form1.MyImage1"));
imageList_tb_Main.Images.Add( bitmap1,System.Drawing.Color.Transparent );

有关图片列表的引用,将在接下来工具栏使用的介绍中讲到。

1.4.4 菜单、工具栏、状态条

1.菜单

主菜单的名称为MainMenu,对应System.Windows.Forms.MainMenu类。以外,一个主菜单是由许多菜单项(MenuItem,对应System.Windows.Forms.MenuItem)构成的。MainMenu从System.Windows.Forms.Menu类继承。Windows窗体MainMenu组件在运行时显示一个菜单。主菜单的所有子菜单和单个项均为MenuItem对象。

通过将DefaultItem属性设置为true,可以将某菜单项指定为默认项。单击菜单时,默认项以粗体文本显示。菜单项的Checked属性为true或false,它指示是否选定了该菜单项。菜单项的RadioCheck属性会自定义选定项的外观,如果RadioCheck设置为true,则该项旁边出现一个单选按钮;如果RadioCheck设置为false,则该项旁边出现一个选中标记。

(1)常用属性(主菜单)

(2)常用事件(主菜单)

只有一个Disposed事件,这个事件当对象被释放时触发。

(3)常用属性(菜单项)

(4)常用事件(菜单项)

(5)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中MainMenu控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗,可设置其各种属性及事件处理函数。

一个菜单是由很多菜单项构成的,而一个菜单项又可能有子菜单项,那么,怎么指定它们之间的从属关系呢?请看如下示例。

//表单类中的声明代码
private System.Windows.Forms.MainMenu m_Main;
private System.Windows.Forms.MenuItem m_File;
private System.Windows.Forms.MenuItem m_Tools;
//菜单及菜单项的创建代码
this.m_Main = new System.Windows.Forms.MainMenu();
this.m_File = new System.Windows.Forms.MenuItem();
this.m_Tools = new System.Windows.Forms.MenuItem();
//指定m_File(文件),m_Tools(工具),m_Window(窗口),…m_Help(帮助)等三个菜
//单项属于主菜单m_Main
this.m_Main.MenuItems.AddRange(
    new System.Windows.Forms.MenuItem[] {
         this.m_File,
        this.m_Tools,
         this.m_Window,
        this.menuEliteMan,
        this.m_Help});
// 指定m_Login(注册),m_ChangePass(修改密码),menuItem5(一分隔横线),
// menuforgetPass(找回密码)…. M_Exit(退出)等菜单项为File菜单项的子菜单项
this.m_File.MenuItems.AddRange(
       new System.Windows.Forms.MenuItem[] {
    this.m_Login,
    this.m_ChangePass,
    this.menuItem5,
     this.menuForgetPass,
      this.menuItem6,
      this.m_BaseEdit,
      this.m_Exit});

现在对以上代码做一下解释,菜单项或主菜单的MenuItems属性为System.Windows. Forms.Menu.MenuItemCollection类型,其Add或AddRange方法可以单个或成批地指定其下一级菜单项。还要说明的是,这里列出这些代码主要是为了让读者更深刻地理解菜单的运作机制。事实上,这些工作都是由VS.NET自动完成的,程序员一般无需手工干预。

如果要对菜单的单击做出响应,只须对菜单项的Click事件进行处理,如下所示:

private void m_Exit_Click(object sender,System.EventArgs e){
   this.Close(); //关闭窗口
   Application.Exit(); //程序结束
}

MenuStrip控件是Visual Studio 2005和.NET Framework 2.0中的新功能。使用该控件,可以轻松创建如Microsoft Office中那样的菜单。

MenuStrip控件支持多文档界面(MDI)和菜单合并、工具提示和溢出。可以通过添加访问键、快捷键、选中标记、图像和分隔条,来增强菜单的可用性和可读性。

MenuStrip控件取代了MainMenu控件并向其中添加了功能;但是也可选择保留MainMenu控件以备向后兼容和将来使用。

使用MenuStrip控件可以实现以下功能。

  • 创建支持高级用户界面和布局功能的易自定义的常用菜单,例如文本和图像排序和对齐、拖放操作、MDI、溢出和访问菜单命令的其他模式。
  • 支持操作系统的典型外观和行为。
  • 对所有容器和包含的项进行事件的一致性处理,处理方式与其他控件的事件相同。

下表显示了MenuStrip和关联类的一些特别重要的属性。

下表显示了重要的MenuStrip同伴类。

2.工具栏

Windows窗体的ToolBar控件用做窗体上的控制条,以显示一行下拉菜单和一些激活命令的位图按钮。这样,单击一个工具栏按钮可与选择一个菜单命令等效。可将按钮配置为以普通按钮、下拉菜单或分隔符等形式显示和表现。通常情况下,工具栏包含的按钮和菜单与应用程序菜单结构中的项相对应,以提供对应用程序的常用功能和命令的快速访问。

ToolBar控件通常沿其父窗口顶部“停靠”,但是也可以将它停靠到窗口的任一边上。当用户将鼠标指针指向工具栏按钮时,工具栏可以显示工具提示。工具提示是一个小的弹出式窗口,用以简述按钮或菜单的用途。若要显示工具提示,必须将ShowToolTips属性设置为true。

注意:某些应用程序的特点是具有与工具栏非常类似的控件,这些控件可以“浮动”在应用程序窗口之上并可以重新定位。Windows窗体的ToolBar控件不能执行这些操作。

当Appearance属性设置为Normal时,工具栏按钮以凸起和三维方式显示。可以将工具栏的Appearance属性设置为Flat,以使工具栏及其按钮按平面方式显示。当鼠标指针移动到平面按钮时,该按钮的外观变为三维形状。可以使用分隔符将工具栏按钮划分成多个逻辑组。分隔符是Style属性设置为Separator的工具栏按钮。它在工具栏上显示为空白。当工具栏具有平面外观时,按钮分隔符显示为直线而不是按钮之间的空白。

ToolBar允许通过将Button对象添加到Buttons集合中来创建工具栏。可以使用“集合编辑器”将按钮添加到ToolBar控件中;每个Button对象都应分配有文本或图像,不过也可同时分配文本和图像。图像由一个关联的ImageList组件提供。运行时,可使用Add和Remove方法从ToolBarButtonCollection中添加或移除按钮。若要对ToolBar的按钮进行编程,应向ToolBar的ButtonClick事件中添加代码,使用ToolBarButtonClickEventArgs类的Button属性来确定所单击的按钮。

(1)常用属性(工具栏)

(2)常用事件(工具栏)

(3)常用属性(工具栏按钮)

(4)常用事件(工具栏按钮)

工具栏按钮无事件,对单击的响应代码应编写在所属工具栏的事件处理函数中。

(5)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ToolBar控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

在建立一个工具栏之前,首先应该建立一个图片列表(ImageList),因为工具栏中的图标组来源于图片列表。

在这个编辑窗中,可以方便地通过Add、Remove两个按钮添加、删除工具栏的按钮。每一个按钮都需要改变ImageIndex属性,以获得一个图片显示,对应的ImageList是在按钮所属的工具栏中指定的。

一个工具栏是由很多工具栏按钮构成的,它们之间从属关系的指定同菜单很相似,请看下面一段由VS.NET自动生成的代码。

//定义图片列表
private System.Windows.Forms.ImageList imageList_tb_Main;
//定义工具栏
private System.Windows.Forms.ToolBar tb_Main;
//定义工具栏按钮
private System.Windows.Forms.ToolBarButton tbb_Login;
private System.Windows.Forms.ToolBarButton tbb_Exit;
    //创建这些与工具栏有关的对象
    this.tb_Main = new System.Windows.Forms.ToolBar();
    this.tbb_Login = new System.Windows.Forms.ToolBarButton();
    this.tbb_Exit = new System.Windows.Forms.ToolBarButton();
    //指定tb_Main工具栏使用imageList_tb_Main图片列表
    this.tb_Main.ImageList = this.imageList_tb_Main;
    //指定tb_Main工具栏所拥有的按钮集合:Login,PrintSetup,Computer,Calendar
    //以及Help等等
    this.tb_Main.Buttons.AddRange(
           new System.Windows.Forms.ToolBarButton[] {
                         this.tbb_tag1,
                         this.tbb_Login,
                         this.tbb_PrintSetup,
                         this.tbb_Computer,
                         this.tbb_Calendar,
                         this.tbb_Help,
                         this.tbb_ie,
                         this.tbb_Exit});
        //设定工具栏中tbb_Login按钮的图片为ImageList中的第三张
    this.tbb_Login.ImageIndex = 3;

工具栏的Buttons属性为System.Windows.Forms.ToolBar.ToolBarButtonCollection类型,其Add或AddRange方法可以单个或成批地指定其按钮项。

如果要对工具栏按钮的单击做出响应,则需要对整个工具栏的ButtonClick事件编码,注意,工具栏按钮没有事件。看下面的代码。

private void tb_Main_ButtonClick(object sender,
System.Windows.Forms.ToolBarButtonClickEventArgs e){
//根据参数取得被单击工具栏按钮的序号
int iIndexToolBar = e.Button.ImageIndex ;
    switch(iIndexToolBar){ //根据序号做出不同的反应
        case 0:
              //单击第0个按钮时的处理代码
            break;
        case 1:
            Application.Exit ();
            break;
              //省略部分代码
        case 6:
              //单击第6个按钮时的处理代码
            break;
        default:
            break;
    }
}

在程序运行的过程中,如果希望一些工具栏按钮变得不可用,可以改变其Enabled属性实现,如下所示:

tb_Main.Buttons[1].Enabled = false;

使用ToolStrip及其关联的类,可以创建具有Microsoft Windows XP、Microsoft Office、Microsoft Internet Explorer或自定义的外观和行为的工具栏及其他用户界面元素。这些元素支持溢出及运行时项重新排序。ToolStrip控件提供丰富的设计时体验,包括激活和编辑、自定义布局、漂浮(即工具栏共享水平或垂直空间的能力)。

尽管ToolStrip替换了早期版本的控件并添加了功能,但是仍可以在需要时选择保留ToolBar以备向后兼容和将来使用。

使用ToolStrip控件可以实现以下功能。

  • 创建易于自定义的常用工具栏,让这些工具栏支持高级用户界面和布局功能,如停靠、漂浮、带文本和图像的按钮、下拉列表和控件、“溢出”按钮和ToolStrip项的运行时重新排序。
  • 支持操作系统的典型外观和行为。
  • 对所有容器和包含的项进行事件的一致性处理,处理方式与其他控件的事件相同。
  • 将项从一个ToolStrip拖到另一个ToolStrip内。
  • 使用ToolStripDropDown中的高级布局创建下拉控件及用户界面类型编辑器。

通过使用ToolStripControlHost类来使用ToolStrip中的其他控件,并为它们获取ToolStrip功能。

通过使用ToolStripRenderer、ToolStripProfessionalRenderer和ToolStripManager,以及ToolStripRenderMode枚举和ToolStripManagerRenderMode枚举,可以扩展此功能并修改外观和行为。

ToolStrip控件为高度可配置的、可扩展的控件,它提供了许多属性、方法和事件,可用来自定义外观和行为。下表显示了一些值得注意的重要Toolstrip成员。

通过使用多个伴随类可以实现ToolStrip控件的灵活性。下表显示了一些最值得注意的ToolStrip伴随类。

3.状态条

(1)概述

状态条的名称为StatusBar,对应System.Windows.Forms.StatusBar类。Windows窗体StatusBar控件是作为一个区域用在窗体上的,通常显示在窗口的底部,应用程序可以在其中显示各种状态信息。StatusBar控件可以有状态栏面板,面板上显示指示状态的文本或图标,或者显示指示一个进程正在工作的一系列动画图标;例如,Microsoft Word指示正在保存文档;在鼠标滚动到超链接时,Internet Explorer使用状态栏指示某个页面的URL;Microsoft Word为您提供有关页位置、节位置和编辑模式(如改写和修订跟踪)的信息;Visual Studio使用状态栏提供区分上下文的信息,如告诉用户如何操纵可停靠的窗口,使其停靠或浮动。

通过将ShowPanels属性设置为false(默认值)并将状态栏的Text属性设置为希望出现在状态栏中的文本,可在状态栏中显示一条消息。可以将状态栏分成多个面板来显示多种类型的信息,方法是将ShowPanels属性设置为true并使用StatusBarPanelCollection的Add方法。

(2)常用属性(状态条)

(3)常用事件(状态条)

(4)常用属性(状态条面板)

(5)常用事件(状态条面板)

状态条面板无事件,对单击的响应代码书写在所属状态条的事件处理函数中。

(6)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中StatusBar控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

一个状态条是由很多状态条面板构成的,它们之间从属关系的指定同菜单很相似,请看下面一段由VS.NET自动生成的代码。

//声明状态条和状态条图标
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.StatusBarPanel statusBarPanel1;
private System.Windows.Forms.StatusBarPanel statusBarPanel2;
//创建状态条和状态条图标
this.statusBar1 = new System.Windows.Forms.StatusBar();
this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel();
//状态条的初始化
this.statusBar1.Location = new System.Drawing.Point(0,269);
this.statusBar1.Name = "statusBar1";
//指定statusBarPanel1,statusBarPanel2属于statusBar1
this.statusBar1.Panels.AddRange(
new System.Windows.Forms.StatusBarPanel[] {
this.statusBarPanel1,
this.statusBarPanel2,
this.statusBarPanel8});
this.statusBar1.ShowPanels = true;
this.statusBar1.Size = new System.Drawing.Size(320,32);
this.statusBar1.TabIndex = 8;
this.statusBar1.Text = "状态条";
           // 状态条面板的初始化
this.statusBarPanel2.Alignment =
System.Windows.Forms.HorizontalAlignment.Center;
            this.statusBarPanel2.Text = "正在播放...";
            this.statusBarPanel2.Width = 200;

状态条的Panels为System.Windows.Forms.StatusBar.StatusBarPanelCollection类型,其Add或AddRange方法可以单个或成批地指定其面板项。

如果只希望状态条显示单一的文本,那么可以设其ShowPanels属性为false将面板隐藏起来。在程序中动态改变状态条的文本来表示当前状态,如下所示:

statusBar1.Text = "新的程序状态…"

相反,如果希望状态条可以显示不同的项目,则将ShowPanels属性设为真,并根据项目为状态条添加合适数量的面板。并可以通过改变面板的属性来控制状态条的表现行为,如下所示:

this.statusBarPanel1.Text ="新信息…"

如果要对状态条面板的单击做出响应,则需要对整个状态条的PanelClick事件编码,注意,状态条面板没有事件。看下面的代码。

private void statusBar1_PanelClick(object sender,
System.Windows.Forms.StatusBarPanelClickEventArgs e) {
            //从参数中取得被单击面板的引用
    System.Windows.Forms.StatusBarPanel clickedPanel =e.StatusBarPanel;
            //根据面板的不同做出不同的反应
            switch ( clickedPanel )
            {
                case this.statusBarPanel1:
                    //处理代码
                    break;
                case this.statusBarPanel2:
                    //处理代码
                    break;
                default:
                    //处理代码
                    break;
            }
    }

如果只需响应整个状态条的Click事件,则只需对整个状态条的Click事件编码即可,如下所示:

private void statusBar1_Click(object sender,System.EventArgs e)
{
        //处理代码
}

StatusStrip控件显示关于正在Form上查看的对象或该对象的组件的信息,或者显示与该对象在应用程序中操作相关的上下文信息。通常StatusStrip控件由ToolStripStatusLabel对象组成,其中每个对象都显示文本和(或)图标。StatusStrip还可包含ToolStripDrop DownButton、ToolStripSplitButton和ToolStrip ProgressBar控件。

默认的StatusStrip没有面板。若要将面板添加到StatusStrip,请使用ToolStripItem Collection.AddRange方法,或使用StatusStrip项集合编辑器在设计时添加、移除或重新排序项并修改属性。使用“StatusStrip任务”对话框在设计时运行常用命令。

下面的代码示例演示了一个带有不同的常用属性集的StatusStrip。

using System;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication4
{
   public class Form1 : Form
   {
      private StatusStrip statusStrip1;
      private ToolStripStatusLabel toolStripStatusLabel1;
      public Form1()
      {
         InitializeComponent();
      }
      [STAThread]
      static void Main()
      {
         Application.EnableVisualStyles();
         Application.Run(new Form1());
      }
      private void InitializeComponent()
      {
         statusStrip1 = new System.Windows.Forms.StatusStrip();
         toolStripStatusLabel1 = new System.Windows.Forms.ToolStrip StatusLabel();
         statusStrip1.SuspendLayout();
         SuspendLayout();
         //
         // The following code example demonstrates the syntax for setting
         // various StatusStrip properties.
         statusStrip1.Dock = System.Windows.Forms.DockStyle.Top;
         statusStrip1.GripStyle = System.Windows.Forms.ToolStripGrip Style.Visible;
         statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStrip
         Item[]
         {
         toolStripStatusLabel1});
         statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayout Style.
         HorizontalStackWithOverflow;
         statusStrip1.Location = new System.Drawing.Point(0,0);
         statusStrip1.Name = "statusStrip1";
         statusStrip1.ShowItemToolTips = true;
         statusStrip1.Size = new System.Drawing.Size(292,22);
         statusStrip1.SizingGrip = false;
         statusStrip1.Stretch = false;
         statusStrip1.TabIndex = 0;
         statusStrip1.Text = "statusStrip1";
         //
         // toolStripStatusLabel1
         //
         toolStripStatusLabel1.Name = "toolStripStatusLabel1";
         toolStripStatusLabel1.Size = new System.Drawing.Size(109,17);
         toolStripStatusLabel1.Text = "toolStripStatusLabel1";
         //
         // Form1
         //
         ClientSize = new System.Drawing.Size(292,273);
         Controls.Add(statusStrip1);
         Name = "Form1";
         statusStrip1.ResumeLayout(false);
         statusStrip1.PerformLayout();
         ResumeLayout(false);
         PerformLayout();
      }
   }
}

1.4.5 列表框、检查列表框及组合框

1.列表框

(1)概述

列表框的名称为ListBox,对应System.Windows.Forms.ListBox类。一般用于在应用程序进行多个选项中的选择(可唯一亦可多选)。其运行时的样子如图1-4所示。

图1-4 列表框

(2)常用属性

(3)常用事件

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ListBox控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

将一个列表框拖入表单后,在其属性框中的Items属性的右方,有一个按钮,单击它,即可设置列表框的项目集合,如图1-5所示。

在这个编辑窗中,每一行字符串为一个列表框项目。

下面看一段VS.NET自动生成的关于列表框的代码。

//声明列表框
private System.Windows.Forms.ListBox listBox1;
//创建列表框
this.listBox1 = new System.Windows.Forms.ListBox();
// 列表框初始化
this.listBox1.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.listBox1.ItemHeight = 12;
//设定列表框的项目集合
this.listBox1.Items.AddRange(new object[] {
"大学本科",
"中学",
"专科",
"小学",
"硕士",
"博士"});
this.listBox1.Location = new System.Drawing.Point(24,32);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(120,64);
this.listBox1.TabIndex = 0;

图1-5 创建列表框

列表框的Items属性为System.Windows.Forms.ListBox.ObjectCollection类型。其Add及AddRange方法可以单个或成批地指定列表框的项目。

如果在程序运行过程中,想取得列表框的当前选项(多选时为选项集合),可以访问其SelectedIndex(单选)或SelectedIndices(多选)属性,如下所示:

int iSelected = listBox1.SelectedIndex;
System.Windows.Forms.ListBox.SelectedIndexCollection selectedSet =
listBox1.SelectedIndices;

如果希望在用户改变当前选项时做出反应,可以编程处理列表框的SelectedIndex Changed事件,如下所示:

private void listBox1_SelectedIndexChanged(object sender,System.EventArgs e){
//取得当前选项
int i = listBox1.SelectedIndex;
//处理代码
}
2.检查列表框

检查列表框名为CheckedListBox,对应System.Windows.Forms.CheckedListBox类,由列表框类继承而来,其作用与使用方法与列表框极其相似,不同之处在于检查列表框以每行打勾的方式进行多选。其运行时的样子如图1-6所示。

图1-6 检查列表框

关于检查列表框的使用,请读者参阅“列表框”部分,这里不再赘述。

3.组合框

(1)概述

组合框的名称为ComboBox,对应System.Windows.Forms.ComboBox类。其作用与使用方法与列表框极其相似,不同之处在于ComboBox是下拉型的,且不支持多选。其运行时的样子如图1-7所示。

图1-7 组合框

(2)常用属性

(3)常用事件

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ComboBox控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

将一个组合框拖入表单后,在其属性框中的Items属性的右方,有一个按钮,单击它,即可设置组合框的项目集合,如图1-8所示。

图1-8 创建组合框

在这个编辑窗口中,每一行字符串为一个组合框项目。下面看一段VS.NET自动生成的关于组合框的代码。

//声明组合框
private System.Windows.Forms.ComboBox comboBox1;
//创建组合框
this.comboBox1 = new System.Windows.Forms.ComboBox();
   //组合框初始化
this.comboBox1.DropDownWidth = 121;
this.comboBox1.ImeMode = System.Windows.Forms.ImeMode.On;
           //给组合框添加项目
this.comboBox1.Items.AddRange(new object[] {
                                          "大学本科",
                                          "中学",
                                          "专科",
                                          "小学",
                                          "硕士",
                                          "博士"});
this.comboBox1.Location = new System.Drawing.Point(24,24);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(121,20);
this.comboBox1.TabIndex = 1;

组合框的Items属性为System.Windows.Forms.ComboBox.ObjectCollection类型。其Add及AddRange方法可以单个或成批地指定组合框的项目。

如果在程序运行过程中,想取得组合框的当前选项可以访问其SelectedIndex属性,如下所示:

int iSelected = listBox1.SelectedIndex;

如果希望在用户改变当前选项时做出反应,可以编程处理组合框的SelectedIndex Changed事件,如下所示:

private void comboBox1_SelectedIndexChanged(object sender,System.EventArgse)
    {
    int iSelected = comboBox1.SelectedIndex; //取当前被选项目
        // 处理代码…..
    }

1.4.6 列表视图和树形视图

1.列表视图

(1)概述

列表视图的名称为ListView,对应System.Windows.Forms.ListView类。其作用与列表框极其相似,不同之处ListView具有图标显示功能。一个列表视图有多个列和项目(System.Windows.Forms.ListView Item)构成。其运行时的样子如图1-9所示。

图1-9 列表视图

(2)常用属性(列表视图)

(3)常用属性(列表视图项目)

(4)常用事件(列表视图)

(5)常用事件(列表视图项目)

列表视图项目没有事件,如果想对其操作做出反应,可以在列表视图的事件响应代码中实现。

(6)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ListView控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

为了给列表视图的项目提供显示图标,还应当创建一个图片列表供其使用。如果希望列表视图显示大图标,则将其LargeImageList属性指向图像列表,并将View属性设为LargeIcon;反之,如果希望列表视图小图标显示,则将其SmallImageList属性指向图片列表,并将View属性设为SmallIcon。

将一个列表视图拖入表单后,在其属性框中的Items属性的右方,有一个按钮,单击它,即可设置列表视图的项目集合,如图1-10所示。

图1-10 设置列表视图的项目集合

在这个编辑窗口中,可以编辑列表视图的项目,给其指定显示图标(ImageList属性)、状态显示图标(StateImageIndex属性)、显示文本(Text)。

下面看一段VS.NET自动生成的关于列表视图的代码。

//声明图片列表
private System.Windows.Forms.ImageList imageListItem;
   //声明列表视图
private System.Windows.Forms.ListView lvItem;
   //声明并创建列表视图的项目,其中,构造函数中指定了显示文本和图标指针
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("Department",0);
System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("Employee",1);
         //省略
System.Windows.Forms.ListViewItem listViewItem8 = new System.Windows.Forms.ListViewItem("Bank",7);
  //创建列表视图
this.lvItem = new System.Windows.Forms.ListView();
//列表视图的初始化
this.lvItem.Alignment = System.Windows.Forms.ListViewAlignment.SnapToGrid;
this.lvItem.FullRowSelect = true;
this.lvItem.GridLines = true;
  //指定列表视图的项目
this.lvItem.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
   listViewItem1,
   listViewItem2,
   listViewItem3,
   listViewItem4,
   listViewItem5,
   listViewItem6,
   listViewItem7,
   listViewItem8});
    this.lvItem.Location = new System.Drawing.Point(8,8);
    this.lvItem.MultiSelect = false;
    this.lvItem.Name = "lvItem";
    this.lvItem.Size = new System.Drawing.Size(72,464); this.lvItem.SmallImageList = this.imageListItem;//指定图标列表
    this.lvItem.TabIndex = 5;
    this.lvItem.View = System.Windows.Forms.View.SmallIcon;//显示小图标

列表视图的Items属性为System.Windows.Forms.ListView.ListViewItemCollection类型。其Add及AddRange方法可以单个或成批地指定列表视图的项目。

如果在程序运行过程中,想取得组合框的当前选项可以访问其SelectedIndices属性,这个属性实际上是一个数组,通过其Count属性取得当前总共被选取的项目数(列表视图可以多选),如下所示:

if ( lvItem.SelectedIndices.Count==0 )
   MessageBox.Show( this,"没有项目被选中" );

如果列表视图被设置为单选,那么可以用如下代码取得其唯一被选项目。

int i = lvItem.SelectedIndices[0];

如果希望在用户改变当前选项时做出反应,可以编程处理列表视图的SelectedIndex Changed事件(列表视图项目没有事件),如下所示:

private void lvItem_SelectedIndexChanged(object sender,System.EventArgs e){
       if (lvItem.SelectedIndices.Count==0)
              return; //没有被选项…
       switch (lvItem.SelectedIndices[0]){ //根据被选项做出不同反应
             case 0:
                 //处理代码
             break;
             case 1:
                 //处理代码
                 break;
             }
}
2.树形视图

(1)概述

树形视图的名称为TreeView,对应System.Windows.Forms.Tree View类。其最常见的作用便是显示磁盘目录。一个树形视图由一系列的树节点构成,这些树节点间表现出层次性的归属关系,最终组成一个树的结构。树节点对应System.Windows.Forms.TreeNode类。其运行时的样子如图1-11所示。

图1-11 树形视图

(2)常用属性(树形视图)

(3)常用属性(树形视图节点)

(4)常用事件及方法(树形视图)

(5)常用事件及方法(树形视图节点)

树形视图节点没有事件成员,只有方法。

(6)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中TreeView控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

为了给树形视图的项目提供显示图标,还应当创建一个图片列表供其使用。并将树形视图的ImageList属性指向对应图片列表。

将一个树形视图拖入表单后,在其属性框中的Nodes属性的右方,有一个按钮,单击它,即可设置树形视图的节点集合,如图1-12所示。

图1-12 设置树形视图的节点集合

在这个编辑窗口中,可以编辑树形视图的节点集,给其指定默认显示图标(Image)、被选中时的图标(Selected Image)、显示文本(Label)。这里可以看到,节点集是树形的结构。除此之外,也可以在程序中添加、删除、修改树形视图的节点集。

下面看一段VS.NET自动生成的关于树形视图的代码。

//声明图片列表
private System.Windows.Forms.ImageList imageList1;
//声明树形视图
private System.Windows.Forms.TreeView treeView1;
//创建树形视图
this.treeView1.ImageList = this.imageList1;
this.treeView1.Location = new System.Drawing.Point(8,16);
this.treeView1.Name = "treeView1";
//成批添加树形视图的节点
this.treeView1.Nodes.AddRange(
new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Node0",
new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Node3"),
new System.Windows.Forms.TreeNode("Node4",
new System.Windows.Forms.TreeNode[] {
new System.Windows.Forms.TreeNode("Node5"),
new System.Windows.Forms.TreeNode("Node7")
}
)
}
),
new System.Windows.Forms.TreeNode("Node1",0,1),
new System.Windows.Forms.TreeNode("Node2")
}
);
this.treeView1.Size = new System.Drawing.Size(192,168);
this.treeView1.TabIndex = 0;

树形视图和树形视图节点的Nodes属性都为System.Windows.Forms.TreeNode Collection类型,可以使用其Add和AddRange方法为树形视图或树节点添加子节点集(如前面代码中的黑体部分);如果要删除一些节点,则可以用Nodes属性中的Remove或RemoveAt方法。此外,Nodes的Count属性表明了子节点的总数,如想访问某个子节点,则可以访问其索引,如下所示:

Node.Nodes[i] //其中i表示子节点的序号

如果在程序运行过程中,想取得树形视图的当前选项可以访问其SelectedNode属性,如下所示:

if ( treeView1.SelectedNode == null )
    MessageBox.Show( this,"没有节点被选中" );

如果希望在用户改变当前选项时做出反应,可以编程处理树形视图的AfterSelect事件(树形视图节点没有事件),如下所示:

private void treeView1_AfterSelect(object sender,System.Windows.Forms.TreeView EventArgs e)
{
System.Windows.Forms.TreeNode selectedNode = e.Node; //取得当前被选节点
   //处理代码…..
}

1.4.7 横滑块、竖滑块、轨道滑块及进度条

1.横滑块

(1)概述

横滑块的名称为HScrollBar,对应System.Windows.Forms.HScrollBar类。一般用于在程序中调整页面横向显示的位置。

(2)常用属性(横滑块)

(3)常用事件及方法(横滑块)

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中HScrollBar控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

下面看一段由VS.NET自动生成的关于滑块控件的代码。

//声明横滑块
        protected internal System.Windows.Forms.HScrollBar HScrollBar1;
        //创建横滑块
this.HScrollBar1 = new System.Windows.Forms.HScrollBar();
        //初始化横滑块
        HScrollBar1.Location = new System.Drawing.Point(16,176);
        HScrollBar1.TabIndex = 3;
        HScrollBar1.Size = new System.Drawing.Size(184,16);
          //指定滑块滑动的位置范围为-100 ~ +100
        HScrollBar1.Minimum = -100;
        HScrollBar1.Maximum = 100;

如果在程序运行过程中希望获取或设定滑块的当前位置,可以访问其Value属性,如下所示:

int iPos = HScrollBar1.Value; //获取位置
HscrollBar1.Value = 78; //设定位置

如果希望在滑块位置发生变动时做出响应,可以对其Scroll事件进行处理,如下所示:

private void HScrollBar1_Scroll(object sender,ScrollEventArgs e) {
  int iPos = HScrollBar1.Value; //获得改变后的滑块位置
  //处理代码….
}
2.竖滑块

竖滑块的名称为VScrollBar,对应System.Windows.Forms.VScrollBar类。一般用于在程序中调整页面纵向显示的位置。

竖滑块与横滑块除了显示方向不同外,属性、事件及处理方法几乎完全相同,此处略去不讲。

3.轨道滑块

(1)概述

横滑块的名称为TrackBar,对应System.Windows.Forms.TrackBar类。一般用于在程序中调整媒体文件的播放位置。

(2)常用属性(轨道滑块)

(3)常用事件及方法(轨道滑块)

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中TrackBar控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

下面看一段由VS.NET自动生成的关于轨道滑块控件的代码。

//声明轨道滑块
protected internal System.Windows.Forms.TrackBar trackbar;
        //创建轨道滑块
    this.trackbar = new System.Windows.Forms.TrackBar();
       //初始化轨道滑块
    this.trackbar.BackColor = System.Drawing.SystemColors.Control;
    this.trackbar.Location = new System.Drawing.Point(8,24);
    this.trackbar.Name = "trackbar";
       //设定轨道滑块的最大刻度为20,最小刻度默认为0
    this.trackbar.Maximum = 20;
    this.trackbar.Size = new System.Drawing.Size(200,42);
    this.trackbar.TabIndex = 0;
    this.trackbar.Text = "trackBar1";

如果在程序运行过程中希望获取或设定滑块的当前位置,可以访问其Value属性,如下所示:

int iPos = trackBar1.Value; //获取位置
trackbar.Value = 12; //设定位置

如果希望在滑块位置发生变动时做出响应,可以对其Scroll事件或ValueChanged事件进行处理,如下所示:

      private void trackbar_Scroll(object sender,System.EventArgs e)
      {
int iPos = trackbar.Value; //取得当前位置
//进行处理
      }
4.进度条

(1)概述

进度条的名称为ProgressBar,对应System.Windows.Forms. ProgressBar类。一般用于在程序中显示一项大型任务(如安装)的执行进度。

(2)常用属性(进度条)

(3)常用事件及方法(进度条)

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ProgressBar控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

下面看一段由VS.NET自动生成的关于进度条的代码。

//声明进度条
      private System.Windows.Forms.ProgressBar progressBar1;
         //创建进度条
      this.progressBar1 = new System.Windows.Forms.ProgressBar();
         //初始化进度条
      this.progressBar1.Location = new System.Drawing.Point(72,88);
            //设定最大进度,最小进度默认为0
      this.progressBar1.Maximum = 50;
      this.progressBar1.Name = "progressBar1";
      this.progressBar1.Size = new System.Drawing.Size(152,23);
      this.progressBar1.TabIndex = 0;

如果在程序运行过程中希望获取或设定进度,可以访问其Value属性,如下所示:

int iPos = progressBar1.Value; //获取当前进度
progressBar1.Value = 12; //设定当前进度

如果要改变进度条的当前进度,有以下两种方法。

① 访问其Value属性

progressBar1.Value = 22;

② 调用PerformStep方法

progressBar1.PerformStep();

PerformStep方法给Value属性加上一个Step,因此这行代码等价于如下代码。

progressBar1.Value = progressBar1.Value + progressBar1.Step;

1.4.8 分页控件

(1)概述

分页控件的名称为TabControl,对应System. Windows.Forms.TabControl类。当窗口的大小不足以显示应用的内容时,一般采用分面控件以页面分页的形式增加显示面积,如图1-13所示。

图1-13 分页控件

一般地,一个分页控件由一个至多个表页组成。表页名为TabPage,对应System. Windows.Forms.TabPage类,拥有自己的属性、事件和方法。

(2)常用属性(分页控件)

(3)常用属性(表页)

(4)常用事件及方法(分页控件)

(5)常用事件及方法(表页)

(6)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中TabControl控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

为了给分页控件的表页点选项提供显示图标,还应当创建一个图片列表供其使用,并将分页控件的ImageList属性指向对应图片列表。

将一个分页控件拖入表单后,在其属性框中的TabPages属性的右方,有一个按钮,单击它,即可设置分页控件的表页集合,如图1-14所示。

图1-14 设置分页控件的表页集合

在这个编辑窗口中,可以编辑分页控件的表页集,给每一个表页指定显示图标(ImageIndex)、显示文本(Text)、浮动帮助文本(ToolTipText)。

为进一步说明分页控件的运行机制,下面看一段由VS.NET自动生成的关于分页控件的代码。

//声明所需的图片列表
protected internal System.Windows.Forms.ImageList imageList1;
//声明表页1---5
protected internal System.Windows.Forms.TabPage tabPage1;
protected internal System.Windows.Forms.TabPage tabPage2;
……
protected internal System.Windows.Forms.TabPage tabPage5;
//声明分页控件
protected internal System.Windows.Forms.TabControl tabControl1;
//创建表页
this.tabPage1 = new System.Windows.Forms.TabPage();
this.tabPage2 = new System.Windows.Forms.TabPage();
……
this.tabPage5 = new System.Windows.Forms.TabPage();
//创建分页控件
this.tabControl1 = new System.Windows.Forms.TabControl();
//表页初始化
tabPage2.Text = "Video";
tabPage2.Size = new System.Drawing.Size(224,193);
tabPage2.ImageIndex = 1;
tabPage2.TabIndex = 1;
……
//分页控件初始化
tabControl1.Location = new System.Drawing.Point(24,32);
tabControl1.Text = "TabControl";
tabControl1.Size = new System.Drawing.Size(232,220);
tabControl1.SelectedIndex = 0;
tabControl1.ImageList = imageList1;
tabControl1.TabIndex = 0;
//指定分页控件与表页之间的从属关系
tabControl1.Controls.Add(tabPage1);
tabControl1.Controls.Add(tabPage2);
tabControl1.Controls.Add(tabPage3);
tabControl1.Controls.Add(tabPage4);
tabControl1.Controls.Add(tabPage5);

在以上代码中,分页控件与表页之间的从属关系也可用以下代码实现。

tabControl1.TabPages.Add(tabPage1);
tabControl1.TabPages.Add(tabPage1);
tabControl1.TabPages.Add(tabPage1);
tabControl1.TabPages.Add(tabPage1);
tabControl1.TabPages.Add(tabPage1);

TabPages属性为System.Windows.Forms.TabPage.TabPageControlCollection类型,其Add和AddRange方法可以单个或成批地把表页加入分页控件中。

分页控件中的表页实际上也是一个控件容器,所有可以放在表单上的控件都可以放在表页上,甚至,可以把一个分页控件放在表页上。

如果在程序运行过程中希望知道分页控件当前选定的表页,可以访问分页控件的SeletedIndex或者SelectedTab属性,其中,SelectedIndex返回被选表页的序号,SelectedTab返回被选表页的引用,如下所示:

int iPage = tabControl1.SelectedIndex;
TabPage tp_Current = tabControl1.SelectedTab;

如果在程序中想改变分页控件的当前页,也可以通过访问SelectedIndex、SelectedTab属性实现,如下所示:

tabControl1.SelectedIndex = 3;
tabControl1.SelectedTab = tabpage_Next;

如果希望在分页控件当前页发生变化时做出响应,可以处理分页控件的SelectedIndex Changed事件,如下所示:

private void tabControl1_SelectedIndexChanged(object sender,System.EventArgs e)
{
  int iPage = tabControl1.SelectedIndex; //取得当前页的序号
//进行处理……
}

1.4.9 Windows Form中的公用对话框

为了提高程序设计的效率,.NET平台还封装了一些系统常用的对话框供开发者使用,这些对话框包括打开文件对话框(OpenFileDialog)、保存文件对话框(SaveFileDialog)、字体对话框(FontDialog)、颜色对话框(ColorDialog)、打印对话框(PrintDialog)、打印预览对话框(PrintPreviewDialog)、页面设置对话框(PageSetupDialog)等。使用.NET提供的这些对话框控件,可以方便快捷地实现一些常用的功能,大大提高编辑效率。

在.NET环境下,常用的公用对话框是以Windows Form控件的形式提供的。事实上,在Windows API中,就提供了相应的对话框功能,只不过.NET类库是以面向对象的形式提供对话框服务的,封装得更彻底、使用更方便。

下表显示了.NET环境下,常用公用对话框对其对应的.NET类。

这里,还有以下两点需要说明。

① 这些对话框所对应的类都在System.Windows.Forms名字空间中。

② 这些对话框只提供给用户一个编辑的接口,具体的任务还需要程序员自行编程完成。比如,打开文件对话框只是返回一至多个文件的名称,真正打开文件的操作要专门编程。

接下来,将逐一讲述这些对话框的作用及其使用方法。

1.打开文件对话框

(1)概述

打开文件对话框的名称为OpenFileDialog,对应System.Windows.Forms.OpenFileDialog类。一般用于在程序供用户打开或创建一个文件。

(2)常用属性

(3)常用事件及方法

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中OpenFileDialog控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗,可设置其各种属性及事件处理函数。

在这里,有必要说明一下Filter字串的格式。如前所述,Filter以通配符形式过滤对话框中显示的文件,一般表现为如下格式:

Text Files (*.txt)|*.txt|Rich Text (*.rtf)|*.rtf|All Files (*.*)|*.*

Filter中每个项目用“|”号分隔,例中的黑体部分表示对话框条件选择中的显示部分,其后紧跟的是文件通配符。不难看出,用如上格式的对话框具有以下三种文件过滤条件选择:

① 显示Text Files (*.txt) 通配符 *.txt

② 显示Rich Text (*.rtf) 通配符 *.rtf

③ 显示All Files (*.*) 通配符 *.*

下面是由VS.NET自动生成的关于打开文件对话框的代码。

//声明
private System.Windows.Forms.OpenFileDialog openFileDialog1;
//创建
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();

当改变打开文件对话框的属性之后,比如修改了过滤字串,VS.NET会自动为其生成如下代码。

this.openFileDialog1.DefaultExt = "rtf";
this.openFileDialog1.Filter =
"Text Files (*.txt)|*.txt|Rich Text Format (*.rtf)|*.rtf|All Files(*.*)|*.*";
this.openFileDialog1.Title = "Open";

如果在程序中需要用到打开文件对话框打开或新建文件,如单击打开或新建菜单时,只需调用打开文件对话框的ShowDialog方法即可,如下所示:

private void OpenMenu_Click(object sender,EventArgs e) {
  if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        editingFileName = openFileDialog1.FileName; //取得指定的文件名
               //处理代码
  }
}

在以上代码中,如果打开文件对话框的ShowDialog方法返回System.Windows.Forms. DialogResult.OK,则表明用户最后单击了打开按钮;访问打开文件对话框的FileName属性则可以取得用户最后选定的文件的文件名。

如果打开文件对话框被指定为可以多选文件(即MultiSelect属性为真),则被选定文件的列表位于FileNames属性中,FileNames属性为一字符串数组,如下所示:

int i;
for (i=0;i<openFileDialog1.FileNames.Length;i++)
{
   sFile = openFileDialog1.FileNames[i]; //取得文件名
   //逐个处理
}

当然,如果希望在用户单击对话框的打开按钮时做出反应,也可以对对话框的FileOK事件进行处理,如下所示:

private void openFileDialog1_FileOk(object sender,System.ComponentModel. CancelEventArgs e)
{
       sFile = openFileDialog1.FileName; //取得文件名
       //处理代码
}

打开文件对话框运行时的样子如图1-15所示。

2.保存文件对话框

(1)概述

保存文件对话框的名称为SaveFileDialog,对应System.Windows.Forms.SaveFileDialog类。一般用于在程序供用户保存文件时指定保存的位置或文件名。

图1-15 打开文件对话框

(2)常用属性

(3)常用事件及方法

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中SaveFileDialog控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

事实上,保存文件对话框的使用方法与打开文件对话框极为相似。

下面一段是由VS.NET自动生成的关于保存文件对话框的代码。

//声明
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
//创建
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();

当改变保存文件对话框的属性之后,比如修改了过滤字串,VS.NET会自动为其生成代码,如下所示:

saveFileDialog1.Filter ="Text Files (*.txt)|*.txt|Rich Text Format (*.rtf)|*.rtf|All Files (*.*)|*.*";
saveFileDialog1.Title = "Save As";

如果在程序中需要用到保存文件对话框指定保存文件的位置和文件名,如单击保存或另存为菜单时,只需调用打开文件对话框的ShowDialog方法即可,如下所示:

private void SaveMenu_Click(object sender,EventArgs e) {
    System.Windows.Forms.DialogResult dr = saveFileDialog1.ShowDialog();
    if (dr == System.Windows.Forms.DialogResult.OK) {
        editingFileName = saveFileDialog1.FileName; //取得文件名
        //处理代码
    }
}

在以上代码中,如果保存文件对话框的ShowDialog方法返回System.Windows.Forms. DialogResult. OK,则表明用户最后单击了保存按钮;访问打开文件对话框的FileName属性则可以取得用户最后指定的文件的文件名。

当然,如果希望在用户单击对话框的保存按钮时做出反应,也可以对对话框的FileOK事件进行处理,如下所示:

private void saveFileDialog1_FileOk(object sender,System.ComponentModel.CancelEventArgs e)
{
      sFile = saveFileDialog1.FileName; //取得文件名
      //处理代码
}
3.字体对话框

(1)概述

字体对话框的名称为FontDialog,对应System.Windows.Forms.FontDialog,一般用于供用户选择字体。

(2)常用属性

(3)常用事件及方法

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中FontDialog控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

下面一段是由VS.NET自动生成的关于字体对话框的代码。

//声明
private System.Windows.Forms.FontDialog fontDialog1;
//创建
this.fontDialog1 = new System.Windows.Forms.FontDialog();

当改变字体文件对话框的属性之后,比如修改了初始字体,VS.NET会自动为其生成代码,如下所示:

//设定初始字体
this.fontDialog1.Font = new System.Drawing.Font("华文仿宋",9F,System.Drawing. FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((System.Byte)(134)));
//对话框提供颜色选择
this.fontDialog1.ShowColor = true;

如果在程序中需要设定字体(如单击字体菜单时),只需调用字体对话框的ShowDialog方法即可,如下所示:

private void FontMenu_Click(object sender,EventArgs e) {
     if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
     {
         selectedFont = fontDialog1.Font; //取得被选定字体
         selectedColor = fontDialog1.Color; //取得被选颜色
         //处理代码
     }
}

在以上代码中,如果字体对话框的ShowDialog方法返回System.Windows.Forms.Dialog Result.OK,则表明用户最后单击了确定按钮;字体对话框的Font属性为System.Drawing. Font类型,它有很多成员,分别表示字体的名称、大小、规格等信息。

字体对话框运行时的样子如图1-16所示。

4.颜色对话框

(1)概述

颜色对话框的名称为ColorDialog,对应System.Windows.Forms.ColorDialog,一般用于供用户选择颜色(系统定义或自定义的)。

图1-16 字体对话框

(2)常用属性

(3)常用事件及方法

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中ColorDialog控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

下面一段是由VS.NET自动生成的关于颜色对话框的代码。

//声明
private System.Windows.Forms.ColorDialog colorDialog1;
//创建
this.colorDialog1 = new System.Windows.Forms.ColorDialog();

如果在程序中需要设定颜色(如单击“改变颜色”按钮时),只需调用颜色对话框的ShowDialog方法即可,如下所示:

protected void btnChangeColor_Click(object sender,EventArgs e) {
       System.Drawing.Color selectedColor;
       DialogResult res = colorDialog1.ShowDialog();
       if (res == DialogResult.OK) {
               selectedColor = colorDialog1.Color; //取得被选颜色
               //处理代码…
       }
}

在以上代码中,如果颜色对话框的ShowDialog方法返回System.Windows.Forms.Dialog Result.OK,则表明用户最后单击了确定按钮;颜色对话框的Color属性为System.Drawing. Color类型,用户选定的颜色通过它返回,这里可以将其理解为一个三元组,分别表示红、绿、蓝三原色。

颜色对话框运行时的样子如图1-17所示。

图1-17 颜色对话框

5.打印对话框

(1)概述

打印对话框的名称为PrintDialog,对应System.Windows.Forms.PrintDialog,在打印时供用户设置打印参数,包括打印范围、输出质量和打印的份数等。

(2)常用属性

(3)常用事件及方法

(4)创建及使用方法

在一个表单的编辑窗口中,打开工具箱。用鼠标选中PrintDialog控件,即可将其拖入对应表单中。VS.NET会自动为其添加各种初始化代码。鼠标右键单击表单上的控件,进入属性窗口,可设置其各种属性及事件处理函数。

当然,除此之外,也可以动态在程序中定义和使用打印对话框,如下所示:

System.Windows.Forms.PrintDialog my_printDialog;
my_printDialog = new System.Windows.Forms.PrintDialog();

下面一段是由VS.NET自动生成的关于打印对话框的代码。

//声明
private System.Windows.Forms.PrintDialog printDialog1;
//创建
    this.printDialog1 = new System.Windows.Forms.PrintDialog();

在讲述打印对话框的使用方法之前,请先看如下一段代码。

private void printButton_Click(object sender,EventArgs e) {
        try {
             PrintDocumentDescent pd = new PrintDocumentDescent();
          printDialog1.Document = pd;
        DialogResult result = printDialog.ShowDialog(); //显示对话框
          if (result == DialogResult.OK) { //最后用户选择了确定
                 pd.Print(); //开始打印
              }
          }
        catch(Exception ex) //打印异常
        { MessageBox.Show("An error occurred printing the file - " +ex.Message);
        }
}

在此段代码中,PrintDocumentDescent为一个用户自定义类,它必须是PrintDocument类的继承(此处没有列出这个类的定义代码)。在代码中,将printDialog1的Document属性指向打印类,这样,就将对话框与打印类联系起来了。在打印对话框的一切设置(关于打印机参数、页数等)都将通过这个引用反映到打印类,即PrintDocument的后代类中。这样,只要重载打印类的Print方法,就可以根据对话框反馈回来的参数做出适当的打印控制。

关于怎么重载PrintDocument类及其Print方法实现打印,将在后续章节中讲到。

这里,有一点需要提醒读者,那就是打印操作是程序中较易发生异常的操作,所以,最好将其用try...catch包起来,以便发生异常时做出适当的反应。

打印对话框运行时的样子如图1-18所示。

图1-18 打印对话框