第8章 界面设计本章主要内容:添加菜单。标准对话框介绍。创建工具栏。实现上下文菜单。创建状态栏。创建一个记事本综合实例。用户界面的设计作为人 机交互的窗口,在成功的程序设计中起着重要的作用。本章将介绍用户界面设计中常用的控件,读者将学习如何为应用程序创建菜单、工具栏、上下 文菜单、多种对话框及状态栏,并通过建立一个记事本应用程序来掌握这些控件的使用。Visual Basic 2005中引入了菜单(Me nuStrip)、弹出菜单(ContextMenuStrip)、工具栏(ToolStrip)和状态栏(StatusStrip)等界 面设计的组件,它们位于工具箱的“菜单和工具栏”部分,如图8-1所示。8.1 创建菜单项用户在运行一个软件时,首先会查看菜单项,来了 解软件的功能,完善的菜单有助于程序的使用。Visual Basic 2005中,将菜单添加到窗体中,是通过MenuStrip控件来 实现的。创建菜单过程非常简单,下面通过创建记事本应用程序的菜单来学习和掌握菜单的建立。例8.1创建记事本应用程序程序,创建记事本的 菜单项。具体操作过程:⑴ 新建项目,选择“Windows应用程序”,项目名为“我的记事本”。⑵ 在解决方案资源管理器中,把“For m1.vb”改为“frmNotePad.vb”。⑶ 打开窗体设计视图,选择窗体,在属性框中修改窗体属性: StartPositio n为“CenterScreen”;Text为“我的记事本”。⑷ 双击工具箱的MenuStrip项,给窗体添加一个MenuStrip 控件。此时,如图8-2所示,在系统为不可见控件(如Timer等)预留的窗体下方区域,显示新添加的MenuStrip控件,在窗体标题 栏下方显示“请在此键入”的提示框。⑸ 选择窗体下方的MenuStrip1控件,在属性框中修改MenuStrip控件属性:选择Ite ms属性,在弹出的对话框“项集合编辑器”中编辑顶级菜单,如图8-3所示。⑹ 在图8-3所示的窗口中,选自左侧的成员“MenuStr ip1”,修改其Name属性为mnuMain。在左侧的下拉列表中选择MenuItem,点击“添加”按钮添加一个“ToolStrip MenuItem1”,修改其Name属性为“mnuFile”,Text属性为“文件(&F)”。通过这样的方法依次添加其余的顶级菜单 ,具体属性设置见表8-1所示。表8-1 顶级菜单属性设置提示:Text属性设置为“文件(&F)”,但却显示为“文件(F)”。这是因 为“&”在菜单中具有特殊含义,如通过在字母“F”前添加“&”设置“F”为访问键,用户可以通过“Alt+F”组合键打开文件菜单。设置 好的主菜单如图8-4所示:顶级菜单完后,记事本界面如图8-5所示⑺ 在图8-4所示的“项集合编辑器”中,选择左侧的mnuFile, 选择DropDownItems属性,在弹出的对话框“项集合编辑器(mnuFile.DropDownItems)”中为顶级菜单“文件 (&F)”添加子菜单,方法同添加顶级菜单。子菜单各项属性设置见表8-2。提示:ShorCutKeys属性设置菜单的快捷键,快捷键类 似于访问键,但它不打开菜单,而直接执行某个菜单命令。设置快捷键和访问键时,应参考广泛使用的Windows应用程序标准,如用户习惯使 用快捷键“Ctrl+N”执行新建文档命令,快捷键“Ctrl+C”用来执行拷贝任务,访问键“Alt+F”用来打开文件菜单。为菜单命令 设置快捷键是通过修改菜单的ShorCutKeys属性来实现的,设置方式参照图8-6所示。图8-6 ShortcutKeys(快捷键 )的设置在设计菜单时,一般把功能相近的菜单设置在一起,并用Separator(分隔符)加以区分。在菜单“另存为…(&A)”和“打印 …(&P)”后分别添加一个Separator。设计好的记事本“文件”菜单如图8-7所示。⑻ 按照以上的方法,为其余的顶级菜单添加子 菜单。各菜单的子菜单属性设置见表8-3、8-4、8-5及8-6。(可参考Windows系统自带的记事本)表8-3 编辑菜单的子菜单 属性设置表8-4 格式菜单的子菜单属性设置表8-5 查看菜单的子菜单属性设置提示:菜单项的Checked属性用来标识该项处于选中、 未选中还是不确定状态。表8-6 帮助菜单的子菜单属性设置⑼ 添加RichTextBox控件,它是记事本编辑核心控件。修改其Name 属性为rtboxMain,Text属性为空,Anchor属性为“Top,Left” ,Dock属性为Fill。提示:RichTex tBox控件是一个功能强大的字处理程序的核心,具有强大的文本格式化功能。Windows内置的“写字板”就是基于RichTextBo x控件。其主要的属性见表8-7:表8-7 RichTextBox控件属性名称及功能说明8.2 对菜单项进行编程设计模式下,在“文件 (F)”菜单的子菜单“新建(N) Ctrl+N”上双击,输入如下代码:Private Sub mnuNew_Click(ByVa l sender As System.Object, _ ByVal e As System.EventAr gs) Handles mnuNew.Click ’清空RichTextBox控件中的内容rtboxMain.Cle ar()End Sub设计模式下,双击工具箱的OpenFileDialog项,给窗体添加一个标准的文件打开对话框,修改其Name属 性为openMyFile。在“文件(F)”菜单的子菜单“打开...( O) Ctrl+O”上双击,输入如下代码:Private Sub mnuOpen_Click(ByVal sender As System.Object, _ByVal e As Sys tem.EventArgs) Handles mnuOpen.Click ''调用“打开”对话框,并对其属性进行修改 With openMyFile ''Filter属性限制打开对话框中显示的文件类型 .Filter = "RTF格式(.rtf)|.rtf|普通文本(.txt)|.txt|所有文件(.)|." .Title() = "打开文件" End With If openMyFil e.ShowDialog() = Windows.Forms.DialogResult.OK Then ''加 载所要打开的文件内容至RichTextBox中 rtboxMain.LoadFile(openMyFile. FileName, RichTextBoxStreamType.RichText) strfilename = openMyFile.FileName Me.stlPath.Text = strfilename End IfEnd Sub提示:RTF是Rich Text Format的简写,它一种保存文本及格式的标准,类似于HTML(超文本 标记语言),使用简单的标记命令来描述文档格式,例如“\b”表示修饰的文本为粗体,有兴趣的读者可以用记事本等文本编辑程序打开RTF文 档,查看其实际的RTF代码。也可以简单理解为TXT格式只是保存了内容及简单的格式信息(字体、字型及大小),RTF文件则保存了文本的 内容及及更多的格式信息(颜色、段落、项目符号等)。设计模式下,双击工具箱的SaveFileDialog项,给窗体添加一个标准的保存 文件对话框,修改其Name属性为saveMyFile。在“文件(F)”菜单的子菜单“另存为...(A)”上双击,输入如下代码:Pr ivate Sub mnuSaveAs_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles mnuSaveAs.Click ''调用“另保存”对话框,并对其属性进行修改 With saveMyFile ''设置默认的文件后 缀名 .DefaultExt = ".rtf" ''.FileName = strfi lename .Filter = "RTF格式(.rtf)|.rtf|普通文本(.txt)|.txt |所有文件(.)|." .Title() = "另存为" ''如果用户指定的文件 名已存在,设置“另存为”对话框是否显示警告。 .OverwritePrompt = True End With ''保存文件 If saveMyFile.ShowDialog() = Windows .Forms.DialogResult.OK _ And saveMyFile.FileName.Length > 0 Then rtboxMain.SaveFile(saveMyFile.FileName, RichTextBoxStr eamType.RichText) strfilename = saveMyFile.FileName Me.stlPath.Text = strfilename End IfEnd Sub提示:RichTex tBox.SaveFile方法用于将 RichTextBox 的内容保存到文件中,参数格式:SaveFile(Path as st ring ,FileType as RichTextBoxStreamType),其中Path为保存当前内容的文件路径,由“另存为 “对话获取,FileType指定以不同格式保存,其值为RichTextBoxStreamType枚举类型之一,见表8-8:表8-8 RichTextBoxStreamType枚举类型在设计模式下,在“文件(F)”菜单的子菜单“保存(S) Ctrl+S”上双击 ,输入如下代码:Private Sub mnuSave_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles mnuSave.Click ''通过str filename变量来确认本文件是否已经保存,如果没有保存调用另存对话框 If (strfilename.Lengt h = 0) Then mnuSaveAs_Click(sender, e) Else rtboxMain.SaveFile(strfilename, RichTextBoxStreamType.Ric hText) End IfEnd Sub在设计模式下,双击工具箱的PageSetupDialog项,给窗体添加一个标准的打印 设置对话框,修改其Name属性为psMyFile。在“文件(F)”菜单的子菜单“页面设置...(U)”上双击,输入如下代码:Pri vate Sub mnuPageSetup_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles mnuPageSetup.Click ''定义一个打印对象,该对象将输出到打印机 Dim pd As PrintDocument = New Pr intDocument psMyFile.Document = pd psMyFile.ShowDia log() End Sub提示:PageSetupDialog 组件是一个预先配置的对话框,用于在基于 Windows 的应 用程序中设置页详细信息以便打印。可允许用户设置边框和边距调整量、页眉和页脚以及纵向或横向打印。提示:PageSetupDialog 组件是一个预先配置的对话框,用于在基于 Windows 的应用程序中设置页详细信息以便打印。可允许用户设置边框和边距调整量、页眉 和页脚以及纵向或横向打印。在设计模式下,双击工具箱的PrintDialog项,给窗体添加一个标准的打印设置对话框,修改其Name属 性为printMyFile。在“文件(F)”菜单的子菜单“打印...(P) Ctrl+P”上双击,输入如下代码:Private Sub mnuPrint_Click(ByVal sender As System.Object, _ B yVal e As System.EventArgs) Handles mnuPrint.Click Dim pd As PrintDocument = New PrintDocument printMyFile.Document = pd If printMyFile.ShowDialog() = Windows.Forms.DialogRes ult.OK Then MessageBox.Show("没有安装打印机!", "出错了!", Messag eBoxButtons.OK, _ MessageBoxIcon.Error, MessageBoxDefaultButton.B utton1) End IfEnd Sub提示:PrintDialog 控件是一个预先配置的对话框,可在基于Wind ows的应用程序中用于选择当前系统已安装的打印机、选择要打印的页以及确定其他与打印相关的设置。需要注意的是PrintDialog对 话框并不将打印数据发送到打印机,完成打印还需编写相应的代码。在设计模式下,在“编辑(E)”菜单的子菜单“撤销(U) Ctrl+ Z”上双击,输入如下代码:Private Sub mnuUndo_Click(ByVal sender As System.Obj ect, _ ByVal e As System.EventArgs) Handles mnuUndo.Cl ick ''获取窗体记事本控件上的活动控件 Dim rtb As RichTextBox = Me.Ac tiveControl ''Undo()方法用于撤消文本框中的上一个编辑操作。 rtb.Undo() End Sub表8-9编辑功能的主要方法在设计模式下,在“编辑(E)”菜单的子菜单“删除(L) Del”上双击,输入如下代码:Priv ate Sub mnuDelete_Click(ByVal sender As System.Object, _ByVal e A s System.EventArgs) Handles mnuDelete.Click rtboxMain.Sele ctedText = ""End Sub8.3 添加查找及替换功能作为文本编辑软件,查找和替换是必不可少的功能。下面分别为记事本添 加查找及替换功能。添加查找功能具体操作过程如下:⑴ 打开例8.1 “我的记事本”项目,选择“项目”->“添加Windows窗体(F )…”,在弹出的“添加新项 – 我的记事本”对话框中选择“对话框”,名称改为“find.vb”,如图8-8所示 。⑵ 点击“添加( A)”,为项目添加了一个对话框,修改对话框的Text属性为“查找”。删除对话框默认的按钮控件,为其添加新的按钮、标签、复选框及文本 框等控件,安照表8-10设置相应的属性。表8-10 查找窗体主要控件属性设置设计好的“查找”对话框如图8-9所示:⑶ 在“查找( F)”按钮上双击,添加以下代码:Private Sub Btnfind_Click(ByVal sender As System. Object, _ ByVal e As System.EventArgs) Handles Btnfind .Click ''定义变量s表示字符串的开始位置 Dim s As Integer ''先判断窗体上的复选 项是否选中 ''根据复选框来确定搜索模式 Dim searchMode As Microsoft.Vis ualBasic.CompareMethod If CheckBox1.Checked = True Then searchMode = CompareMethod.Binary Else searchMode = CompareMethod.Text End If s = InStr(frmNoteP ad.rtboxMain.Text, Me.TextBox1.Text, searchMode) If s = 0 Then MsgBox("没有找到!") Exit Sub End If ''高亮选中找到的字符串 ''确认rtboxMain的Hideselection属性为为false frmNotePad.rtboxMain.Select(s - 1, Me.TextBox1.Text.Length) ''让选中的字符串进入可视区域 frmNotePad.rtboxMain.ScrollToCaret()End Sub⑷ 在“查找下一个(N)”按钮上双击,添加以下代码:Private Sub btnFindNext_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs ) Handles btnFindNext.Click Dim s As Integer Dim se archMode As Microsoft.VisualBasic.CompareMethod If CheckBo x1.Checked = True Then searchMode = Microsoft.VisualBa sic.CompareMethod.Binary Else searchMode = Micr osoft.VisualBasic.CompareMethod.Text End If s = InS tr(frmNotePad.rtboxMain.SelectionStart + 2, _ frmNotePad.rtboxMai n.Text, Me.TextBox1.Text, searchMode) If s = 0 Then MsgBox("找不到" & Me.TextBox1.Text) Exit Sub End If frmNotePad.rtboxMain.Select(s - 1, Me.TextBox1.Text .Length) frmNotePad.rtboxMain.ScrollToCaret() End Sub提示: InStr([Start As Integer,] String1 As String, String2 As String[, Compare As CompareMethod])函数返回一个字符串在另一个字符串中的第一个匹配项的位置,它的返回值为一个整数, 该整数指定一个字符串在另一个字符串中的第一个匹配项的起始位置。其中:Start 可选。数值表达式,设置搜索的起始位置。如果省略该参 数,则从第一个字符位置开始搜索。起始索引从一开始。String1 必选。搜索的 String 表达式。String2 必选。查找的 String 表达式。Compare 可选。指定字符串比较的类型,参见表8-11。如果省略 Compare,则由 Option Compare 设置确定比较类型。表8-11 Compare 参数选项值添加替换功能具体操作过程如下:⑴ 打开 “我的记事本”项目 ,选择“项目”->“添加Windows窗体(F)…”,在弹出的“添加新项 – 我的记事本”对话框中选择“对话框”,名称改为“frm Replace.vb”,如图8-10所示 。⑵ 点击“添加(A)”,为项目添加了一个新对话框,修改对话框的Text属性为“替换”。 删除对话框默认的按钮控件,为其添加新的按钮、标签、复选框及文本框等控件,安照表8-12设置相应的属性。表8-12 查找窗体主要控 件属性设置设计好的“替换”对话框如图8-11所示,在Public Class frmReplace的前、后分别输入以下代码:Imp orts System.Windows.FormsPublic Class frmReplace Dim a = 0 图8-11 设计好的替换对话框⑶ 在“查找下一个(F)”按钮上双击,添加以下代码:Private Sub btnFindNext _Click(ByVal sender As System.Object, _ByVal e As System.EventArg s) Handles btnFindNext.Click Dim s As Integer Dim s earchMode As Microsoft.VisualBasic.CompareMethod If CheckB ox1.Checked = True Then searchMode = Microsoft.VisualB asic.CompareMethod.Binary Else searchMode = Mic rosoft.VisualBasic.CompareMethod.Text End If If a = 0 Then s = InStr(frmNotePad.rtboxMain.Text, Me.TextBo x1.Text, searchMode) a = a + 1 Else s = InStr(frmNotePad.rtboxMain.SelectionStart + 2, _ frmNotePad.r tboxMain.Text, Me.TextBox1.Text, searchMode) End If If s = 0 Then MsgBox("找不到" & Me.TextBox1.Text) Exit Sub End If frmNotePad.rtboxMain.Select(s - 1, Me.TextBox1.Text.Length) frmNotePad.rtboxMain.ScrollT oCaret()End Sub⑷ 在“替换(R)”按钮上双击,添加以下代码:Private Sub btnReplace_Clic k(ByVal sender As System.Object, _ ByVal e As System.E ventArgs) Handles btnReplace.Click If frmNotePad.rtboxMain .SelectedText <> "" Then frmNotePad.rtboxMain.Selected Text = Me.TextBox2.Text End If btnFindNext_Click(sender , e)End Sub⑸ 在“全部替换(A)”按钮上双击,添加以下代码:Private Sub btnReplaceAll_Cli ck(ByVal sender As System.Object, _ByVal e As System.EventArgs) H andles btnReplaceAll.Click frmNotePad.rtboxMain.Text = Rep lace(frmNotePad.rtboxMain.Text, _TextBox1.Text, TextBox2.Text)Msg Box("完成全部替换!")End Sub8.4 创建工具栏工具栏实质是菜单项的快捷方式,是用户执行程序常用功能最方便的方式之一。 不同于菜单栏,工具栏总是可见,可以实现即点即用。工具栏还应该设置工具功能的提示(ToolTip),只要用户将鼠标指向工具栏的按钮, 就知道其功能,方便用户使用。工具栏使用ToolStrip控件创建。下面继续完善记事本,为记事本添加工具栏。例8.2 在例8-1的基 础上,继续完善记事本功能,创建一个工具栏。具体操作过程:⑴ 打开例8-1 “我的记事本”项目,在窗体设计视图下,双击工具箱中的To olStrip项,添加一个新的ToolStrip项到窗体中,修改工具栏(ToolStrip1)的Name属性为“tbrMain”, 现在的记事本窗体如图8-12所示。⑵ 选择工具栏“tbrMain”,打开左下角的下拉列表,选择Button,然后点击“添加”创建一 个新的按钮(见图8-13),设置其属性如表8-13所示:表8-13 新添加的按钮属性设置提示:ToolTipText属性设置当鼠标 滑动到工具栏图标时显示的提示文本。此时运行程序时,新添加的工具栏按钮图标为系统默认的图片,通过修改Image属性,在图8-14所示 对话框,更换按钮显示的图片。提示:Visual Basic 2005的工具栏提供了Windows应用程序常用的工具栏标准项,满足了 大多数应用程序的需求。插入标准项方法:在工具栏上点右键,弹出的菜单中选择“插入标准项”,如图8-15所示,本例中的工具栏采用这种方 法添加,在实际编程中可以根据程序需要对标准项进行删减修改。通过插入标准项的方式创建的工具栏如图8-16所示。图8-15 插入标准项 工具栏右键点击最后一个图标,选择删除。然后选择工具栏各个图标,依次修改其属性如表8-14:表8-14 工具栏上各项的属性设置双击工 具栏上图标,为其添加相应代码,由于具体功能实现代码前面已经添加,现在只需调用相应代码即可,如第一个图标添加如下代码:Private Sub tbarNew_Click(ByVal sender As System.Object, _ByVal e As Sys tem.EventArgs) Handles tbarNew.Click mnuNew_Click(sender, e)End Sub参照以上代码,依次为工具栏上每个图标添加相应代码。8.5 创建上下文菜单上下文菜单(也称右键菜单)是右键点击窗体 上特定对象区域时弹出的菜单。创建上下文菜单是通过ContextMenuStrip控件来实现的。例8.3 在例8-2的基础上,继续完 善记事本功能,为记事本编辑区域创建上下文菜单。具体操作过程:⑴ 打开例8-2 “我的记事本”项目,在窗体设计视图下,双击工具箱中的 ContextMenuStrip项,添加一个新的ContextMenuStrip项到窗体中,修改其Name属性为ctMenu。修改 Items属性,在弹出的“项集合编辑器”窗口,按照表8-15中所示,添加菜单项。表8-15 上下文菜单内容编辑好的“项集合编辑器” 如图8-17所示。图8-17 上下文菜单项设在此需确认rtboxMain(RichTextBoxe控件)的ContextMenuS trip属性为ctMenu(ContextMenuStrip控件),即当在RichTextBoxe控件中点击鼠标右键时弹出上下文菜 单(rtboxMain)。设计好的上下文菜单如图8-18所示。图8-18 右键单击RichTextBox控件的任意处显示上下文菜单 ⑵ 在设计视图下,选择不可见区域中上下文菜单项(ctMenu),在图8-19中双击菜单项“撤销(U)”,输入如下代码:Private Sub conmnuUndo_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles conmnuUndo.Click ''调用mnuUndo_Click()方法 mnuUndo_Click(sender, e)End Sub图8-19 为上下文菜单添加click事件 8.6 创建状态栏状态栏主要用途是给用户提供提示和帮助信息,Windows系统自带的记事本中,状态栏主要作用是显示编辑区域内光标所在的行列信息。创建状态栏是通过StatusStrip控件来实现的。例8.4 在例8-3的基础上,继续完善记事本功能,为记事本创建状态栏,显示当前编辑文档的信息。具体操作过程:⑴ 打开例8-3 “我的记事本”项目,在窗体设计视图下,双击工具箱中的StatusStrip项,添加一个状态栏到窗体中,它会自动粘帖到窗体的底部。修改其Name属性为myStatus。⑵ 选择状态栏,在其左侧点击下拉菜单并选择StatusLabel(见图8-20),这样就创建了一个新的状态栏标签,修改状态栏标签Name属性为“stlPath”,Text为“我的记事本”。图8-20 状态栏项目 ⑶ 添加代码,让状态栏显示当前编辑的文本信息。在mnuOpen_Click及mnuSaveAs_Click方法中,当文件被成功打开或保存后,添加如下代码:Me.stlPath.Text = openMyFile.FileName现在,当记事本打开或者保存一个文件后,在状态栏显示该文件的位置及文件名信息。菜单、工具栏、上下文菜单及状态栏是用户界面设计过程中重要的组成部分,它们增强了应用程序的可用性。本章通过建立一个实用的记事本程序,使读者了解了以上几个常用的用户界面设计控件的使用,具备了基本界面设计的能力。 |
|