




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 应用程序界面设计,3.1 菜单 3.2 工具栏与状态行 3.3 对话框 3.4 多窗体程序 3.5 拖放技术 3.6 窗体的分割 习题,3.1 菜 单,3.1.1 菜单设计器和菜单组件 MainMenu组件位于组件面板的Standard页上,将它放入一个应用程序的窗体,然后我们就可以利用菜单设计器(Menu Designer)设计菜单了。,菜单设计器是BCB提供的一个可视化工具,使用起来直观简便。右击窗体中的MainMenu组件,出现该组件的快捷菜单,其中第一项就是“Menu Designer”。选择该项就打开了菜单设计器,如图3-1所示。BCB提供的另一种菜单组件是下拉菜单(Popu
2、pMenu),它也可以用Menu Designer来设计。两种菜单中的各个菜单项都是TMenuItem类的对象,它们是由Menu Designer在设计过程中添入到菜单组件中去的,如图3-2所示。,图3-1 MainMenu 的快捷菜单,图3-2 在Menu Designer中设计,在Menu Designer中的操作主要用鼠标。当选中某个菜单项时,Object Inspector会切换到对应该项的MenuItem对象,此时可输入它的Caption属性,也就是菜单项的名称。若要删除某菜单项,可在Menu Designer内选中该项后按Delete键,也可右击该菜单项打开它的MenuItem快捷
3、菜单,再选该菜单上的Delete项。若要插入菜单项,可在选中插入位置后按Insert键,也可右击该菜单项打开它的MenuItem快捷菜单,再选该菜单上的Insert项。若要移动菜单项的位置可以用鼠标进行拖曳完成。,此外,还可用MenuItem的快捷菜单上的Create SubMenu选项为菜单项增加一个子菜单,这样就可构建任意层数的菜单系统。如果要在程序运行中动态地增减菜单项,则可在程序中调用TMenuItem对象的Add 和Delete方法。 根据菜单在应用程序中的作用,它的选项常被指派执行某项功能或操作。BCB中的MenuItem对象都有OnClick事件,为该事件编写的代码即被指派到菜单
4、项对应的操作中。在Menu Designer中双击菜单项即可打开对应的OnClick事件代码段;在窗体设计区中单击菜单项也能打开OnClick事件代码段。当然,还可以在Object Inspector中打开MenuItem的OnClick事件。,下面是菜单组件的常用属性。 1AutoMerge属性 AutoMerge属性用于菜单的合并,当子窗体上菜单的该属性为true时,则在执行程序中会将子窗体上的菜单自动合并到它的父窗体的菜单上。本章3.4.2节将给出有关菜单合并的详细讲解和范例。在该属性不为true时,用户仍可执行Merge方法将两个菜单合并。UnMerge方法则将已合并的菜单拆分。,2C
5、aption 属性 菜单项上的文字就是该菜单项的Caption属性值。缺省的BCB会将该Caption作为菜单项的Name,但如果Caption中有汉字,则菜单项的Name被缺省设置为N1、N2等。 如果在Caption的某个字母前加上一个 /- void _fastcall TForm1:ToolBar1Click(TObject *Sender) ToolBar1-Checked = ! (ToolBar1-Checked); /使该菜单项的Checked属性值取反 /-,void _fastcall TForm1:FileEnabled1Click(TObject *Sender) Fi
6、le1-Enabled = true; FileEnabled1-Enabled = false; FileDisabled1-Enabled = true; /- void _fastcall TForm1:FileDisabled1Click(TObject *Sender) File1-Enabled = false; FileEnabled1-Enabled = true; FileDisabled1-Enabled = false;, /- void _fastcall TForm1:HideHelp1Click(TObject *Sender) Help1-Visible = fa
7、lse; ShowHelp1-Enabled = true; HideHelp1-Enabled = false; /-,void _fastcall TForm1:ShowHelp1Click(TObject *Sender) Help1-Visible = true; ShowHelp1-Enabled = false; HideHelp1-Enabled = true; /- void _fastcall TForm1:New1Click(TObject *Sender) ShowMessage (New Has Not Completed); /调用通用函数ShowMessage输出信
8、息 ,/- void _fastcall TForm1:Open1Click(TObject *Sender) ShowMessage (Open Has Not Completed); /调用通用函数ShowMessage输出信息 ,/- void _fastcall TForm1:Save1Click(TObject *Sender) ShowMessage (Save Has Not Completed); /调用通用函数ShowMessage输出信息 /- ToolBar1-Checked=!(ToolBar1-Checked);,运行该程序,选择File Disabled后的画面如图
9、3-4所示,选择Hide Help后的画面如图3-5所示,选择ToolBar后的画面如图3-6所示,再次选择ToolBar后的画面如图3-7所示。在选择了FileNew后弹出的消息框如图3-8所示。,图3-4 选择File Disabled,图3-5 选择Hide Help,图3-6 选择ToolBars使Checked被勾选,图3-7 再次选择ToolBars取消Checked勾选,图3-8 选择FileNew 弹出消息框,3.2 工具栏与状态行,大部分Windows应用程序都有一个工具栏,利用工具栏上的图形按钮可加快操作速度,一般工具栏位于窗体的顶部。在BCB中有许多方法可设计出不同风格的
10、工具栏,其中较简单直接的方法是使用Panel和SpeedButton控件进行的。,3.2.1 面板和加速按钮 1面板 面板(Panel)控件位于组件面板的Standard页上的倒数第二个位置,它是一个容器组件,即可以将其它组件放入面板。它的主要功能就是制作工具栏和状态栏。以下是面板的常用属性。 1) Align属性 为设置面板在窗体上的位置,可以使用它的Align属性。该属性取值范围为alTop、alRight、alBottom、alLeft、alClient和alNone。,缺省值为alNone,此时可用鼠标操作确定其位置和尺寸。当作为工具栏使用时,面板常被放置在窗体顶部位于菜单条之下,我们
11、可以用alTop指定该位置。这样,即使窗体尺寸改变,面板也能准确定位,而且能自动改变宽度以保持横贯整个窗体。alRight、alLeft、alBottom和alTop类似,分别适合将面板定位到窗体的右、左和底部。alClient则定位在整个窗体的客户区。,2) BevelInner和BevelOuter属性 BevelInner和BevelOuter这两个属性决定了面板的外观,适当搭配二者的值可以产生不同的三维效果。它们的取值范围为bvLowered、bvNone、bvRaised和bvSpace。缺省值BevelInner=None, BevelOuter=Raised。 3) Captio
12、n属性 面板也有Caption属性,因此可在面板上显示文字。此时,它的功能类似于Label组件,但可以制作出三维效果,简单的状态栏就是利用面板的Caption制作的。在用作工具栏时,一般应将Caption置为空白。,4) Visible属性 Visible属性为false时,可隐藏面板及面板上的组件。我们可用来隐藏工具栏。,2加速按钮 加速按钮(SpeedButton)是位于Additional页上第二个位置的组件。它与按钮类似,但可以在表面上放置图形。与按钮或位图按钮(BitButton)相比,它没有窗口句柄,不消耗Windows资源,绘制速度也更快一点。所以,非常适合用作工具栏上的工具按钮
13、。加速按钮有以下主要属性。,1) Glyph属性 Glyph属性指定一个图像文件放到加速按钮的表面。点击Object Inspector中该属性右侧的“.”按钮就打开Picture Editor对话框,可选“Load.”按钮指定一个图片文件,按“OK”完成装入,如图3-9所示。一般应装入小型位图或图标(2020像素左右),位图文件既可通过各种途径收集得到,也可利用BCB的Image Editor工具自行绘制。参见本书基础篇1.3.6节。在BCB的目录C:Program FilesCommon FilesBorland SharedImagesButtons下就有许多按钮图标。,图3-9 输入G
14、lyph属性时选择位图,2) NumGlyphs属性 NumGlyphs属性可输入数字14,缺省值为1,它表示加速按钮中包含的位图的数目。当该数目为2时,第一个位图为按钮的标准状态,第二个位图用于按钮失效时。当该数目为4时,第一、二个位图作用同前,第三个位图用于单击按钮时,第四个位图用于按钮持续保持按下状态时。前面提到Buttons目录下有许多按钮的位图,如果打开这些位图观察可以发现它们都是“两位一体”的,即图片中横向并排着两个同样尺寸的类似图形。,其实这些图形就是专门被定制成可以用作NumGlyphs等于2时的按钮表面贴图。类似地,如果用于NumGlyphs等于4时的贴图,图片中必须包含从左
15、到右排列的四个同样尺寸的小图形。,3) Hint 和ShowHint属性 Hint 和ShowHint属性用于产生提示,该两个属性并非加速按钮专有。但由于仅靠一幅简单的位图难以表达复杂的意义,加速按钮更加需要有自我提示的功能。Hint是字符串类型的属性,应输入提示的内容;ShowHint则是bool型,当它为true时组件具有提示功能。,3.2.2 工具栏设计范例 下面给出一个工具栏程序范例。 【例3-2】 我们在前面例3-1的基础上,保留主菜单上的“File”、“Edit”和“Tools”三个下拉菜单,删去其余菜单项。往该程序窗体内放入一个由面板Panel1和三个加速按钮组成的工具栏。Pan
16、el1的Align设置为alTop;三个加速按钮的Glyph中分别装入三个位图,它们的ShowHint都设置为true, Hint属性分别输入“New”、“Open”和“Save”。,再将菜单项“ToolBar”的Checked属性设置为true,表示程序在初始状态下显示工具栏。各菜单项的OnClick基本上与例3-1中相同,但“ToolBar”的OnClick事件中应增加改变Panel1的Visible属性的语句。,程序中,工具栏上三个加速按钮的功能应分别等同于菜单上的“New”、“Open”和“Save”,即它们可以分别与三个菜单项的OnClick事件分享代码。因此,可按如下方式定义三个按
17、钮的OnClick事件:选中第一个按钮,在Object Inspector中选Events页,在OnClick事件右面组合框中选择New1Click (即菜单项“New”的OnClick事件的名称),然后对第二、三个按钮进行类似操作,如图3-10所示。,图3-10 为加速按钮选择OnClick,下面是该范例中惟一需要修改的代码段: void _fastcall TForm1:ToolBar1Click(TObject *Sender) ToolBar1-Checked = ! ToolBar1-Checked; if (ToolBar1-Checked) Panel1-Visible = tr
18、ue; else Panel1-Visible = false; ,程序运行开始时的画面如图3-11所示。若把鼠标靠近加速按钮并停留,就会看到提示信息。选择ToolBar菜单项,能打开或关闭工具栏,图3-12为工具栏已被关闭。当点击三个加速按钮时,与点击菜单项“New”、“Open”和“Save”时一样,会出现一个显示“XXX Has Not Completed”的信息框。我们也可以把组合框、微调按钮(UpDown)等控件放到面板组件上,做出一个像Word中那样有更加复杂功能的工具栏,如图3-13 所示。,图 3-11 程序初始画面 图 3-12 工具栏已关闭,图3-13 一个复杂的工具栏,3
19、.2.3 StatusBar组件 通常在Windows应用程序的底部有一个状态行,用以提供一些系统信息和提示。C+ Builder中我们可以利用面板组件制作状态行,但效果较差。本节中将介绍StatusBar组件,它位于Win32页上,是非常适合用作状态行的。 StatusBar 可以看作是面板的容器,它可包含有若干面板,从左向右排列。其中每个面板都能被独立控制,用于显示一项信息。图3-14为含有五个面板的StatusBar组件。,图 3-14 StatusBar组件,下面简单介绍一下StatusBar的主要属性。 1Align属性 用法与面板的Align一样,但作为状态行组件,其缺省值被设置为
20、alBottom。 2Font属性 Font属性可设置状态行中使用的字体,但必须同时设置UseSystemFont为false,否则状态行使用系统定义的字体。,3SimplePanel属性 SimplePanel属性为true时,StatusBar具有一个简单面板(Panel)的一切特征,而不能作为面板容器使用。一般,应设置SimplePanel为false。,4Panels属性 Panels属性是StatusBar最主要的属性,它是一个数组,其中的每个元素代表一个面板。当SimplePanel为false时,可点击Panels属性值右侧的“.”按钮打开一个面板设置对话框,如图3-15所示。打
21、开该对话框的另一个办法是右击StatusBar,当出现快捷菜单后,再选择“Panels Editor”。,图3-15 使用Panels Editor,Panels Editor是一个小窗口,开始时为空,每次点击工具栏上的“New”(左面第一个)按钮就在窗口中增加一个项,相应地StatusBar中也增加了一个面板。当在Panel Editor中选中某项时,Object Inspector中会切换到与其对应的面板,我们就能设置该面板的Width、Bevel和Alignment等属性。Bevel属性与面板的外观有关,一个状态行组件的各个面板可分别有不同的Bevel值。Alignment的可选值为ta
22、Center、taLeftJustify和taRightJustify,分别表示显示文字的位置为居中、靠左和靠右。,3.2.4 状态行设计范例 下面给出一个状态行设计的范例。 【例3-3】 程序的主菜单上有“File”和“Edit”两项,窗体中间放了一个TMemo控件,可输入文本,窗口底部有一个被分隔为五个部分的状态行,如图3-16所示。这五部分显示的信息分别为: (1) 时间,显示为XX:XX:XX; (2) Memo控件中当前插入点的位置,它用Y行、X列形式表示,Y、X起始值都是0;,(3) Memo中文本的字数; (4) 键盘上Insert键的状态,显示为INS 或空白; (5) 键盘上
23、NumLock键的状态,显示为NUM 或空白。 我们让前三项居中显示,后两项靠左显示,如图3-16所示。,图3-16 程序运行时状态行中显示有关信息,(操作要点将StatusBar控件放入窗体,设置其Align 为alBottom,SimplePanel 和UseSystemFont为false,并选择适当的字体和颜色。右击StatusBar打开Panel Editor,五次点击New工具按钮添加面板,将五个面板的Width分别设置为100、100、100、50和50,并将前三项Alignment设置为taCenter,后两项设置为taLeftJustify。,为了能实时显示动态信息,我们需要
24、每隔一小段时间将状态行刷新一遍,因此要在Form1中加入一个定时器组件Timer1(位于组件面板上System页)。我们将该Timer的Interval设为100,Enabled设为true,并为Timer1编写OnTimer事件的代码如下: void _fastcall TForm1:Timer1Timer(TObject *Sender), AnsiString str1; /显示时间 TDateTime DateTime =Time ( ); StatusBar1-Panels-Items0 -Text = 时间:+TimeToStr (DateTime); /显示插入点位置 str1=
25、位置:; str1=str1+IntToStr (Memo1-CaretPos.y)+行; str1=str1+IntToStr (Memo1-CaretPos.x)+列; StatusBar1-Panels-Items1 -Text = str1; /显示字数,str1= Memo1-Lines-Text; StatusBar1-Panels-Items2 -Text = 字数:+IntToStr (str1.Length ( ); /显示NUM状态 if (GetKeyState (VK_NUMLOCK) StatusBar1-Panels-Items3-Text =NUM; else S
26、tatusBar1-Panels-Items3-Text = ; /显示INS状态,if (GetKeyState (VK_INSERT) StatusBar1-Panels-Items4-Text =INS; else StatusBar1-Panels-Items4-Text = ; ,【评析】 (1) StatusBar1-Panels-Itemsi-Text 属性代表状态行中第i个面板上的文本,(i=0,1,2,3,4),我们只要将有关信息放入相应的Text属性即可。 (2) 可用Time函数取得TDateTime类型的时间信息,再用函数TimeToStr把它转换为 AnsiStrin
27、g字符串类型。 (3) Memo1-CaretPos.y和Memo1-CaretPos.x为当前插入位置。str1=Memo1-Lines-Text取得Memo1中的文本,再用AnsiString 的Length方法求出它的长度,即文本中的字数。,注意:计算字数时每次回车会增加两个字(回车符和换行符)。 (4) GetKeyState 是一个API函数,可取到键盘上各个键的状态。 (5) 本例中使用了Timer组件,该组件起到定时控制的作用。它的Interval属性指定时间间隔,本例中设置为100,表示每间隔100毫秒(0.1秒)调用一次时控过程(由OnTimer事件确定)。 注意:设置Tim
28、er的Enabled为true,以启动Timer的时控功能。,(6) 本例中为了能显示一些有意义的信息,使用了若干Windows API函数(在本书提高篇中将较系统地介绍Windows API)。对初学者来说,如何在各种场合取得所需的状态信息,可以是一个逐渐积累的过程。,3.3 对 话 框,3.3.1 对话框与模态窗口 设计对话框与设计普通的窗体没什么本质区别,但对话框一般具有如下特征: (1) 在程序中不作为主窗体,通常被缺省命名为Form2或Form3等。在BCB中为了给应用程序加入第二个窗体(或第三个窗体等),可选FileNewForm菜单项或点击相应的工具按钮。,对于有两个以上(含两个
29、)窗体的程序,在与主窗体Form1对应的Unit1.h(或Unit1.cpp)中一般要加入 #include Unit2.h语句(或执行FileInclude Unit Hdr.命令),否则,在Form1中就不能识别Form2中定义的对象。至于是否要在uint2.h中加入 #include Unit1.h,则应看具体情况。 (2) 窗口标题一般应为对话框名称,窗口内没有主菜单。边框上无控制按钮,也不能改变窗口尺寸。要做到这一点,较简单的方法是设置BorderStyle属性为bsDialog。,(3) 窗口往往以模态方式打开,Windows的窗口可定义为模态窗口或非模态窗口。当应用程序打开一个模
30、态窗口后,只要该窗口未关闭,就不能对程序中的其它窗口进行任何操作,以此方式强制用户对该模态窗口作出响应。所谓以模态方式打开即指使打开的窗口成为模态窗口。 在BCB中一个窗口是否为模态一般并非取决于其设计阶段,而是由打开该窗口时使用的方法所确定。如果一个窗口是被Show方法打开的,那么它就是非模态方式的;如果用ShowModal方法打开窗口,那么该窗口就是模态的。,3.3.2 信息框 C+Builder中使用ShowMessage和MessageDlg函数产生标准的Windows信息框,这种信息框是一个模态窗口。 ShowMessage使用方便但功能较弱,只能显示一个带有OK 按钮的信息框。在例
31、3-1中我们已经用过该函数。 MessageDlg函数适用范围更广。它有四个参数,BCB 对该函数声明如下: int_fastcall MessageDlg(const AnsiString Msg, TMsgDlgType DlgType, TMsgDlgButtons Buttons, int HelpCtx);,Msg参数指定了显示的信息。DlgType参数可指定信息框的类型,该参数为TmsgDlgType类型,它的取值范围及含义如表3-1所示。Buttons参数指定了信息框所包含的按钮,类型为TmsgDlgButtons,它的取值范围及含义如表3-2所示。HelpCtx参数可指定当用户
32、单击Help按钮或按F1键时所弹出的帮助主题的帮助上下文ID。MessageDlg函数返回一个整数,代表用户在对话框中所选的按钮,该值必定为以下预定义常数之一:mrNone、mrAbort、mrYes、mrOk、mrRetry、mrNo、mrCancel、mrIgnore、mrAll。,表3-1 DlgType 参数的取值,表3-2 Buttons 参数的取值,下面一段代码出现一个信息框询问用户是否退出程序,若选择Yes,则关闭Form1,使程序结束。代码运行时的画面如图3-17所示。 if (MessageDlg (是否退出程序?, mtConfirmation, TMsgDlgButton
33、s ( ) Close ( );,图3-17 使用MessageDlg 函数,3.3.3 通用对话框组件 在组件面板的Dialog页上有一组共10个通用对话框组件可供使用。这些对话框实际上是由Windows提供的,BCB把它们包装了一下,使用更加方便了。其中,最常用的是OpenDialog(打开文件)、SaveDialog(保存文件)、FontDialog(字体)和ColorDialog(颜色)对话框,图3-18图3-21为这四个对话框的画面。另外几个是OpenPictureDialog(打开图形)、SavePictureDialog(保存图形)、PrintDialog(打印)、Printer
34、SetupDialog(打印机设置)、FindDialog(查找)和ReplaceDialog(替换)对话框。,图3-18 OpenDialog,图3-19 SaveDialog,图3-20 FontDialog,图3-21 ColorDialog,这些对话框的用法是类似的:先调用组件的Execute方法打开对话框供用户操作,当操作完成对话框被关闭后,用户选定的对象被存放在该组件的相应属性内。如操作OpenDialog和SaveDialog对话框所选定的文件名被存放在FileName属性内,FontDialog中选定的字体被存放在Font属性内,ColorDialog中选定的颜色则被存放在Co
35、lor属性内。,【例3-4】 在窗体Form1中放入一个TColorDialog组件ColorDialog1,再放入一个按钮组件Button1。为Button1的OnClick事件编写如下代码: void_fastcall TForm1:Button1Click (TObject *Sender) if (ColorDialog1-Execute ( ) Form1-Color = ColorDialog1-Color; ,程序运行时,点击Button1弹出颜色对话框,在对话框中选定颜色并点击“确定”后,程序使Form1的颜色改变为所选颜色。 注意:ColorDialog1-Execute (
36、 ) 函数返回一个整型值,若用户在对话框中选定后按“确定”退出则该值为1,若按“取消”退出则为0。因此,根据用户是否选中了某种颜色,程序中用if 语句来判定是否需要设置窗体的颜色。具体设置窗体颜色则是通过“Form1-Color = ColorDialog1-Color;”语句完成的。,3.4 多 窗 体 程 序,3.4.1 项目与窗体 BCB应用程序通常是一个项目,项目文件的扩展名为.bpr,这是一个C+的源文件,我们可以执行ProjectView Source菜单命令打开该文件。通常BCB 6.0 缺省定义下项目文件包含如下代码:,#include #pragma hdrstop /- U
37、SEFORM (Unit1.cpp, Form1); /- WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int) try Application-Initialize ( );,Application-CreateForm (_classid (TForm1), , catch (Exception /-,一般情况下初学者不需要修改该文件的代码。 应用程序项目通常还含有若干窗体,每个窗体由三个文件组成,它们分别是扩展名为.cpp的源文件、扩展名为.h的头文件和扩展名为.dfm的窗体定义文件。 在BCB5.0以前版本中,通常要按Ctrl+F6键才能将
38、对应某个.cpp文件的头文件在代码编辑器中打开。而BCB6.0只要在代码编辑器中选择某个.cpp文件,此时编辑器窗口的底部就会出现相应头文件的标签,点击该标签就能打开它。,一个项目可以有多个窗体,但其中只有一个是主窗体(通常是Form1)。主窗体构成程序的主控界面。每次启动时,BCB自动生成含有一个空的主窗体的项目框架。用户在设计中将各种组件放入该窗体,并编写若干事件代码。如果要编写多窗体应用程序,那么从第二个窗体开始,必须由用户在项目中进行添加。可以执行FileNewForm菜单命令或者使用“New Form”工具按钮为当前项目添加一个新窗体。 注意:当我们需要建立一个新项目时,应首先执行F
39、ileClose All关闭当前项目,然后再执行FileNewApplication菜单命令。,有些类型的项目如DLL是不包含任何窗体的,它们一般要由专门的向导生成,读者可参考本书提高篇9.5节。也可以将几个项目结合起来建立更复杂的应用。BCB支持项目组(Project Group)的概念,可以执行ViewProject Manager菜单命令进入项目管理器窗口对项目组进行管理。,3.4.2 窗体之间的关系 在多窗体应用程序中窗体之间可以有两种常见的关系:主从关系和父子关系。C+ Builder创建的窗体中,Form1一般是主窗体,它在程序中具有较重要的地位,如Form1被关闭时,程序通常也就
40、结束了。其它窗体与Form1的关系往往就是主从关系,如Form2可能是Form1在某项操作时需要的一个对话框等。一般,可在主窗体中调用从属窗体的Show、Hide和Close等方法控制它们的显示、隐藏和关闭等。,窗口的父子关系则是Windows中的概念:子窗口可以从父窗口那里继承到一些特性,但只能在父窗口客户区范围内显示或移动。此外,当父窗口关闭时,所有子窗口会自动被关闭。子窗口必定是从属于父窗口的,但一般在窗口的主从关系中,从属的一方不一定是子窗口。如BCB IDE的Object Inspector和代码编辑器都是从属于主窗口的,但不是子窗口(它们可以在主窗口之外移动)。在BCB程序中,当需
41、要指定一个子窗口时,可以在相关的代码中将子窗口的Parent属性设置成它的父窗口(例如Form2-Parent = Form1)。,3.4.3 菜单的合并 在多窗体应用程序中,从属于主窗体的窗口(不管它是否为子窗口)上如果有菜单,通常会将其与主窗体上的菜单合并。在BCB中要做到这一点很容易,只要适当设置菜单的AutoMerge和GroupIndex属性即可。下面给出一个例子。,【例3-5】 应用程序主窗体Form1有如下菜单系统:主菜单上有三项,分别为“File”、 “Windows”和“Help”。 “File”下拉菜单中有“New”、“Open”、“Save”和“Exit”四项;“Wind
42、ows”下拉菜单中有 “Show Form2”和“Hide Form2”两项;“Help”没有下拉菜单。选“Exit”可退出程序,选“Show Form2”或“Hide Form2”则分别显示或隐藏Form2。 Form2上也有一个主菜单,它只有一个下拉菜单“Edit”。该下拉菜单上有“Copy”和“Paste”两项。,要求程序开始时,Form2不显示。选“Show Form2”时,Form2显示并将“Edit”菜单合并到Form1的菜单上。 制作步骤 (1) 在窗体Form1上放一个主菜单MainMenu1,在Menu Designer中设计主菜单。注意,MainMenu1的AutoMerg
43、e应设为false,“File”、“Windows”、“Help”三项的GroupIndex 可分别设置为1、3、5。,(2) 选取FileNewForm菜单命令,在项目中加入Form2。在Form2中加入主菜单,将AutoMerge设置为true,“Edit”下拉菜单的GroupIndex可设为4。 (3) 在Unit1.cpp中加入#include Unit2.h语句。 (4) 对Form1的“Exit”、“Show Form2”和“Hide Form2”的OnClick事件编写如下的代码: void _fastcall TForm1:Exit1Click(TObject *Sender)
44、 Form1-Close ( ); /-,void _fastcall TForm1:ShowForm21Click(TObject *Sender) Form2-Show ( ); /- void _fastcall TForm1:HideForm21Click(TObject *Sender) Form2-Hide ( ); /-,该程序运行时初始画面如图3-22所示,点击“Show Form2”菜单后的画面如图3-23所示。注意,其中的菜单已被合并,合并后各下拉菜单的顺序是按照GroupIndex从小到大排列的。,图3-22 Form2未显示时,图3-23 Form2显示时菜单被合并,我
45、们可以进一步对AutoMerge及GroupIndex做一点试验:将Form2的AutoMerge改为false后运行的画面如图3-24所示,我们看到Form2的菜单未合并。将Form2中“Edit1”的GroupIndex 改为6后运行的画面如图3-25所示,我们看到,合并后“Edit”下拉菜单的位置在“Help”之后(“Help”的GroupIndex为5)。 有趣的是,若“Edit”的GroupIndex设置为1,则在合并时会用“Edit”覆盖具有同一GroupIndex的“File”项。,图3-24 菜单未合并,图3-25 合并后Edit项位于末尾,3.4.4 设计多页窗体 多页窗体,
46、也可称作属性对话框,是一种较新颖的图形界面。它使用某些控件,将窗体分成若干个页面,用户可单击页标签在不同的页面间切换。这种界面的一个明显好处是扩大了窗体的客户区,使其能排列大量的控件,也便于区分对话框的不同功能区域。BCB提供了几种用于建立多页窗体的控件,它们是TTabControl、TPageControl和TNotebook等, 它们都位于Win32组件页上,并且在用法上大同小异。下面我们简单介绍一下PageControl的用法。,TPageControl也被称作页框,它是一种容器类型,它包含的控件为页面(TabSheet)。TPageControl的常用属性有ActivePage、Pag
47、eCount、Pages、Align、TabPosition等。前两个属性分别代表当前页和页面总数。Pages是以TabSheet为元素的数组。Align用法与在其它控件中类似。TabPosition 可取之值为tpTop、tpBottom、tpLeft和tpRight,分别表示页标签显示在页面的顶部、底部、左方和右方。,当一个PageControl刚放入窗体中时,框内是空的。右击该PageControl控件,在弹出的快捷菜单上点击“New Page”项,页框内即增加了一页。点击快捷菜单上“Delete Page”或按Delete键可删除一个页。新建页的Caption属性缺省名称为“TabSh
48、eet1”、“TabSheet2”等,用户可以对其修改。 当完成了PageControl及其页面设置后,就能往各个页面上放置控件。这与往窗体上放置控件是一样的。,3.4.5 MDI程序 MDI(Multiple Document Interface,多文档接口)是Windows应用程序的一种规范。就如同Windows在桌面窗口中维护多个应用程序窗口一样,MDI应用程序在它的客户区中维护多个文档窗口。MicroSoft的Word 97是标准的MDI应用程序,但Word 2000在默认设置下不是一个MDI应用程序。 通常情况下,MDI可分为父窗口和子窗口。父窗口也是程序的主窗口,它可以包含若干个子
49、窗口。MDI还必须符合以下若干规范:,(1) MDI的父窗口通常包含主菜单和缩放边框。通常情况下,它的客户区不显示任何输出,而是用于在其中放置若干个处理文档的子窗口。这些子窗口看上去与普通的应用程序窗口非常相似,但是,子窗口没有菜单,必须使用父窗口上的菜单操作子窗口内的文档。或者说,MDI子窗口的菜单总是合并到父窗口的菜单上。 (2) MDI程序运行时,主程序客户区内可打开多个子窗口,但只能有一个子窗口是活动的。子窗口被最小化时,会以图标形式显示在主窗口的底部。,(3) 主菜单通常包含“File”下拉菜单,该下拉菜单中有“New”、“Open”、“Save”和“Close”等基本的文档操作功能
50、。 (4) 主菜单中通常还有一个“Windows”下拉菜单,该下拉菜单一般能对子窗口进行“平铺”和“层叠”等操作。 BCB 对MDI程序提供了很好的支持,我们可以直接编程或使用向导来建立MDI程序。,以下是TForm类所拥有的若干与MDI有关的属性和方法: (1) ActiveMDIChild属性代表当前处于活动状态的子窗口,它是TForm类型的。 (2) MDIChildCount属性表示父窗口当前所拥有的MDI子窗口数量。 (3) MDIChildren属性是TForm的一个数组,它的每一个元素是一个MDI子窗口。 (4) Tile和Cascade这两个方法分别用于在主窗体的客户区内“平铺
51、”和“层叠”MDI子窗口。 (5) Previous和Next这两个方法分别用于按顺序激活当前MDI子窗口的前一或后一个窗口。,下面是在BCB中创建MDI程序的要点。 1创建主窗口 主窗体Form1作为MDI的主窗口必须设置FormStyle属性为fsMDIForm。为了进行文件操作,一般还要在Form1中放入TOpenDialog和TSaveDialog等组件。 2创建子窗口 选择FileNewForm创建一个子窗口Form2。严格地说,这只是为子窗口建立一个窗口类TForm2,子窗口对象的实例要在程序运行时动态地创建。Form2的FormStyle属性应设置为fsMDIChild,根据文档
52、处理的需要可在Form2中加入其它的组件。,根据MDI程序的特点,我们还要在BCB的“Project”菜单中选择“Options”对话窗口进行相关的设置,使BCB不会自动创建Form2。,3编写事件处理代码 MDI程序中通常要为“New”、“Open”、“Save”、“Copy”和“Paste”等菜单项编写事件代码,具体与MDI处理子窗口中文档的方式有关,读者可参考本节中的范例。 一般地,由于无法事先预料需建立的MDI子窗口的个数,MDI采用动态方式在“New”操作时创建子窗口,因此当关闭子窗口时必须释放内存。所以,通常要在Form2的OnClose事件中加入“Action=caFree;”语
53、句。,下面,我们给出一个MDI应用程序范例。 【例3-6】 Form1为主窗体,主菜单上有“File”、“Edit”和“Windows”三个下拉菜单,其中“File”下拉菜单中有“New”、“Open”、“Save”、“Close”和“Exit”五项;“Edit”下拉菜单中有“Copy”和“Paste”两项;“Windows”下拉菜单中有“Tile”和“Cascade”两项。 Form2 为MDI子窗口的类型。上面放入一个Memo控件,使子窗口能处理文本文件。,要求:程序开始时,主窗体客户区内没有子窗口。选择“New”时打开一个空的子窗口,它的文件名为“UnTitled”(未命名)。选择“Open”时,弹出打开文件对话框,在选中一个文本文件后,打开一个子窗口处理该文件。选择“Save”时将当前文件存盘。若当前文件未命名,则先弹出保存文件对话框供用户输入文件名后再存盘。选择“Close”时关闭当前子窗口。选择“Exit”结束程序。“Copy”和“Paste”提供剪贴板操作。“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业培训课件制作指南
- 油气管线不动火机械冷切割方案
- 企业培训总结课件
- 优化维护服务策略
- 信息技术采购合同知识产权保护与技术创新条款
- 生态停车场投资建设与运营管理合同
- 餐饮行业特色饮品技术与品牌合作协议
- 餐饮连锁品牌跨区域经营股份合作协议
- 矿业开发项目股权交割与收益分成协议
- 车辆挂靠与汽车租赁平台运营合同
- 农发行信贷业务考试题库题库附答案
- 2024普通高中物理课程标准解读
- 精神分裂症护理查房
- 建筑物联网工程综合实训 课件 第1-3章 物联网技术导论、物联网领域的关键技术、智能建造工程场景中的物联网
- 初中数学中心对称图形训练50题(含参考答案)
- 大中小学思政课内容一体化研究
- 下半年消防演练总结
- 奥妥珠单抗注射液
- 市政工程质量创优计划
- 服务质量分析会
- 2023学年完整公开课版《法律的特征》
评论
0/150
提交评论