版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章WinForms应用程序高级界面设计8.1SDI和MDI简介
8.2窗体菜单设计
8.3窗体工具栏和状态栏设计
8.4实现用户界面增强功能 8.5综合案例:浏览器制作
本章小结
练习与作业
上机部分(八)
学习目标●了解SDI界面和MDI界面的差异●掌握如何创建MDI界面应用程序●掌握创建菜单的方法●掌握窗体工具栏和状态栏的设计方法●了解如何实现用户界面增强功能的方法8.1SDI和MDI简介
窗体是构建MsWindows应用程序的基本模块。传统上,MsWindows应用程序用户界面样式主要有单文档界面(SDI)、多文档界面(MDI)和资源管理器界面三种。
SDI界面的一个示例就是MicrosoftWindows中的“写字板”(Notepad)应用程序。在NotePad中,只能打开一个文档,想要打开另一个文档时,必须先关上已打开的文档。如图8-1所示。
SDI一次只能处理一个文档,如果想要打开第二个文档,就必须运行一个新的SDI应用程序实例,它与第一个实例没有任何关系,对一个实例的任何配置都不会影响另—个实例。例如,在MsPaint的一个实例中,可以将绘图颜色设置为蓝色,如果打开MsPaint的另一个实例,绘图颜色仍是默认的黑色。图8-1单文档界面MDI类似于SDI应用程序界面,但用户可以同时打开多个文档,每一个文档显示在应用程序主窗口客户区的独立窗口中。可以通过是否包含“窗体(Windows)”菜单项,且该菜单中是否具有能在窗口或文档之间进行切换的子菜单项,就能识别出MDI应用程序。
MDI界面的一个示例就是WindowsExcel程序,在Excel中,可以同时打开和使用多个文档。在PowerPoint中,你也可以同时创建和打开多个幻灯片应用程序,电子表格中也允许用户同时对多个图表进行编辑,如图8-2所示。除了以上两个最常用的界面样式SDI与MDI外,第三种界面样式变得越来越流行,这就是资源管理器样式的界面,如图8-3所示。图8-2多文档界面图8-3资源管理器样式界面
资源管理器样式界面是包括有两个窗格或者区域的一个单独的窗口,通常是由左半部分的一个树型的或者层次型的视图和右半部分的一个显示区所组成,如在MsWindows的资源管理器中所见到的那样。这种样式的界面可用于定位或浏览大量的文档、图片或文件。要决定哪种界面样式最合适,需要看应用程序的目的。一个处理保险索赔的应用程序可能适合多文档界面MDI样式,因为职员很可能会同时处理一个以上的索赔,或者需要对两个索赔进行比较。而日历程序最好设成SDI样式,因为不大需要同时打开一个以上的日历。
SDI样式是Windows应用程序较常用的布局选项。创建MDI应用程序有一些需要单独考虑的问题和技巧。8.1.1多文档界面(MDI)应用程序
MDI允许创建在单个容器窗体中包含多个窗体的应用程序,它一般包括三个部分,如图8-4所示。
(1)主窗口:也可称为“MDI容器”,有可改变大小的边框、标题栏、系统菜单等。一个MDI应用程序一般只有一个主窗口,主窗口控制着他各类窗口。
(2)工作空间:提供对下属MDI子窗口的管理,每一个MDI应用程序有一个工作空间。文档或子窗口被包含在工作空间中,不能超出工作空间的范围。
(3)子窗口:当用户打开或创建一个文档时,客户窗口便为该文档创建一个子窗口。每个子窗口都有可以改变大小的边框、标题栏、系统菜单、最小最大化按钮等。任何时刻只有一个子窗口是活动的。图8-4显示在MDI主窗体工作空间内的子窗体
思考:创建MDI会涉及到什么问题呢?
首先,用户希望能完成的任务应是他需要一次打开多个文档的任务;第二,应在应用程序中提供最常用的工具栏,例如“打开”和“保存”文档工具栏;第三,应提供一个包含“窗体(W)”菜单项的主菜单,让用户可以重新定位打开的窗口,显示所有已打开窗体的列表(平铺和层叠);第四,MDI应用程序的另一个功能是如果打开了一个子窗口,该子窗体包含一个菜单,则该子窗体的菜单就应集成到应用程序的主菜单中。8.1.2创建MDI应用程序要创建MDI应用程序,请按照以下步骤执行:首先要像创建其他应用程序那样,在VisualStudio中新建一个Windows应用程序项目,布局好窗体。
1.创建MDI主窗体只需把窗体的IsMdiConhiner属性设置为True即可,如图8-5所示。
2.创建应用程序的子窗体给工程添加一个新窗体。将该窗体的MDIParent属性设置为主窗口的一个引用,该窗体就变成一个MDI的子窗体了。但需要注意:不能通过Propedies面板设置这个属性,只能通过代码来设置。图8-5设置IsMdiConhiner属性设置为True
【例8-1】
创建一个包含MDI主窗体和子窗体的项目。创建步骤:
(1)新建一个Windows应用程序,将其名称设置为Demo8-1。
(2)在“解决方案资源管理器”中右击Form1.cs,在弹出菜单上选择“重命名”,然后将窗体的名称修改为MDIParent.cs。接下来,将窗体的Text属性设置为“MDIParent”,并将它的IsMdiContainer属性设置为True。
VisualC# 将客户区域变为暗灰色,并呈现下陷效果。这是MDI父窗口的标准外观。所有可见的子窗口都在该区域中显示。
(3)在菜单上选择“项目”→“增加Windows窗体”,创建一个新的窗体。将该窗体命名为MDIChild.cs,并将其Text属性改为Child。(4)在“解决方案资源管理器”中双击MDIParent.cs,在设计器中显示父窗口。
(5)添加一个按钮到MDIParent窗体中,双击按钮访问它的Click事件,然后添加下列代码:
privatevoidbutton1_Click(objectsender,EventArgse){MDIChildobjChild=newMDIChild();objChild.MdiParent=this;objChild.Show();}
代码说明:●第一条语句实例化一个新的对象,类型为MDIChild。●最后一条语句无模式地显示该窗体。这里我们感兴趣的是第二条语句。它将窗体的MDIParent属性设置为当前窗体(this总是引用当前对象),当前窗体是一个MDI父窗体,因为它的IsMdiContainer属性设置为True。当显示这样的一个新窗体时,它将作为MDI的一个子窗体。
(6)单击工具栏上的“全部保存”。
(7)按F5键运行程序。注意观察子窗体如何显示在父窗体的客户区域。如果调整父窗体的大小使得一个或多个子窗体不能显示,这时便会出现滚动条(见图8-6)。如果删除了设置MDIParent属性的语句,则窗体将只是浮动在父窗体之上(因为它不再是子窗体),因此不再显示在父窗体的边界之内。
当然,这并不是最吸引人的用户界面,但它是一个好的开始。在后面的案例中,我们将较全面地讲述MDI应用程序。如果你还不了解MDI窗体,不要担心。作为VisualC# 新手,你编写的大多数应用程序都将是SDI程序。当你更熟悉一般的VisualC# 项目的创建时,再开始尝试MDI项目。请记住,不要只是因为可以创建MDI程序而使用MDI;只有在项目需要时才使用MDI。图8-6子窗体只能显示在主窗体的边框之内8.2窗体菜单设计8.2.1菜单概述及属性菜单是Windows软件界面设计的一个重要组成方面。它描述了一个软件的大致功能和风格。所以在程序设计中处理好、设计好菜单,对于一个软件开发是否成功有着比较重要的意义。通常Windows应用程序中的各种任务都可以通过菜单中的命令来实现。传统上,菜单有主菜单和快捷菜单(也可以称为上下文菜单)两种。单击菜单项将执行相应的功能,使得软件的应用变得更加简单,更加人性化。
VisualStudio.NET2005提供了两种菜单控件:主菜单(MenuStrip)和上下文菜单(ContextMenuStrip),它们都在工具箱的“菜单和工具栏”下,如图8-7所示。你可以使用集成开发环境(IDE)来创建菜单,也可以编写代码来创建菜单。但是只有在充分掌握WindowsForms菜单的实质以后,我们才能在程序设计中得心应手地进行窗体菜单程序的开发。在 .NET类库中,定义了一个非常庞大的基础类,以供用户在各种编程中使用。在这些类中,有几个专为用户编写菜单程序所用的类,通过使用这几个类,你可以设计出自己想要的任何菜单。菜单类的体系结构如图8-8所示。图8-7菜单控件
图8-8菜单类的继承层次8.2.2MainMenu菜单控件与ContextMenu菜单控件
MenuStrip控件是VisualStudio.NET 2005和 .NETFramework中的新功能,它取代了MainMenu控件并向其中添加了新功能。MenuStrip控件支持多文档界面(MDI)和菜单合并、工具提示和溢出。你可以通过添加访问键、快捷键、选中标记、图像和分隔条,来增强菜单的可用性和可读性。表8-1显示了MenuStrip和关联类的一些特别重要的属性。表8-2显示了重要的MenuStrip同伴类。
ContextMenuStrip控件替换ContextMenu控件并向其添加功能;但是也可选择保留ContextMenu控件以备向后兼容和将来使用。快捷菜单(也称为上下文菜单)在用户单击鼠标右键时会出现在鼠标位置。可以很容易地将ContextMenuStrip与其他控件关联。表8-1MenuStrip和关联类的重要属性表8-2MenuStrip的同伴类1.向窗体中添加主菜单通过窗体设计器向窗体添加主菜单非常简单。只需要将MenuStrip控件拖放到窗体即可。添加了该控件后,就可以往主菜单中添加各级子菜单,最后添加代码处理菜单项的选择。
1)添加标准菜单
【例8-2】创建一个标准菜单。
【第一步】打开项目并设置窗体。
(1)打开【例8-1】的“MDIExample”的Windows应用程序项目。
(2)在Windows窗体设计器中,选择窗体MDIParent。【第二步】创建标准菜单。
(1)在“工具箱”中,展开“菜单和工具栏”类别。将一个MenuStrip控件拖放到窗体上的任何地方。
(2)右击MenuStrip控件,然后选择“插入标准项”,如图8-9所示。MenuStrip控件会用标准菜单项进行填充。提示:一定要将一个MenuStrip控件拖放到窗体上,而不是非窗体的控件上。有的控件(如GroupBox)可以有自己的菜单,如将MenuStrip控件拖放到该控件上,其结果是为控件创建菜单栏。图8-9添加标准菜单2)编辑菜单项下面讲述如何删除刚才创建的标准菜单。
(1)在Windows窗体设计器中,右击刚才添加的标准菜单项,如“文件(F)”,然后选择“编辑DropDownItems”,如图8-10所示,随后,会显示“项集合编辑器”。
(2)在“项集合编辑器”中,逐一点击菜单项,然后单击,如图8-11所示,将所有菜单项删除。提示:可以使用“项集合编辑器”进行下列操作:删除菜单项、添加菜单项、设置菜单项属性和将菜单项放置于一个下拉菜单中。图8-10选择“编辑”图8-11项集合编辑器3)添加主菜单我们继续讲述主菜单的创建(首先进行第一步和第二步拖放MenuStrip控件到窗体上的操作)。
【第三步】添加菜单项。单击菜单栏上的“请在此处键入”标注,逐一在适当位置输入菜单项名称,如“文件(&F)”,然后按回车,如图8-12所示。
【第四步】处理菜单项事件。
(1)在Windows窗体设计器中,选择“退出”菜单。
(2)双击之;或在“属性”窗体中单击【事件】按钮,选择Click事件,按回车继续。图8-12输入菜单项名,设计主菜单(3)在Click方法的主窗体中输入下列代码:
privatevoid退出XToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}
这是菜单的第一个范例,运行代码,运行结果如图8-13所示,单击“文件”→“退出”,程序将退出运行。图8-13范例运行结果4)向ToolStripMenuItem添加增强功能可以采用下列方式增强菜单(包括MenuStrip和ContextMenuStrip)控件的可用性,如图8-14所示。●添加选中标记以指定打开或关闭某项功能(如在“窗口”菜单上显示哪个子窗体为当前活动窗体)。●添加可视化地表示菜单命令的图像。●显示快捷键以提供代替鼠标执行命令的键盘。例如,按Ctrl+C键执行Copy命令。●显示访问键以提供代替鼠标进行菜单导航的键盘。例如,按Alt+F键选择“文件”菜单。●显示分隔线以便对相关命令进行分组,提高菜单的可读性。图8-14菜单项增强效果(1)添加选中标记。选中菜单项,设置以下属性:●Checked:设置为“true”,显示菜单命令的选中标记。●CheckState:设置为“true”,默认情况下为选中状态。●CheckOnClick:设置为“true”,显示随每次单击更改状态的选中标记。
(2)添加图像。将菜单项Image属性设置为图像的名称。如果此菜单命令的ToolStripItemDisplayStyle属性设置为Text或None,则无法显示该图像。具体操作方法为:点击需要添加图像的菜单项,在其属性窗体中选择“Image”,点击,打开“选择资源”窗体,导入图像,然后单击“确定”,如图8-15所示。提示:图像边距也可以显示选中标记(如果您选择)。此外,您还可以将图像的Checked属性设置为True,这样,在运行时显示的图像周围将带有一个阴影框。图8-15选择资源窗体(3)显示菜单项的快捷键。将菜单项的ShortcutKeys属性设置为所需的键盘组合(如Ctrl+O键表示“打开”菜单命令),并将ShowShortcutKeys属性设置为True。为了显示菜单命令的自定义快捷键,你需要将菜单命令的ShortcutKeyDisplayString属性设置为所需的键盘组合(如Ctrl+Shift+O,而不是Shift+Ctrl+O),并将ShowShortcutKeys属性设置为True。
(4)显示菜单项的访问键。设置菜单命令的Text属性时,在您要为其加上下划线以作为访问键的字母前面输入一个“and”符(&)。例如,键入&Open作为菜单项的Text属性将使菜单命令显示为Open。
若要定位到此菜单命令,请按Alt键使MenuStrip得到焦点,然后按该菜单名的访问键。当菜单打开并显示带访问键的项时,只需按访问键就可选择菜单命令。注意:避免定义重复的访问键,如在同一个菜单系统中两次定义Alt+F。重复访问键的选择顺序无法保证。
(5)在菜单命令之间显示分隔线。定义了MenuStrip及其包含的项之后,请使用AddRange或Add方法将菜单命令和ToolStripSeparator控件按所需顺序添加到MenuStrip中。5)向MDI主窗体添加“窗体”顶级菜单
(1)添加顶级菜单项“窗体”。按照添加菜单项的方法,在菜单控件menuStrip1上添加顶级菜单项“窗体(&W)”。
(2)设置菜单控件menuStrip1的MdiWindowListItem。属性为刚才添加的“窗体ToolStripMenuItem”,如图8-16所示。
(3)处理菜单项事件,编写“新建”菜单项的代码。双击“新建”菜单项,在其Click事件中,编写新建MDI子窗体的如下代码:
MDIChildobjChild=newMDIChild();objChild.MdiParent=this;objChild.Show();图8-16MDI窗体的“窗体”菜单6)排列MDI子窗体
MDI应用程序常包含对打开的子窗体进行操作的命令,如“层叠”、“水平平铺”、“垂直平铺”等,可通过LayoutMdi方法来实现,该方法的输入参数即排列的样式,为枚举值MDILayout,该枚举值的成员和说明见表8-3所示。
【第一步】为顶级菜单项“窗体”添加下级菜单项“层叠”、“水平平铺”、“垂直平铺”。
【第二步】处理菜单项事件。
(1)为“层叠”菜单项的Click事件添加如下代码:
this.LayoutMdi(MdiLayout.Cascade);(2)为“水平平铺”菜单项的Click事件添加如下代码:
this.LayoutMdi(MdiLayout.TileHorizontal);(3)为“垂直平铺”菜单项的Click事件添加如下代码:
this.LayoutMdi(MdiLayout.TileVertical);表8-3排列MDI子窗体说明【第三步】保存,运行该项目。
(1)两次单击“新建”菜单项,创建两个MDI子窗体。
(2)单击菜单“窗体”→“水平平铺”,将显示MDI子窗体水平平铺的效果,如图8-17所示。
(3)单击菜单“窗体”→“垂直平铺”,将显示MDI子窗体垂直平铺的效果。
(4)单击菜单“窗体”→“层叠”,将显示MDI子窗体层叠的效果。
(5)单击菜单“窗体”→“1MDIChild”,可以切换当前活动的MDI子窗体。
2.向窗体中添加快捷菜单右击计算机的桌面打开如图8-18所示的快捷菜单。图8-17运行效果
图8-18快捷菜单ContextMenuStrip控件提供了与某个控件关联的快捷菜单。快捷菜单会在用户在窗体中的控件或特定区域上单击鼠标右键时显示。快捷菜单通常用于组合来自窗体的一个MenuStrip的不同菜单项,便于用户在给定应用程序上下文中使用。例如,可以使用分配给TextBox控件的快捷菜单提供菜单项,以便更改文本字体,在控件中查找文本或实现复制和粘贴文本的剪贴板功能。还可以在快捷菜单中显示不位于MenuStrip中的新的ToolStripMenuItem对象,从而提供与特定情况有关且不适合在MenuStrip中显示的命令。许多可视控件(以及Form本身)都有一个Control.ContextMenuStrip属性,该属性将ContextMenuStrip类绑定到显示快捷菜单的控件。多个控件可使用一个ContextMenuStrip。
把上下文菜单控件拖放到窗体上,并给它添加菜单项,就可以创建一个上下文菜单,其方式与MenuStrip控件相似,唯一的区别是上下文菜单上没有顶级菜单项。为了将上下文菜单绑定到窗体的控件上,需要选择该控件,并设置它的ContextMenuStrip属性,使之指向刚才创建的上下文菜单。
【例8-3】创建一个使用上下文菜单的范例。
(1)新建一个Windows应用程序,将其名称设置为Demo8-3。
(2)将默认创建的窗体名称设置为frm8_3,将窗体的标题设置为“范例8-3”。(3)在窗体frm8_3上创建两个文本框控件,分别命名为txtUserID和txPWD,我们随后会将快捷菜单附加到这两个文本框,允许用户清除输入文本;并将txPWD的“PasswordChar”属性设置为“*”。
(4)创建两个标签,并将其Text属性分别设置为“用户名:”和“口令:”。
(5)创建上下文菜单,并输入菜单项。在“工具箱”中,展开“菜单和工具栏”类别。将一个ContextMenuStrip控件拖动到窗体上的任何地方。窗体底部会出现一个名为contextMenuStrip1的ContextMenuStrip对象,并在窗体顶部显示另一个菜单栏,如图8-19所示。图8-19ContextMenuStrip控件
注意:这只是快捷菜单的临时位置。运行时,由用户鼠标右键的位置来决定其实际显示位置。选择ContextMenuStrip1控件,将其命名为“contextMenuTextBox”。选择窗体上部的ContextMenuStrip菜单的下方,单击“请在此处输入”标注,输入“清除文本”,按回车;然后在第2个“请在此处输入”标注处输入“退出”,按回车。
(6)将上下文菜单与文本框关联。
单击txtUserID控件,在“属性”窗口中,将“ContextMenuStrip”属性更改为上下文菜单的名“contextMenuTextBox”。
同样方法,设置txtPWD控件的“ContextMenuStrip”为“contextMenuTextBox”。(7)在ContextMenuStrip的Opening事件中添加下列代码:
privatevoidcontextMenuTextBox_Opening(objectsender,CancelEventArgse){this.Tag=((ContextMenuStrip)sender).SourceControl;}
代码说明:
Sender参数就是上下文菜单contextMenuTextBox对象。它包含“SourceControl”属性,非常有用,它引用了调用上下文菜单时正在访问的控件。上述语句的作用是将当前文本框的一个引用存储到窗体的Tag属性中。(8)返回设计视图,在“清除文本”菜单项的“Click”事件中添加以下语句:
privatevoid清除文本ToolStripMenuItem_Click(objectsender,EventArgse){if(this.Tag.Equals(txtUserID)){txtUserID.Clear();txtUserID.Focus();}else{txtPWD.Clear();txtPWD.Focus();}}
代码说明:① if语句是用来判断哪个是文本框,并对其清除。②文本框的Focus方法使该文本框获得焦点。需要提醒的是,右击一个控件,则不会使它获得焦点。
(9)保存项目,并运行。运行结果如图8-20所示。
任意右击两个文本框,会显示上下文菜单。
任意在文本框txtUserID上输入字符,右击,单击“清除文本”,则该文本框内容会被清除。图8-20运行结果8.2.3实例1:菜单制作以下程序演示菜单的常规使用。该程序显示一个“快乐的程序员”的标签,可根据菜单项显示在窗体的不同位置(居左、中、右),也可设置标签的显示颜色。其显示效果如图8-21所示。创建步骤:
(1)新建一个Windows应用程序项目,并将其命名为HappyMan。
(2)将Form1.cs重命名为frmHappys.cs;将窗体的Name属性更改为frmHappy,并将Text属性更改为“快乐的程序员”。
(3)单击“视图”→“工具箱”,为该窗体添加一个Label控件,并设置主要属性,如表8-4所示;再为该窗体添加一个openFileDialog控件。图8-21程序界面表8-4为Label控件设置的主要属性(4)单击“视图”→“工具箱”,展开“菜单和工具栏”类别。将一个MenuStrip控件拖动到窗体上的任何地方。
(5)单击菜单栏上的“请在此处键入”标注,输入两个顶级菜单项,“文件(&F)”和“设置(&S)”,然后按回车。
(6)单击“文件(&F)”菜单项下方显示的“请在此处键入”标注,输入“打开”和“关闭”两个菜单项;再右击“文件(F)”菜单项,选择“编辑项”,添加一个间隔符,并点击向上的箭头将其移动到两个菜单项的中间。
(7)单击“设置(S)”菜单项下方显示的“请在此处键入”标注,输入“颜色”和“显示位置”两个菜单项。
(8)单击“颜色”菜单项右方显示的“请在此处键入”标注,输入“红”、“蓝”和“绿”三个菜单项,并设置主要属性,如表8-5所示。表8-5为三个菜单项设置的主要属性(9)单击“显示位置”菜单项右方显示的“请在此处键入”标注,输入“左”、“中”和“右”三个菜单项,并设置主要属性,如表8-6所示。
(10)返回设计视图,单击“打开”菜单项,在“属性”窗体中单击【事件】按钮,选择Click事件,双击,在Click事件方法中添加以下语句:
privatevoid打开OToolStripMenuItem_Click(objectsender,EventArgse){//显示openFileDialog1对话框,选定一个文本文件
this.openFileDialog1.ShowDialog();}表8-6为三个菜单项设置的主要属性(11)在“关闭”菜单项的Click事件方法中添加以下语句:
privatevoid关闭CToolStripMenuItem_Click(objectsender,EventArgse){this.Close();}(12)在“红”菜单项的Click事件方法中添加以下语句:
privatevoidmenuRed_Click(objectsender,EventArgse){//设置颜色
labCaption.ForeColor=Color.Red;//改变菜单项的Checked属性
menuRed.Checked=true;menuBlue.Checked=false;menuGreen.Checked=false;}(13)在“蓝”菜单项的Click事件方法中添加以下语句:
privatevoidmenuBlue_Click(objectsender,EventArgse){//设置颜色
labCaption.ForeColor=Color.Blue;//改变菜单项的Checked属性
menuRed.Checked=false;menuBlue.Checked=true;menuGreen.Checked=false;}(14)在“绿”菜单项的Click事件方法中添加以下语句:
privatevoidmenuGreen_Click(objectsender,EventArgse){//设置颜色
labCaption.ForeColor=Color.Green;//改变菜单项的Checked属性
menuRed.Checked=false;menuBlue.Checked=false;menuGreen.Checked=true;}(15)在“左”菜单项的Click事件方法中添加以下语句:
privatevoidmenuLeft_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleLeft;
//改变菜单项的Checked属性
menuLeft.Checked=true;menuMiddle.Checked=false;menuRight.Checked=false;}(16)在“中”菜单项的Click事件方法中添加以下语句:
privatevoidmenuMiddle_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleCenter;//改变菜单项的Checked属性
menuLeft.Checked=false;menuMiddle.Checked=true;menuRight.Checked=false;}(17)在“右”菜单项的Click事件方法中添加以下语句:
privatevoidmenuRight_Click(objectsender,EventArgse){labCaption.TextAlign=ContentAlignment.MiddleRight;//改变菜单项的Checked属性
menuLeft.Checked=false;menuMiddle.Checked=false;menuRight.Checked=true;}(18)保存并生成应用程序,执行应用程序。8.3窗体工具栏和状态栏设计8.3.1工具栏设计通过菜单可以访问应用系统中的大多数功能,把一些菜单项放在工具栏中和放在菜单中作用相同。放置于工具栏中的菜单项一般是用户常用的选项,例如Excel的“新建”、“打开”和“保存”等。工具栏提供了单击访问程序中功能的方式,当然,通过工具栏访问程序的功能要比通过菜单来访问程序的功能要少—些,但用户单击一个一直可见的按钮,要比在菜单中导航方便得多。图8-22显示了MsExcel可见的工具栏部分。图8-22MsExcel工具栏
工具栏上的按钮通常包含图标,不包含文本,但它可以既包含图标又包含文本。包含文本的工具栏按钮有MSInternetExplorer中的工具栏。如把鼠标指针停留在工具栏中的—个按钮上,就会显示一个提示,说明该按钮的用途信息。
VisualStudio2005提供ToolStrip控件来实现工具栏,它在工具箱的“菜单和工具栏”下,如图8-7所示。ToolStrip控件可创建易于自定义的常用工具栏,让这些工具栏支持高级用户界面和布局功能,如停靠、漂浮、带文本和图像的按钮、下拉按钮和控件、【溢出】按钮和ToolStrip项的运行时重新排序等。ToolStrip替换了早期版本的控件并添加了功能,但是仍可以在需要时选择保留ToolBar以备向后兼容和将来使用。与以前的控件相比,ToolStrip控件和类提供了以下改进:●更为一致的事件模型。●包含任务列表和项集合编辑器的更加一致的设计时行为。●通过ToolStripManager和ToolStripRenderer进行自定义呈现。●具有ToolStripContainer和ToolStripPanel的内置漂浮(在停靠时共享工具区域内的水平或垂直空间)。●通过AllowItemReorder属性在设计时和运行时对项重新排序。●通过CanOverflow属性将项重定位到溢出菜单。●具有ToolStripContainer、ToolStripPanel和ToolStripContentPanel的完全可配置的控件位置。●使用ToolStripControlHost承载ToolStrip、传统控件或自定义控件。●使用ToolStripPanel合并ToolStrip控件。ToolStrip控件是高度可配置的、可扩展的控件,它提供了许多属性、方法和事件,可用来自定义外观和行为。表8-7为ToolStrip控件的重要成员。表8-7ToolStrip控件的重要成员
下面介绍建立工具栏的步骤。
(1)在窗体中加入控件。打开项目,从工具箱的“菜单和工具栏”下将ToolStrip控件加入到主窗体中。可以发现,该控件的默认位置是窗体顶部。
注意:如窗体已有主菜单,有时候工具栏位于窗体顶部(在主菜单之上),设计器界面无论怎么拖位置都不改变,你可以通过在ToolStrip上右键“置于顶层”和“置于底层”来调整。
(2)为工具栏添加按钮。加入的工具栏上并无按钮,需要用户自己添加。要添加按钮,单击ToolStrip控件,在弹出的图标上点向下箭头,然后从下拉式菜单中选择Button可添加按钮。你还可以选择其他种类,如分隔条、下拉框等。添加按钮的方法如图8-23所示。图8-23为工具栏添加按钮(3)为按钮添加图片。选择要添加图片的按钮,设置其Image属性即可。
(4)为按钮添加提示信息。选择按钮,设置其ToolTipText属性即可。
(5)将按钮与菜单命令相链接。选择按钮,在其Click事件中,选择相应菜单项点击事件。
(6)为按钮添加事件响应代码。选择按钮,在“属性”窗口中单击【事件】按钮,选择相应事件,双击进入代码编辑器,输入相应代码即可。8.3.2状态栏设计状态栏通常位于窗体的底部,用于显示当前的状态和一些提示信息,如按钮和菜单的功能、鼠标的位置等。MSWord的状态栏如图8-24所示,状态栏中的面板可以用凹陷下去的部分来区分。
VisualStudio2005提供StatusStrip控件来实现状态栏,它在工具箱的“菜单和工具栏”下,如前面图8-7所示。通常,StatusStrip控件由ToolStripStatusLabel对象组成,每个这样的对象都可以显示文本、图标或同时显示这二者。StatusStrip还可以包含ToolStripDropDownButton、ToolStripSplitButton和ToolStripProgressBar控件。图8-24Word的状态栏默认StatusStrip控件没有面板。若要向StatusStrip中添加面板,请使用以下方法:
System.Windows.Forms.ToolStripItemCollection.AddRange(System.Windows.Forms.ToolStripItem[])
重要的StatusStrip成员如表8-8所示。表8-8StatusStrip控件的重要成员
重要的StatusStrip伴生类如表8-9所示。表8-9StatusStrip控件的伴生类
下面介绍建立状态栏的步骤。
(1)在窗体中加入控件。打开项目,从工具箱的“菜单和工具栏”下将StatusStrip控件加入到主窗体中。可以发现,该控件的默认位置是窗体底部。
(2)为状态栏添加子对象。加入的状态栏上并无子对象,需要用户自己添加。要添加子对象,单击StatusStrip控件,在弹出的图标上点向下箭头,然后从下拉式菜单中选择StatusLabel可添加状态文本。你还可以选择其他种类,如进度条、下拉按钮等。添加子对象的方法如图8-25所示。图8-25为状态栏添加子对象(3)为StatusLabel子对象显示提示信息,如“广东科学技术职业学院”。状态栏是用于显示提示信息的,可以通过直接设置StatusLabel子对象的Text属性来显示,也可编写代码,使其在程序运行时显示提示信息。如在主窗体的Load事件中加入下列代码:
ToolStripStatusLabel1.Text=DateTime.Today.ToShortDateString();
这样,主窗体的状态栏将显示打开主窗体的日期。注意:默认情况下,多个提示信息间无分隔,如需要在状态栏上分格,你只要将每个Item的BorderSides属性设置为“右”就可以了。8.3.3实例2:制作带工具栏和状态栏的应用程序以下的程序演示了工具栏和状态栏的常规使用。
【第一步】新建一个Windows应用程序项目,并将其命名为Tool-status。
【第二步】将Form1.cs重命名为frmToolStatus.cs,将窗体的Name属性更改为frm-ToolStatus,并将Text属性更改为“多功能工具栏和状态栏”。
【第三步】单击“视图”→“工具箱”,为该窗体添加如表8-10所示的控件,并设置主要属性。
【第四步】设置工具栏。
(1)右击ToolStrip,选择“插入标准项”。
(2)在属性窗口中选择Items,点击。(3)在项集合编辑器窗体中添加一个DropDownButton,并设置它的Text属性为“颜色”,设置DisplayStyle为Text,如图8-26所示。
(4)选择DropDownItems属性,单击,将打开ToolStripMenuItem的项集合编辑器窗体,然后加入三个菜单子项,如表8-11所示。
(5)返回设计视图,在菜单项的Click事件中添加下列代码。在菜单项“红”的Click事件中添加:
privatevoidtsMenuRed_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.Red;}
在菜单项“蓝”的Click事件中添加:
privatevoidtsMenuBlue_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.Blue;}
在菜单项“白”的Click事件中添加:
privatevoidtsMenuWhite_Click(objectsender,EventArgse){rtbEdit.BackColor=Color.White;}表8-10frmToolStatus的控件列表图8-26为工具栏添加子对象DropDownButton表8-11frmToolStatus的控件列表【第五步】设置状态栏。
(1)在设计视图中,右击StatusStrip控件,选择“编辑项”,将打开项集合编辑器窗体。
(2)在项集合编辑器窗体中,加入三个StatusLabel。
(3)逐一为三个新添加的StatusLabel设置以下属性,见表8-12。表8-12设置状态栏StatusLabel的属性【第六步】添加代码,使程序运行时状态栏呈现不同的提示信息。
(1)为了让statusLabTime显示当前时间件,需要在Timer控件的Tick事件中添加下列代码:
privatevoidtimer1_Tick(objectsender,EventArgse){//在状态栏上显示系统时间
DateTimedTime=DateTime.Now;strings=dTime.ToLongTimeString();this.statusLabTime.Text=s;}(2)为了显示当前鼠标位置,需要在RichTextBox控件的MouseDown事件中添加下列代码:
privatevoidrichTextBox1_MouseDown(objectsender,MouseEventArgse){//检查鼠标位置,改变状态栏
intx=Cursor.Position.X;inty=Cursor.Position.Y;this.statusLabPosition.Text="鼠标位置X="+x.ToString()+"Y="+y.ToString();}(3)为了显示Ins键的按键情况,需要在RichTextBox控件的KeyUp事件中添加下列代码:
privatevoidrichTextBox1_KeyUp(objectsender,KeyEventArgse){//检查键盘信息,如果是Insert就改变状态栏的状态
if(e.KeyCode==Keys.Insert){strings=this.statusLabKey.Text;if(s.Equals("INS"))this.statusLabKey.Text="OVR";elsethis.statusLabKey.Text="INS";}}
【第七步】保存并运行代码,程序运行结果如图8-27所示。
(1)状态栏分别显示鼠标位置、当前时间、Ins键的按键情况。
(2)按下Ins键,会发现第三栏提示信息改变为OVR,再次按下Ins键,提示信息恢复为INS。
(3)单击鼠标,会发现第一栏提示信息会显示相应鼠标位置。
(4)按住Alt键不放,可拖动tool-bar中的按钮。
(5)单击“颜色”→“红”,会发现富文本框的背景颜色变为红色。图8-27运行结果8.4实现用户界面增强功能8.4.1透明窗体、不规则窗体的实现
1.创建透明Windows窗体窗体有一个很酷的属性是Opacity属性,该属性控制窗体及其所有控件的透明性。缺省的Opacity属性值是100%,意味着窗体及其控件是完全不透明的(实心的),而属性值0%表示创建完全透明的窗体。属性值50%表示创建一个透明度在实心和不可见之间的窗体。
注意:因为只有在Windows2000或更新的操作系统中才支持透明窗体,所以在较旧的操作系统(如Windows 98)上运行时,不论为Opacity属性设置的值是什么,Windows窗体都是完全不透明的。
控制Windows窗体的不透明度,你可以在窗体的“属性”窗口中,将Opacity属性设置为一个介于0.0(完全透明)~1.0(完全不透明)之间的值;也可以编程方式控制Windows窗体的不透明度,将Opacity属性设置为一个介于0.0(完全透明)~1.0(完全不透明)之间的百分数,Opacity属性是Double值类型。
【例8-4】
在下面的示例中,我们将创建一个窗体,点击【开始】按钮后,该窗体逐渐透明。
(1)新建一个Windows应用程序,将其名称设置为Demo8-5。
(2)将默认窗体的标题设置为“逐渐透明的窗体”。
(3)在主窗口中添加两个Button控件、四个Label、一个TrackBar和一个Timer,如表8-13所示。表8-13主窗体控件添加的控件(4)点击【开始】按钮后,该窗体逐渐透明。在button1控件的Click事件中编写下列代码:
privatevoidbutton1_Click(objectsender,System.EventArgse){ //计时器开始计时
timer1.Start();}(5)在timer1控件的Tick事件中编写下列代码:
privatevoidtimer1_Tick(objectsender,System.EventArgse){//如果透明度大于0,则每次减少0.01,否则,透明度重设为1 if(this.Opacity>0){this.Opacity=(this.Opacity*100-1)/100;doublep=this.Opacity*100;label4.Text=p.ToString()+"%";}else{ this.Opacity=1; label4.Text="100%";}}(6)在button2控件的Click事件中编写下列代码:
privatevoidbutton2_Click(objectsender,System.EventArgse){//计时器停止
timer1.Stop();//窗体透明度属性还原为1this.Opacity=1;label4.Text="100%";}(7)在trackBar1控件的Scroll事件中编写下列代码:
privatevoidtrackBar1_Scroll(objectsender,System.EventArgse){ //设置Timer控件的Interval属性
timer1.Interval=trackBar1.Value; label2.Text=timer1.Interval.ToString()+"毫秒";}(8)保存项目,并运行。运行界面如图8-28所示。图8-28逐渐透明窗体的运行界面2.创建不规则Windows窗体创建非矩形窗体的过程有两个步骤:创建成形的窗体;编写某些编程逻辑的代码以允许移动和关闭窗体。第二个步骤是必要的,因为自定义形状的窗体没有标题栏,并且它本身不具有任何功能,例如在屏幕中移动窗体以及关闭窗体的能力。因此,编写重现这些功能的代码是非常必要的。创建非矩形窗体的过程包含三个步骤:
(1)创建一个作为窗体图面的位图。
(2)创建Windows应用程序项目,将窗体FormBorderStyle属性设置为“None”,并使用位图作为窗体背景。该窗体需要设置的属性如表8-14所示。表8-14创建特定形状窗体需要设置的属性(3)输入重新创建标题栏所提供功能的代码,例如移动和关闭窗体。
注意:如果监视器的颜色深度设置大于24位,则不管TransparencyKey属性是如何设置的,窗体的非透明部分都会产生显示问题。若要避免出现这种问题,请确保“显示”控制面板中的监视器颜色深度的设置小于24位。
【例8-5】创建一个不规则窗体。创建步骤:
(1)绘制不规则窗体位图。可以使用任意一种你喜欢的作图工具,制作一个有形状的位图,背景使用一种其他的颜色。这个颜色在编程中用得着,所以最好使用一种容易记忆的颜色。如图8-29所示,本例中使用的背景色为黄色(#ffff00/yellow),文件名为bk.bmp。图8-29背景位图(2)新建一个Windows应用程序项目,并将其命名为Demo8-5。
(3)将Form1.cs重命名为frmNotRect.cs;将窗体的Name属性更改为frmNotRect,并设置以下属性:●将FormBorderStyle属性设置为None。●将窗体的BackgroundImage属性设置为先前创建的位图文件。不必将文件添加到项目系统中,这将在指定该文件作为背景图像时自动完成。●将TransparencyKey属性设置为位图文件的背景色,本例中为黄色。(此属性告诉应用程序窗体中的哪些部分需要设置为透明)
这时你就可以按F5键测试你的程序,可以看到如图8-29所示的窗体。现在窗体还不能拖动,只能通过结束程序,或者按Alt+F4键关闭。下面我们编写相应的代码来实现标题栏的相应功能。
(4)设置窗体的移动操作,我们要用到两个全局变量:
privatePointmouseOffset; //记录鼠标指针的坐标
privateboolisMouseDown=false; //记录鼠标按键是否按下
(5)为窗体的MouseDown事件创建一个事件处理程序。在处理程序中添加下列代码:
privatevoidfrmNotRect_MouseDown(ob
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版离婚合同:两个孩子抚养与财产分配版B版
- 2025年度文化产业园物业委托管理服务合同4篇
- 2025年度商用厨房设备安全检测及认证合同3篇
- 2025年度土地承包经营权流转纠纷调解合同模板4篇
- 2025年度珠宝首饰代工定制合同范本(高品质)4篇
- 2024美甲店美甲技师劳务外包合同参考3篇
- 2025年度智能化工厂承包合同范本8篇
- 2025年度水资源综合利用项目承包合作协议样本4篇
- 2024版画室合伙协议合同范本
- 2025年LED照明产品智能照明系统集成设计与施工合同3篇
- 《压力性尿失禁》课件
- 国企综合素质测评试题
- 肺功能检查的操作与结果解读
- 松辽盆地南部致密砂岩储层成因与天然气聚集模式研究的中期报告
- 急性戊肝护理查房
- 打样员工作总结
- JGJT411-2017 冲击回波法检测混凝土缺陷技术规程
- 某新能源(风能)公司:风电场岗位月度绩效考评管理办法
- 污水管网沟槽槽钢支护专项方案
- 深静脉血栓(DVT)课件
- 2023年四川省广元市中考数学试卷
评论
0/150
提交评论