第10章Windows控件开发进阶•在前一章中介绍了Windows窗体应用程序开发的基础知识,以及一些常用控件的用法。本章将会介绍一些更高级的内容。掌握这些内容将会使WinForms程序界面变得更美观、实用和动态。同时也能处理更多复杂的问题。本章主要涉及到的知识点有:•熟悉菜单和工具栏设计。•编写单文档界面程序和多文档界面程序。•了解窗体的模式,编写自定义对话框。•熟悉Timer控件和日期类控件的用法。•熟悉容器控件的用法。10.1菜单和工具栏•菜单和工具栏几乎是所有窗体应用程序必不可少的一部分,通过菜单和工具栏的设计,可以使整个应用程序逻辑清晰,结构明了。菜单和工具栏也都属于控件的范畴,本章将讲解菜单和工具栏的用法。10.1.1菜单和点菜•【本节示例参考:\源代码\chapter10\10.1.1\MenuExample】•先了解一下实际应用中的菜单,在餐馆中,菜单是各种菜式的罗列与展示;在网站上,菜单是网站功能的集合与用户导航;在窗体程序中,菜单一样是程序功能的汇总与分类。如图10.1展示了各式各样的菜单。•Windows开发用户界面设计中一个非常重要的部分就是菜单,从VisualC#2005开始,菜单的创建就通过MenuStrip控件来实现,此控件聚合了菜单的各种样式,从而使我们编写菜单变得更加容易。图10.2展示了VisualC#2008工具箱中的菜单和工具栏选项卡。10.1.2其他菜单项•【本节示例参考:\源代码\chapter10\10.1.1\MenuExample】•可以看到,菜单项除了MenuItem,还有TextBox、ComboBox和Separator。其中除了Separator外,其他项都可以在一级菜单中出现。•TextBox菜单可以用于接受用户的输入,比如说用户查找、信息搜索等。ComboBox菜单提供一个下拉列表,可以通过选择下拉列表触发不同的事件。如图10.7所示为添加了文本框和下拉列表的菜单效果。•Separator分割条菜单项用于分割同一级的菜单项,使菜单结构更清晰,如图10.8所示。“打开”菜单项和“保存”菜单项之间,以及“另存为”菜单项和“退出”菜单项之间,都加了一个Separator分割条菜单项。10.1.3上下文菜单•【本节示例参考:\源代码\chapter10\10.1.3\ContextMenuStripExample】•上下文菜单是C#中的另外一种菜单,又叫弹出菜单或右键菜单,是在右键单击相应的控件时弹出的菜单。ContextMenuStrip控件提供了与某个控件关联的快捷操作。为了演示上下文菜单的应用,现创建一个Windows应用程序,添加一个菜单控件MenuStrip和一个文本框TextBox,设计好控件布局,如图10.10所示。•下面给文本框添加上下文菜单,在VisualStudio的工具箱中选择上下文菜单工具ContextMenuStrip,将其添加到窗体,编辑菜单项的方法跟上一节的类似。下面给上下文菜单添加“复制”、“剪切”、“粘贴”三个菜单项。10.1.4添加工具栏•【本节示例参考:\源代码\chapter10\10.1.4\ToolBarExample】•工具栏是一组图形化的按钮,提供了菜单的快捷访问,工具栏可以整合软件中常用的操作,增强软件的易用性。在常用的软件系统中,工具栏的使用范围相当广,图10.11所示是网页浏览器Firefox的界面效果,其中工具栏起到很重要的导航作用。再如图10.12所示是文字编辑软件Word的常用工具栏界面效果,Word提供了更加丰富的工具栏,极大地方便了用户操作。下面通过一个实例演示工具栏的应用。10.2SDI和MDI窗体程序•Windows应用程序是由一个个的窗体组成的程序,根据窗体之间的关系,一般将窗体应用程序分为三类:单文档界面(SDI)应用程序、多文档界面(MDI)应用程序和对话框应用程序。本节将对这三种应用程序的形式分别进行介绍。10.2.1SDI应用程序•【本节示例参考:\源代码\chapter10\10.2.1\SDIExample】•单文档界面SDI(SingleDocumentInterface)应用程序。顾名思义,即一个文档充当一个应用程序的主界面。如果再创建一个文档,则是另一个实例了。单文档界面的应用程序软件是非常普遍的,Windows的写字板就是一个典型的单文档界面程序,如图10.13所示。同样,记事本也是单文档界面程序,如图10.14所示。10.2.2MDI应用程序•【本节示例参考:\源代码\chapter10\10.2.2\MDIExample】•多文档界面(MDI)应用程序用于同时显示多个文档,每个文档显示在各自的窗体中。即在一个MDI应用程序中,主窗体文档可以包括多个子窗体。如图10.18所示,为一个MDI应用程序。•可以看到,一个程序可以有很多窗口。通常,这类程序有一个主窗口,主窗口中可以生成很多子窗口。主窗口的菜单中通常有窗口操作的菜单,如图10.19所示。在这个菜单中显示所有的窗口、活动的窗口以及窗口的显示方式等。10.2.3对话框应用程序•【本节示例参考:\源代码\chapter10\10.2.3\DialogExample】•对话框是一种特殊的窗体,用于跟用互交互或者传递信息。对话框的FormBorderStyle属性为FixedDialog,用户可以通过一般的窗体构建对话框,同时也可以像在窗体中添加控件一样,在对话框中添加控件和布局控件样式。同时,.NETFramework还包含了一些常用的对话框,开发人员可以直接将其修改之后,应用于自己的应用程序。•在上一章节,已经学习了几个常用的.NETFramework预定义对话框,如ColorDialog在此就不再介绍了。接下来我们实现自定义对话框,使用自定义对话框的好处是用户可以自定义对话框显示的内容,实现特殊的功能。10.3WinForms高级控件•Windows窗体应用程序以其简单可操作性著称,除了前面介绍的常用控件而外,C#还提供了其他功能丰富的控件供开发人员使用。在本节将介绍几个功能强大的控件的用法。10.3.1日历控件---MonthCalendar•【本节示例参考:\源代码\chapter10\10.3.1\MonthCalendarExample】•日历控件MonthCalendar用于显示日期和选择日期,可以通过日历控件得到当前的日期,也可以得到用户选择的日期。下面通过一个简单的实例来介绍MonthCalendar的用法。•(1)创建Windows应用程序,向窗体中添加一个MonthCalendar控件,添加5个标签控件,如图10.35所示。•(2)编写代码,当窗体加载的时候,显示当前日期,程序代码如下:•privatevoidForm1_Load(objectsender,EventArgse)//窗体加载•{//将每个标签的“Text“属性设置为不同格式的时间•this.label1.Text=this.monthCalendar1.TodayDate.ToString();•this.label2.Text=this.monthCalendar1.TodayDate.ToLongDateString();•this.label3.Text=this.monthCalendar1.TodayDate.ToShortDateString();•this.label4.Text=开始日期:+this.monthCalendar1.SelectionStart.ToString();•this.label5.Text=结束日期:+this.monthCalendar1.SelectionEnd.ToString();•}10.3.2日期选择控件---DateTimePicker•【本节示例参考:\源代码\chapter10\10.3.2\DateTimePickerExample】•日历控件除了MonthCalendar外,还有DateTimePicker控件。跟MonthCalendar控件不同的是,DateTimePicker控件只能选择一个日期,而不是连续的日期段。•通过DateTimePicker控件的Value属性即可获得当前选择的时间值。下面通过一个实例来演示该控件的用法。现创建一个Windows应用程序,设计窗体界面如图10.37所示。•当选择DateTimePicker控件的时间改变时,文本框中将显示相应的时间值。这需要触发DateTimePicker控件的ValueChanged事件,编写事件处理程序代码如下:•privatevoiddateTimePicker1_ValueChanged(objectsender,EventArgse)•{•this.txtDateTime.Text=this.dateTimePicker1.Value.ToString();•}10.3.3计时器控件---Timer•【本节示例参考:\源代码\chapter10\10.3.3\TimerExample】•计时器控件用于在一定的时间间隔调用一段程序代码。现实中经常会遇到这样的情况,比如闹钟每隔1秒钟走动一次,动画片每隔几毫秒时间切换一帧图像等。这些都可以在程序中实现,只要添加一个计时器即可。•Timer控件有两个属性非常重要,一个是Interval,用于设置间隔的时间,以毫秒为单位;一个是Enabled,当设置为False时,计时器失效,为True则计时器有效。同时,Timer还提供了一个Tick事件,每隔Interval设置的时间间隔,程序就会触发一次Tick事件。•下面通过一个倒计时的例子来学习Timer的应用。程序实现的功能是:在一个Label标签中显示一个数字,这个数字从10开始倒计时,每隔1秒,数字减1,当数字减少到1的时候,显示一个感叹号,同时计时器停止。10.3.4面板控件---Panel•【本节示例参考:\源代码\chapter10\10.3.4\ContainerExample】•Panel面板控件是一种类似于GroupBox的容器控件,用于为其他控件提供可识别的分组。使用面板控件的主要功能是细分窗体,使得界面设计更加灵活美观。Panel控件的使用也非常灵活,常用的做法就是将面板添加到主窗体,然后可以在面板中装载更多的控件。下面通过一个简单的程序实例来演示Panel控件的应用,通过Panel控件的显示和隐藏效果来简化界面,达到简洁美观的目的。10.3.5选项卡控件---TabControl•【本节示例参考:\源代码\chapter10\10.3.5\TabControlExample】•选项卡控件的应用在Windows程序中非常普遍,如图10.49为在Windows操作系统中,查看“我的电脑”属性的窗体,和查看“桌面”属性的窗体。其中都用到选项卡控件。10.4小结•本章是WinForms控件操作的进阶篇,分别向读者展示了几种更常用的控件。通过本章,我们学习了以下内容。•(1)菜单是程序常用的功能导航方式。WinForms提供了菜单控件MenuStrip,和上下文菜单控件ContextMenuStrip。•(2)工具栏为程序常用的操作提供了便捷访问的功能,WinForms提供了ToolStrip控件用于实现工具栏。•(3)窗体应用程序分为单文档界面(SDI)应用程序、多文档界面(MDI)应用程序和对话框应用程序。•(4)MonthCalendar控件和DateTimePicker控件都是用于日期类型的选择。•(5)Timer计时器控件能够在一段时间间隔后重复调用一段代码,以此实现许多动态效果。•(6)Panel控件和TabControl控件都是容器控件,容器控件用于方便灵活的布局窗体界面。本章习题•一、选择题•1.在设计菜单时,若希望某个菜单项前面有一个“√”号,应把该菜单项的()属性设置为true•A.Checked•B.RadioCheck•C.ShowShortcut•D.Enabled•2