菜单的设计和MDI程度的设计剖析_第1页
菜单的设计和MDI程度的设计剖析_第2页
菜单的设计和MDI程度的设计剖析_第3页
菜单的设计和MDI程度的设计剖析_第4页
菜单的设计和MDI程度的设计剖析_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第8章 菜单的设计和MDI程序设计 第8章 菜单的设计和MDI程序设计 8.1 菜单的设计菜单的设计 8.2 多文档界面多文档界面(MDI) 8.3 工具栏工具栏 8.4 对话框对话框 习题八习题八 第8章 菜单的设计和MDI程序设计 8.1 菜菜 单单 的的 设设 计计 1菜单编辑器窗口的用法菜单编辑器窗口的用法 菜单编辑器主要分为三个部分:菜单按键属性区、编辑区和菜单显示区。下面详细介绍菜单编辑器的各部分功能。 (1) “标题(Caption)”文本框,让用户键入显示在窗体上的菜单标题,键入的内容会在菜单编辑器窗口的下边空白部分显示出来,该区域称为菜单显示区域。如果输入时在菜单标题的某个字

2、母前输入一个符号,那么该字母就成了热键字母,在窗体上显示时该字母有下划线,操作时同时按Alt和该带有下划线的字母就可选择这个菜单项命令。例如,建立文件菜单File在“标题”文本框内应输AFile, 程序执行时用AltF就可以选择File菜单。第8章 菜单的设计和MDI程序设计 (2) “名称(Name)”文本框,由用户输入菜单项的名称,它不会显示出来,在程序中用来标识该菜单项。在“标题”文本框中输入了一个菜单标题,在“名称”文本框中应有一个对应的菜单名称。分界符也要有对应的名称。 (3) “快捷键(Shortcut Key)”下拉列表框,列出了很多快捷键,供用户为菜单项选择一个快捷键。菜单项的

3、快捷键可以不要,但如果选择了快捷键,则会显示在菜单标题的右边。在程序运行时,用户按快捷键同样可完成选择该菜单项并执行相应命令的操作。 (4) “下一个(Next)”按钮,当用户把一个菜单项的各个属性设置完以后,选择此按钮,即可换行设置下一个菜单项。 第8章 菜单的设计和MDI程序设计 (5) “”和“”按钮,菜单层次的选择按钮。若建立好一个菜单项后按“”按钮,则该菜单项在显示框中向右移一段,前面加“.”表示该菜单项为下一级的菜单项。如果选定了某菜单项后,再按“”按钮,前面的省略号将取消,表示该菜单项是上一级的菜单项。 (6) “插入(Insert)”按钮,在选定的菜单项前插入一个菜单项。 (7

4、) “删除(Delete)”按钮,删除选定的菜单项。 (8) “”和“”按钮,用于改变菜单项排列的位置。 (9) “复选(Checked)”检查框,如果在显示框中选定了某个菜单项,再选定“Checked”检查框,那么当前被选定的菜单项左边加上了一个检查标记“”,表示该菜单项是一个被选项。 第8章 菜单的设计和MDI程序设计 (10) “有效(Enabled)”检查框,该检查框决定菜单项是否可选(有效)。当该检查框被选中,表示菜单项的Enabled属性为True,程序执行时菜单项高亮度显示,是可选的;如果没有被选中,即Enabled属性为False,在程序执行时该菜单项变成灰色,不能被用户选择。

5、 (11) “可见(Visible)”检查框,该检查框决定菜单项是否可见。若该检查框未被选中,表示该菜单项的Visible属性为False,程序执行时不可见。 第8章 菜单的设计和MDI程序设计 (12) “协调位置(Negotiate Position)”下拉列表框,通过这一下拉列表框,可以确定菜单或菜单项在窗体中是否出现或怎样出现。下拉列表框中共有4个选项。0None:菜单项不显示;1Left:菜单项左显示;2Middle:菜单项中显示;3Right:菜单项右显示。第8章 菜单的设计和MDI程序设计 (13) “帮助上下文ID(Help Context ID)”文本框,可以通过键入一个数值

6、,在帮助文件(用HelpFile属性设置)中查找相应的帮助主题。 (14) “显示窗口列表(Window List)”检查框,决定菜单控件上是否显示所打开的子窗体标题。该检查框仅对MDI窗体和MDI子窗体有效,对普通窗体无效。 第8章 菜单的设计和MDI程序设计 2单设计过程单设计过程 建立菜单大致可分成三个步骤: (1) 建立控件。 (2) 设计菜单。在窗口上的控件建立以后,我们就设计菜单。在设计状态下选择“工具”菜单下的菜单编辑器(CtrlE)命令,出现“菜单设计”窗口。在“菜单设计”窗口中,对每一个菜单项输入标题、控件名称和相应的快捷键。当完成所有输入工作后,选择“确定”按钮,就完成了整

7、个菜单的设计工作。 (3) 建立事件过程代码。在菜单建立好以后,还需要相应的事件过程。 第8章 菜单的设计和MDI程序设计 3单项的动态增减单项的动态增减 应用程序的菜单应设计成像Windows程序管理器中Window菜单一样,能够在执行时随着程序的变化动态地增减菜单中的菜单项。菜单项增减是利用控件数组来实现的。 【例8-1】 下面以一个简单的实例来说明菜单设计的步骤。我们以前面设计的菜单为基础,增加菜单项增减功能。当用户在窗体上单击时,在“计算2”菜单中增加“平方和”和“立方和”两条命令。当用户在窗体上双击时,在“计算2”菜单中删除这两个命令。 第8章 菜单的设计和MDI程序设计 (1) 在

8、菜单设计窗口中,按表8.1输入各菜单项的标题、控件名称和快捷键。另外,菜单项Namearray的Index属性设为0,Visible属性设为False(不可见)。 表表8.1 菜单项的属性设置菜单项的属性设置 菜 单 项 名 称 快 捷 键 计算 1 Cal1 空白 加法 Add CtrlA 减法 Sub CtrlD 计算 2 Cal2 空白 乘法 Div CtrlC 除法 Mul CtrlD 清除 Clean CtrlE Namearray 空白 第8章 菜单的设计和MDI程序设计 (2) 窗体设计界面如图8.1所示。 图8.1 设计界面 第8章 菜单的设计和MDI程序设计 (3) 在菜单建

9、立好以后,编写下列事件过程。Dim iMenucount As Integer 该变量须在窗体层说明 菜单项Add的单击事件Private Sub Add_Click( ) X = Val(txtNo1.Text) + Val(txtNo2.Text) lblDisplayResult.Caption = Str$(X)End Sub 第8章 菜单的设计和MDI程序设计 表单单击事件装入新菜单项Private Sub Form_Click( )If iMenucount = 0 Then iMenucount = iMenucount + 1 Load Namearray(iMenucount

10、) 装入新菜单项 Namearray(iMenucount).Caption = 平方和 Namearray(iMenucount).Visible = True iMenucount = iMenucount + 1 Load Namearray(iMenucount) 装入新菜单项 Namearray(iMenucount).Caption = 立方和 Namearray(iMenucount).Visible = TrueEnd IfEnd Sub 第8章 菜单的设计和MDI程序设计 表单双击事件删除装入的菜单项Private Sub Form_DblClick( )Dim i As I

11、nteger Do While iMenucount 0 Unload Namearray(iMenucount) 删除菜单 iMenucount = iMenucount - 1LoopEnd Sub 第8章 菜单的设计和MDI程序设计 Namearray_Click是这些新增菜单项的共用事件过程。当用户选择“平方和”命令时,参数Index的值是1,选择“立方和”命令时,Index的值是2。 Private Sub Namearray_Click(Index As Integer) X = Val(txtNo1.Text) (Index + 1) + Val(txtNo2.Text) (In

12、dex + 1) lblDisplayResult.Caption = Str$(X) End Sub 第8章 菜单的设计和MDI程序设计 (4) 运算结果如图8.2所示 图8.2 菜单示例运行结果 第8章 菜单的设计和MDI程序设计 4弹出菜单弹出菜单 Visual Basic允许出现快捷菜单,这为用户提供了很大的方便。一般来说,菜单都在窗口的顶部。有时用户需要执行菜单中的某一命令,就得把鼠标指针移到窗口顶部打开菜单,再选择命令,这对用户来说,会觉得很麻烦。而快捷菜单并不需要到窗口顶部来打开,只要单击鼠标的右键就会弹出。 设计快捷菜单仍然使用Visual Basic提供的菜单编辑器,只要把某

13、个菜单设置成隐藏Visible属性为False就可以了。实际上,不管是在窗口顶部菜单条上显示的菜单,还是隐藏的菜单,都可以用PopupMenu方法把它们作为快捷菜单在程序运行期间显示出来。 第8章 菜单的设计和MDI程序设计 PopupMenu方法的使用形式如下: 对象. PopupMenu 菜单名,标志,x,y 说明: (1) x,y是快捷菜单显示的位置。 (2) 标志指定快捷菜单的行为。当标志为0时,快捷菜单中的项只能对鼠标左键有反应。当标志为2时,快捷菜单中的项对鼠标左键和右键都有反应。标志为2时PopupMenu方法只能用在MouseDown事件过程。 第8章 菜单的设计和MDI程序设

14、计 【例8-2】 我们让前面设计的“计算2”菜单,在程序运行时作为快捷菜单显示出来。 首先,按前面介绍的方法设计“计算2”菜单。其Visible属性可以设置成True或False。然后,编写如下的事件过程: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu Cal1, 2 End If End Sub程序运行后,单击鼠标右键(Button=2),立即弹出Call菜单,如图8.3 所示。 第8章 菜单的设计和M

15、DI程序设计 图8.3 弹出菜单的显示 一般来说,用户应将经常使用的命令如Close、Clear命令组成一个快捷菜单,以便于使用。第8章 菜单的设计和MDI程序设计 8.2 多文档界面多文档界面(MDI) 8.2.1 创建创建MDI窗体及其子窗体窗体及其子窗体 1创建创建MDI窗体窗体 用户要建立一个MDI窗体,可以选择“工程”菜单中的“添加MDI窗体”命令,在弹出的“添加MDI窗体”对话框中,选择“MDI窗体”,再选择“打开”按钮。需要注意的是,一个应用程序只能有一个MDI窗体,但是可以有多个MDI子窗体。如果MDI子窗体有菜单,那么,当MDI子窗体为活动窗体时,子窗体的菜单将自动取代MDI

16、窗体的菜单。 第8章 菜单的设计和MDI程序设计 2MDI窗体上控件的设置窗体上控件的设置 为了把其它的控件放入MDI窗体,应该先在MDI窗体上绘制一个PictureBox图片框,然后在图片框中绘制其它控件。可以在MDI窗体的图片框中使用Print方法显示文本,但是不能在MDI窗体上显示文本。 第8章 菜单的设计和MDI程序设计 3子窗体子窗体 MDI子窗体是一个MDIChild属性为True的普通窗体。因此,要创建一个MDI子窗体,应先创建一个新的普通窗体,然后将它的MDIChild属性置为True。MDI子窗体的设计与MDI窗体无关,但在运行时总是包含在MDIForm中。 第8章 菜单的设

17、计和MDI程序设计 【例8-3】 建立多文档界面。 首先用“工程”菜单中的“添加MDI窗体”和“添加窗体”命令建立一个MDI窗体和两个普通窗体设置。 MDI窗体上有一个“窗体”菜单,其中有三个命令:窗口、子窗体1(Show_frmMDIChild1)和子窗体2(Show_frmMDIChild2),后二者分别用于显示子窗体1和子窗体2。菜单窗口下面实现了三个功能:层叠、平铺和排列图标。MDI窗体如图8.4所示。 第8章 菜单的设计和MDI程序设计 图8.4 MDI窗体界面设计 第8章 菜单的设计和MDI程序设计 8.2.2 显示显示MDI窗体及其子窗体窗体及其子窗体 显示MDI窗体及其子窗体的

18、方法是Show,下面的程序中前两个菜单项的代码过程就是用Show显示子窗体。 菜单项子窗体1响应事件Private Sub Show_frmMDIChild1_Click( )frmMDIChild1.ShowEnd Sub 菜单项子窗体2响应事件Private Sub Show_frmMDIChild2_Click( )frmMDIChild2.ShowEnd Sub 第8章 菜单的设计和MDI程序设计 子菜单项层叠事件编写Private Sub mnuWindowTile_Click( )frmMDI.Arrange vbTileHorizontalEnd Sub 子菜单项平铺事件编写Pr

19、ivate Sub mnuWindowArrange_Click( )frmMDI.Arrange vbArrangeIconEnd Sub 子菜单项排列图标事件编写Private Sub mnuWindowsCascade_Click( )frmMDI.Arrange vbCasecadeEnd Sub子窗体1、2同时显示时执行结果如图8.5所示。 第8章 菜单的设计和MDI程序设计 图8.5 MDI窗体显示结果 第8章 菜单的设计和MDI程序设计 不能把MDI子窗体或者MDI窗体显示为模式窗体(用带vbModal参数的Show方法)。如果想在MDI应用程序中使用模式对话框,则该对话框(一种

20、特殊窗体)的MDIChild属性必须设置为False。 加载子窗体时,其父窗体(MDI窗体)会自动加载并显示,而加载MDI窗体时,其子窗体并不会自动加载。 在上述例子中,如果子窗体1是缺省的启动窗体,则在程序运行时,子窗体1和MDI窗体两者都会加载。如果改变启动窗体为MDI窗体,然后运行应用程序,则只有MDI窗体被加载。当从“窗体”菜单中选择“子窗体1”或“子窗体2”命令时,才会加载子窗体。 第8章 菜单的设计和MDI程序设计 MDI窗体有AutoShowChildren属性,它决定是否自动显示子窗体。如果它被设置为True,则当改变子窗体的属性(如Caption等)后,会自动显示该子窗体,不

21、再需要Show方法;如果设置AutoShowChildren为False,则改变子窗体的属性值后,不会自动显示该子窗体,子窗体处于隐藏状态直至用Show方法把它们显示出来。MDI子窗体没有AutoShow-Children属性。 例如,修改Show frmMDIChild2_Click事件过程,使其当把子窗体2的Top属性设置为100时,可自动显示子窗体2。Sub Show_frmMDIChild2_Click( ) frmMDI.AutoShowChildren=True frmMDIChild2.Top=100End Sub 第8章 菜单的设计和MDI程序设计 如果MDI子窗体具有大小可变

22、的边框(即BorderStyle2),在其显示时,Windows将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于MDI窗体的大小,而不是设计时子窗体的大小;当MDI子窗体的边框大小不可变 (即BorderStyle=0,1或3)时,则它的大小由设计时的Height和Width属性决定。 与卸载普通窗体一样,卸载MDI窗体及其子窗体也是使用Unload语句。例如,如果要卸载frmMDIChild1,则应该使用Unload frmMDIChild1语句。 第8章 菜单的设计和MDI程序设计 8.2.3 维护子窗体的状态信息维护子窗体的状态信息 在用户决定退出MDI应用程

23、序时,必须有保存信息的机会。为此,应用程序必须随时都能确定自上次保存以来子窗体中的数据是否有所改变。 通过在每个子窗体中声明一个公用变量来实现保存信息的功能。例如,可以在子窗体的声明部分声明一个变量: Public boolDirty As Boolean 假定子窗体1中有一个文本框Text1,Text1中的文本每一次改变时,文本框的Change事件就会将boolDirty设置为True。可添加一行代码以指示自上次保存以来Text1的内容已经改变。 第8章 菜单的设计和MDI程序设计 Sub Text1_Change( ) boolDirty =TrueEnd Sub 反之,用户每次保存子窗体

24、的内容时,都将boolDirty设置为False,以指示Text1的内容不再需要保存。在下列代码中,假设有一个叫做“保存”(mnuFileSave)的菜单命令和一个用来保存文本框内容的名为FileSave的过程: 第8章 菜单的设计和MDI程序设计 Sub mnuFileSave_Click( ) 保存Text1的内容 FileSave 设置状态变量 BoolDirty =FalseEnd Sub第8章 菜单的设计和MDI程序设计 8.2.4 用用QueryUnload卸载卸载MDI窗体窗体 当用户决定退出应用程序时,boolDirty标志就很有用了。当用户从MDI窗体的控制菜单框中选择“关闭

25、”命令,或者选择提供的菜单项,例如“文件”菜单上的“退出”命令时,上述情况就会出现。如果用户使用MDI窗体的“控制”菜单来关闭应用程序,Visual Basic将试图卸载MDI窗体。 当MDI窗体被卸载时,MDI窗体首先触发QueryUnload事件,然后每一个打开的子窗体也都触发该事件。如果在这些QueryUnload事件过程中没有代码,则取消QueryUuload事件,然后,每一个子窗体被卸载,最后,MDI窗体被卸载。 第8章 菜单的设计和MDI程序设计 由于QueryUnload事件在窗体卸载之前被触发,因此在窗体卸载前给用户一个机会来保存窗体。下述代码使用boolDirty标志来决定是

26、否要提醒用户在子窗体卸载之前进行保存。请注意,可以在工程的任何地方访问公共窗体级变量值。下面的代码假定有一个名叫FileSave的过程,它将Text1的内容保存到一个文件中。代码如下: 第8章 菜单的设计和MDI程序设计 Sub mnuExit_Click( ) 当用户在MDI应用程序中选取文件退出命令时,卸载 MDI窗体,为每个打开的子窗体触发QueryUnload事件 Unload frmMDI EndEnd SubSub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If boolDirty Then 调用例程来询问

27、用户且必要时保存文件 FileSave End IfEnd Sub 第8章 菜单的设计和MDI程序设计 8.2.5 多文档界面应用程序中的多文档界面应用程序中的“窗口窗口”菜单菜单 大多数MDI应用程序都有“窗口”菜单。在“窗口”菜单上显示了所有打开的子窗体标题,另外还有层叠、平铺和排列图标命令。 在Visual Basic中,如果要在某个菜单上显示所有打开的子窗体标题,只需利用菜单编辑器将该菜单的WindowList属性设置为True,即选中显示窗口列表检查框。 对于窗体或子窗体图标的层叠、平铺和排列图标命令通常也放在“窗口”菜单上,是用Arrange方法来实现的,下面是这三个菜单命令的事件

28、过程。 假定MDI窗体名称为frmMDI,层叠、平铺和排列图标菜单项的名称分别为mnuWindow-Cascade、mnuWindowTile和mnuWindowArrange。 第8章 菜单的设计和MDI程序设计 vbCascade、vbTileHorizontal和vbArrangeIcons是Visual Basic的三个内部常数。 Sub mnuWindowCascade_Click( ) 层叠子窗体 frmMDI.Arrange vbCascadeEnd SubSub mnuWindowTile_Click( ) 平铺子窗体 frmMDI.Arrange vbTileHorizont

29、alEnd SubSub mnuWindowArrange_Click( ) 对任何已经最小化的子窗体排列图标 frmMDI.Arrange vbArrangeIconEnd Sub 第8章 菜单的设计和MDI程序设计 8.2.6 应用举例应用举例创建一个创建一个MDI NotePad MDI NotePad是一个多文档界面(MDI)。在运行时,若用户需要一个新文档,就使用应用程序的“文件”菜单中的“新建”命令,应用程序会创建子窗体的一个新实例。这就允许按其所需创建多个子窗体或文档。 为了创建以文档为中心的应用程序,至少需要两个窗体:一个MDI窗体和一个子窗体。设计时,应创建一个MDI窗体以容

30、纳该应用程序,再创建一个子窗体作为这个应用程序文档的模板。操作步骤如下: 第8章 菜单的设计和MDI程序设计 (1) 从“文件”菜单中选取“新建工程”命令。 (2) 从“工程”菜单中,选取“添加MDI窗体”命令来创建容器窗体。现在,这个工程应当包含一个MDI窗体(MDIForm1)和一个标准窗体(Form1)。 (3) 在Form1上创建一个文本框(Text1)。 (4) 按表8.2设置两个窗体和文本框的属性。 第8章 菜单的设计和MDI程序设计 表表8.2 MDI窗体、窗体、MDI子窗体和文本框属性子窗体和文本框属性 对 象 属 性 设 置 值 MDIForm1 Caption MDI No

31、tepad Form1 Caption MDIChild 无标题 True Text1 MultiLine Text Left Top True (空值) 0 0 第8章 菜单的设计和MDI程序设计 (5) 使用菜单编辑器,按表8.3为MDIForm1创建一个“文件”菜单。 表表8.3 MDIForm1窗体的文件菜单窗体的文件菜单 标 题 名 称 缩进 &File &New menuFile menuFileNew 否 是 第8章 菜单的设计和MDI程序设计 (6) 在mnuFileNew_Click过程中增加以下代码。Private Sub menuFileNew_Click( ) 创建名为

32、NewDoc的窗体Form1的一个新实例 Dim NewDoc As New Form1 显示此新窗体 NewDoc.Show End Sub 这个过程创建并显示Form1的名为NewDoc的一个新实例(或其副本)。每当从“文件”菜单中选取“新建”命令时,将会创建一个与Form1完全相同的实例,它包含Form1所包含的所有控件和代码。 第8章 菜单的设计和MDI程序设计 (7) 给Form1窗体的Form_Resize过程添加以下代码:Private Sub Form_Resize( ) 扩展文本框以放置当前子窗体Text1.Height = ScaleHeightText1.Width =

33、ScaleWidthEnd Sub 第8章 菜单的设计和MDI程序设计 Form_Resize事件过程的代码,像Form1中的所有代码一样,能为Form1的每一个实例所共享。当显示窗体的几个实例时,每个窗体都能识别各自的事件。当一个事件出现时,该事件过程的代码就会被调用。由于相同的代码为每个实例所共享,尤其是每个实例都具有相同的名字(Form1)时,调用该代码的窗体是如何引用的,这对程序员来说是一个非常重要的问题。 在这种情况下,通常提供的命令是对当前活动子窗体上具有焦点的控件进行操作。例如,假设想从子窗体的文本框中把所选文本复制到剪贴板上,在应用程序的“编辑”菜单上有一个“复制”菜单项,它的

34、Click事件将会调用EditCopyProc,把选定的文本复制到剪贴板上。 第8章 菜单的设计和MDI程序设计 由于应用程序可以有同一子窗体的许多实例,所以EditCopyProc需要知道使用的是哪一个窗体。为此需要使用MDI窗体的ActiveForm属性,该属性可以返回具有焦点的或者最后被激活的子窗体。当访问ActiveForm属性时,至少应有一个MDI子窗体被加载或可见,否则会返回一个错误。 当一个窗体中有几个控件时,也需要指定哪个控件是活动的。像ActiveForm属性一样, ActiveControl属性能返回活动子窗体上具有焦点的控件。下边是一个实例例程,从子窗体菜单、MDI窗体菜

35、单或者工具栏按钮上可对它进行调用。 第8章 菜单的设计和MDI程序设计 rivate Sub mnuCopy_Click( ) 选定文本复制到剪贴板上Clipboard.SetText MDINotePad.ActiveForm.ActiveControl.SelTextEnd Sub 假如正在编写被多个窗体实例调用的代码,不用窗体标识符访问窗体的控件或属性是一个好办法。例如,用Text1.Height引用Form1上文本框的高度,而不是使用Form1.Text1.Height。这样,该代码总是影响当前窗体。 第8章 菜单的设计和MDI程序设计 在代码中指定当前窗体的另一种方法是用Me关键字,

36、即用Me关键字来引用当前其代码正在运行的窗体。当需要把当前窗体实例的引用参数传递给过程时,这个关键字很有用。 除了在这里提到的方法以外, Mdinote.vbp示例应用程序还包含许多MDI技巧,如利用MDI子窗体数组。花一些时间对该示例代码进行全面研究就会掌握这些技巧。Sdinote.vbp示例应用程序是同一应用程序转换为SDI样式的实现,比较这两个例子可以明白MDI和SDI技巧的差别。 第8章 菜单的设计和MDI程序设计 (8) 运行应用程序如图8.6所示。 图8.6 多文档显示结果 第8章 菜单的设计和MDI程序设计 8.3 工工 具具 栏栏 8.3.1 手工创建工具栏手工创建工具栏 在窗

37、体或MDI窗体上手工创建工具栏,通常是用PictureBox控件作为工具栏按钮的容器,用CommandButton或Image控件作为工具栏的按钮。工具栏上的每一个按钮应指定一个图像和提示文字。提示文字是当鼠标指针移动到一个按钮上时显示的信息,一般是按钮的名称。如果要制作一个非常完美的界面,则要为每一个按钮准备三个图像,一个是普通状态下的图案,一个是被鼠标按下的图案,还需要多准备一个鼠标指针停留时凸出的图案。这样,在工具栏上平时显示一按钮的图案,然后对鼠标不同的操作,再显示不同的图案。 第8章 菜单的设计和MDI程序设计 下面介绍手工创建工具栏的一般过程。 (1) 在窗体或MDI窗体上放置一个

38、图片框。如果是普通窗体,则必须将它的Align属性设置为1,图片框才会自动伸展宽度,直到填满窗体工作空间。如果是MDI窗体,则不需要作这一属性设置,它会自动伸展。需要读者注意的是,在MDI窗体上只能用图片框作为工具栏按钮的容器,因为只有那些直接支持Align属性的控件才能放置在MDI窗体上,而图片框是支持这一属性的惟一的标准控件。 第8章 菜单的设计和MDI程序设计 (2) 在图片框中,可以放置任何想在工具栏上显示的控件。通常用CommandButton或Image控件来创建工具栏按钮。在图片框中添加控件不能使用双击工具箱上控件按钮的自动方法,而应该单击工具箱中的控件按钮,然后用出现的“+”指

39、针在图片框中画出控件。 (3) 设置属性。可为工具栏上显示的每一个控件设置Picture属性,指定一个图片。如果用户需要的话,还可以通过ToolTipText属性来设置工具提示。 第8章 菜单的设计和MDI程序设计 (4) 编写代码。因为工具栏频繁地用于提供对其它命令的快捷访问,因而在大部分时间内都是从每一个按钮的Click事件中调用其它过程,比如对应的菜单命令。 对于工具栏中的各个控件,在创建的时候不可避免地会在它们之间留空隙或间距不等,这样会影响工具栏的美观。如果要删除按钮之间的空隙或调整间距,应首先选中这些控件,然后使用“格式”菜单下“水平间距”子菜单中的“删除”或“相同间距”命令。 第

40、8章 菜单的设计和MDI程序设计 8.3.2 工具栏应用举例工具栏应用举例 【例8-4】 修改上面“手工创建工具栏”一例,把命令按钮改成工具栏上的按钮。工具栏上只有两个按钮:新建和打开。 操作步骤如下: (1) 窗体上建立一个图片框(picToolbar),将其Align属性设置为1。 (2) 在窗体上建立一个通用对话框(CMDialog1)和两个图像框,它们的名称分别为imgFileNewButton和imgFileOpenButton。 第8章 菜单的设计和MDI程序设计 (3) 通用对话框的属性同上例设置。 (4) 在imgFileNewButton和imgFileOpenButton中

41、分别装入图片,它们的ToolTipText属性分别设置为“新建文件”和“打开文件”。 (5) 两个按钮的Click事件过程非常简单,请同学自己完成。 第8章 菜单的设计和MDI程序设计 8.3.3 协调菜单与工具栏的外观协调菜单与工具栏的外观 1控制菜单的外观控制菜单的外观 通过设置窗体的NegotiateMenus属性可以决定一个链接或嵌入的对象的菜单是否出现在容器窗体中。如果子窗体的NegotiateMenus属性设置为True(缺省),而且容器有一个定义的菜单栏,那么,当这个对象被激活时,它的菜单就放置在容器的菜单栏中。如果容器没有菜单栏,或者子窗体的NegotiateMenus属性被设

42、置为False,那么,当这个对象激活时对象的菜单将不出现。 第8章 菜单的设计和MDI程序设计 2控制工具栏的外观控制工具栏的外观 MDI窗体的NegotiateToolbars属性决定了链接或嵌入对象的工具栏是不固定的调色板还是被放置在父窗体上。这种性能不要 求 工 具 栏 出 现 在 M D I 父 窗 体 上 。 如 果 M D I 窗 体 的NegotiateToolbars属性设为True,则对象的工具栏出现在MDI父窗体上。如果MDI窗体的NegotiateToolbars设为False,则对象的工具栏就为不固定的调色板。 如果MDI窗体包含工具栏,它通常被包含在父窗体的Pictu

43、reBox控件中。图片框的Negotiate属性决定了被激活时容器的工具栏是继续显示还是被对象的工具栏所代替。如果Negotiate设置为True,则除了容器的工具栏外还显示对象的工具栏。如果Negotiate设置为False,则对象的工具栏代替容器的工具栏。 第8章 菜单的设计和MDI程序设计 8.4 对对 话话 框框 8.4.1 设计自定义对话框设计自定义对话框 自定义对话框是用户所创建的含有控件的窗体。这些控件包括命令按钮、单选钮、检查框和文本框等,它们可以为应用程序接收信息。因此,创建自定义对话框就是建立一个窗体,在窗体上根据需要放置控件,通过设置属性值来自定义窗体的外观。作为对话框的窗体与一般的窗体在外观上是有所区别的,对话框没有控制菜单框及最大化、最小化按钮,不能改变它的大小,所以对对话框应该做如表8.4所示的属性设置。第8章 菜单的设计和MDI程序设计 表表8.4 对话框属性对话框属性 属 性 值 说 明 BorderStyle 1 边框类型为固定的单个边框,防止对话框在运行时被改变尺寸 ControlBox False 取消控制菜单框 MaxButton False 取消最大化按钮,防止对话框在运行时被最大化 Mi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论