第3章C++ Builder应用程序界面设计ppt课件_第1页
第3章C++ Builder应用程序界面设计ppt课件_第2页
第3章C++ Builder应用程序界面设计ppt课件_第3页
第3章C++ Builder应用程序界面设计ppt课件_第4页
第3章C++ Builder应用程序界面设计ppt课件_第5页
已阅读5页,还剩178页未读 继续免费阅读

下载本文档

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

文档简介

第3章应用程序界面设计 3 1菜单3 2工具栏与状态行3 3对话框3 4多窗体程序3 5拖放技术3 6窗体的分割 3 1菜单 3 1 1菜单设计器和菜单组件MainMenu组件位于组件面板的Standard页上 将它放入一个应用程序的窗体 然后我们就可以利用菜单设计器 MenuDesigner 设计菜单了 菜单设计器是BCB提供的一个可视化工具 使用起来直观简便 右击窗体中的MainMenu组件 出现该组件的快捷菜单 其中第一项就是 MenuDesigner 选择该项就打开了菜单设计器 如图3 1所示 BCB提供的另一种菜单组件是下拉菜单 PopupMenu 它也可以用MenuDesigner来设计 两种菜单中的各个菜单项都是TMenuItem类的对象 它们是由MenuDesigner在设计过程中添入到菜单组件中去的 如图3 2所示 图3 1MainMenu的快捷菜单 图3 2在MenuDesigner中设计 在MenuDesigner中的操作主要用鼠标 当选中某个菜单项时 ObjectInspector会切换到对应该项的MenuItem对象 此时可输入它的Caption属性 也就是菜单项的名称 若要删除某菜单项 可在MenuDesigner内选中该项后按Delete键 也可右击该菜单项打开它的MenuItem快捷菜单 再选该菜单上的Delete项 若要插入菜单项 可在选中插入位置后按Insert键 也可右击该菜单项打开它的MenuItem快捷菜单 再选该菜单上的Insert项 若要移动菜单项的位置可以用鼠标进行拖曳完成 此外 还可用MenuItem的快捷菜单上的CreateSubMenu选项为菜单项增加一个子菜单 这样就可构建任意层数的菜单系统 如果要在程序运行中动态地增减菜单项 则可在程序中调用TMenuItem对象的Add和Delete方法 根据菜单在应用程序中的作用 它的选项常被指派执行某项功能或操作 BCB中的MenuItem对象都有OnClick事件 为该事件编写的代码即被指派到菜单项对应的操作中 在MenuDesigner中双击菜单项即可打开对应的OnClick事件代码段 在窗体设计区中单击菜单项也能打开OnClick事件代码段 当然 还可以在ObjectInspector中打开MenuItem的OnClick事件 下面是菜单组件的常用属性 1 AutoMerge属性AutoMerge属性用于菜单的合并 当子窗体上菜单的该属性为true时 则在执行程序中会将子窗体上的菜单自动合并到它的父窗体的菜单上 本章3 4 2节将给出有关菜单合并的详细讲解和范例 在该属性不为true时 用户仍可执行Merge方法将两个菜单合并 UnMerge方法则将已合并的菜单拆分 2 Caption属性菜单项上的文字就是该菜单项的Caption属性值 缺省的BCB会将该Caption作为菜单项的Name 但如果Caption中有汉字 则菜单项的Name被缺省设置为N1 N2等 如果在Caption的某个字母前加上一个 符号 则该字符在显示时就会有一个下划线 这一字符就被称为加速键 也就是说 当用户按下Alt键 再加上该字符时 即可选择该菜单 如果对Caption属性输入一个 符号 减号 则在菜单上显示为一条横线 我们可用此线对菜单项进行分组 3 Checked属性Cheched属性若为true 则会在菜单项左方显示一个钩 使该菜单项具有和一个复选按钮类似的作用 但注意 与复选按钮不同的是 BCB不会自动对Checked置值 用户必须在该菜单项的OnClick中写入改变Checked值的代码 4 Enabled属性与其它控件的Enabled的用法属性类似 该属性为false时 对应的菜单项颜色变灰且不能被选择 该属性不仅可用于控制主菜单上的项 也可控制下拉菜单上的项 若要相应菜单项变为不可见 则可设置Visible为false 5 GroupIndex属性GroupIndex属性是整型值 它可控制下拉菜单在主菜单中的位置 即顺序 一般用于在菜单合并时 确定合并后菜单项的位置 6 ShortCut属性ShortCut属性定义了一个可快速访问某个菜单项的快捷键 一般地 该快捷键显示在菜单项的右边 在菜单中可以作为快捷键的一般都是功能键 如F1 F2 或组合键 如Ctrl A Ctrl F2 Alt F3 菜单项被选中时 在ObjectInspector中打开ShortCut的组合框选取或输入 7 Visible属性Visible属性为false时 对应的菜单项不可见 不可见的项当然也是不能被选取的 当某一项不可见时 排列在该项之后的各项位置会自动上移 3 1 2菜单设计范例 例3 1 在应用程序中建立如下菜单系统 主菜单含六个项 分别为 File Edit View Windows Tools 和 Help File 下拉菜单有 New Open Save Print PrintSetup 和 Exit 等六项 它们被分成三个组 并对 New 和 Exit 分别定义了快捷键F10和Ctrl E View 下拉菜单中有 HideHelp 和 ShowHelp 等四项 Tools 下拉菜单中有一项 ToolBar Edit Windows 和 Help 的下拉菜单为空 图3 3为在MenuDesigner中设计该菜单 我们看到菜单中有两条将菜单项分组的横线 它们是通过在Caption中输入 号得到的 图3 3在MenuDesigner中设计菜单 我们希望该菜单系统能实现以下的功能 当选择 Exit 时能退出程序 当选择 ToolBar 时能切换该项的Checked属性 当选择 时使 File 下拉菜单有效 并使 菜单项失效以及 菜单项有效 当选择 时使 File 下拉菜单失效 并使 菜单项失效以及 菜单项有效 当选择 HideHelp 时使 Help 项不可见 当选择 ShowHelp 时使 Help 恢复为可见 当选择 New Open 或 Save 时分别出现一个对话框提示相应的功能 NotCompleted 选择其它项时程序不进行处理 为此 设计时应使 ShowHelp 和 菜单项的Enabled为false 然后为各菜单项的OnClick事件编写以下代码 void fastcallTForm1 Exit1Click TObject Sender Form1 Close void fastcallTForm1 ToolBar1Click TObject Sender ToolBar1 Checked ToolBar1 Checked 使该菜单项的Checked属性值取反 void fastcallTForm1 TObject Sender File1 Enabled true Enabled false Enabled true void fastcallTForm1 TObject Sender File1 Enabled false Enabled true Enabled false void fastcallTForm1 HideHelp1Click TObject Sender Help1 Visible false ShowHelp1 Enabled true HideHelp1 Enabled false void fastcallTForm1 ShowHelp1Click TObject Sender Help1 Visible true ShowHelp1 Enabled false HideHelp1 Enabled true void fastcallTForm1 New1Click TObject Sender ShowMessage NewHasNotCompleted 调用通用函数ShowMessage输出信息 void fastcallTForm1 Open1Click TObject Sender ShowMessage OpenHasNotCompleted 调用通用函数ShowMessage输出信息 void fastcallTForm1 Save1Click TObject Sender ShowMessage SaveHasNotCompleted 调用通用函数ShowMessage输出信息 ToolBar1 Checked ToolBar1 Checked 运行该程序 选择后的画面如图3 4所示 选择HideHelp后的画面如图3 5所示 选择ToolBar后的画面如图3 6所示 再次选择ToolBar后的画面如图3 7所示 在选择了后弹出的消息框如图3 8所示 图3 4选择 图3 5选择HideHelp 图3 6选择ToolBars使Checked被勾选 图3 7再次选择ToolBars取消Checked勾选 图3 8选择弹出消息框 3 2工具栏与状态行 大部分Windows应用程序都有一个工具栏 利用工具栏上的图形按钮可加快操作速度 一般工具栏位于窗体的顶部 在BCB中有许多方法可设计出不同风格的工具栏 其中较简单直接的方法是使用Panel和SpeedButton控件进行的 3 2 1面板和加速按钮1 面板面板 Panel 控件位于组件面板的Standard页上的倒数第二个位置 它是一个容器组件 即可以将其它组件放入面板 它的主要功能就是制作工具栏和状态栏 以下是面板的常用属性 1 Align属性为设置面板在窗体上的位置 可以使用它的Align属性 该属性取值范围为alTop alRight alBottom alLeft alClient和alNone 缺省值为alNone 此时可用鼠标操作确定其位置和尺寸 当作为工具栏使用时 面板常被放置在窗体顶部位于菜单条之下 我们可以用alTop指定该位置 这样 即使窗体尺寸改变 面板也能准确定位 而且能自动改变宽度以保持横贯整个窗体 alRight alLeft alBottom和alTop类似 分别适合将面板定位到窗体的右 左和底部 alClient则定位在整个窗体的客户区 2 BevelInner和BevelOuter属性BevelInner和BevelOuter这两个属性决定了面板的外观 适当搭配二者的值可以产生不同的三维效果 它们的取值范围为bvLowered bvNone bvRaised和bvSpace 缺省值BevelInner None BevelOuter Raised 3 Caption属性面板也有Caption属性 因此可在面板上显示文字 此时 它的功能类似于Label组件 但可以制作出三维效果 简单的状态栏就是利用面板的Caption制作的 在用作工具栏时 一般应将Caption置为空白 4 Visible属性Visible属性为false时 可隐藏面板及面板上的组件 我们可用来隐藏工具栏 2 加速按钮加速按钮 SpeedButton 是位于Additional页上第二个位置的组件 它与按钮类似 但可以在表面上放置图形 与按钮或位图按钮 BitButton 相比 它没有窗口句柄 不消耗Windows资源 绘制速度也更快一点 所以 非常适合用作工具栏上的工具按钮 加速按钮有以下主要属性 1 Glyph属性Glyph属性指定一个图像文件放到加速按钮的表面 点击ObjectInspector中该属性右侧的 按钮就打开PictureEditor对话框 可选 Load 按钮指定一个图片文件 按 OK 完成装入 如图3 9所示 一般应装入小型位图或图标 20 20像素左右 位图文件既可通过各种途径收集得到 也可利用BCB的ImageEditor工具自行绘制 参见本书基础篇1 3 6节 在BCB的目录C ProgramFiles CommonFiles BorlandShared Images Buttons下就有许多按钮图标 图3 9输入Glyph属性时选择位图 2 NumGlyphs属性NumGlyphs属性可输入数字1 4 缺省值为1 它表示加速按钮中包含的位图的数目 当该数目为2时 第一个位图为按钮的标准状态 第二个位图用于按钮失效时 当该数目为4时 第一 二个位图作用同前 第三个位图用于单击按钮时 第四个位图用于按钮持续保持按下状态时 前面提到Buttons目录下有许多按钮的位图 如果打开这些位图观察可以发现它们都是 两位一体 的 即图片中横向并排着两个同样尺寸的类似图形 其实这些图形就是专门被定制成可以用作NumGlyphs等于2时的按钮表面贴图 类似地 如果用于NumGlyphs等于4时的贴图 图片中必须包含从左到右排列的四个同样尺寸的小图形 3 Hint和ShowHint属性Hint和ShowHint属性用于产生提示 该两个属性并非加速按钮专有 但由于仅靠一幅简单的位图难以表达复杂的意义 加速按钮更加需要有自我提示的功能 Hint是字符串类型的属性 应输入提示的内容 ShowHint则是bool型 当它为true时组件具有提示功能 3 2 2工具栏设计范例下面给出一个工具栏程序范例 例3 2 我们在前面例3 1的基础上 保留主菜单上的 File Edit 和 Tools 三个下拉菜单 删去其余菜单项 往该程序窗体内放入一个由面板Panel1和三个加速按钮组成的工具栏 Panel1的Align设置为alTop 三个加速按钮的Glyph中分别装入三个位图 它们的ShowHint都设置为true Hint属性分别输入 New Open 和 Save 再将菜单项 ToolBar 的Checked属性设置为true 表示程序在初始状态下显示工具栏 各菜单项的OnClick基本上与例3 1中相同 但 ToolBar 的OnClick事件中应增加改变Panel1的Visible属性的语句 程序中 工具栏上三个加速按钮的功能应分别等同于菜单上的 New Open 和 Save 即它们可以分别与三个菜单项的OnClick事件分享代码 因此 可按如下方式定义三个按钮的OnClick事件 选中第一个按钮 在ObjectInspector中选Events页 在OnClick事件右面组合框中选择New1Click 即菜单项 New 的OnClick事件的名称 然后对第二 三个按钮进行类似操作 如图3 10所示 图3 10为加速按钮选择OnClick 下面是该范例中惟一需要修改的代码段 void fastcallTForm1 ToolBar1Click TObject Sender ToolBar1 Checked ToolBar1 Checked if ToolBar1 Checked Panel1 Visible true elsePanel1 Visible false 程序运行开始时的画面如图3 11所示 若把鼠标靠近加速按钮并停留 就会看到提示信息 选择ToolBar菜单项 能打开或关闭工具栏 图3 12为工具栏已被关闭 当点击三个加速按钮时 与点击菜单项 New Open 和 Save 时一样 会出现一个显示 XXXHasNotCompleted 的信息框 我们也可以把组合框 微调按钮 UpDown 等控件放到面板组件上 做出一个像Word中那样有更加复杂功能的工具栏 如图3 13所示 图3 11程序初始画面图3 12工具栏已关闭 图3 13一个复杂的工具栏 3 2 3StatusBar组件通常在Windows应用程序的底部有一个状态行 用以提供一些系统信息和提示 C Builder中我们可以利用面板组件制作状态行 但效果较差 本节中将介绍StatusBar组件 它位于Win32页上 是非常适合用作状态行的 StatusBar可以看作是面板的容器 它可包含有若干面板 从左向右排列 其中每个面板都能被独立控制 用于显示一项信息 图3 14为含有五个面板的StatusBar组件 图3 14StatusBar组件 下面简单介绍一下StatusBar的主要属性 1 Align属性用法与面板的Align一样 但作为状态行组件 其缺省值被设置为alBottom 2 Font属性Font属性可设置状态行中使用的字体 但必须同时设置UseSystemFont为false 否则状态行使用系统定义的字体 3 SimplePanel属性SimplePanel属性为true时 StatusBar具有一个简单面板 Panel 的一切特征 而不能作为面板容器使用 一般 应设置SimplePanel为false 4 Panels属性Panels属性是StatusBar最主要的属性 它是一个数组 其中的每个元素代表一个面板 当SimplePanel为false时 可点击Panels属性值右侧的 按钮打开一个面板设置对话框 如图3 15所示 打开该对话框的另一个办法是右击StatusBar 当出现快捷菜单后 再选择 PanelsEditor 图3 15使用PanelsEditor PanelsEditor是一个小窗口 开始时为空 每次点击工具栏上的 New 左面第一个 按钮就在窗口中增加一个项 相应地StatusBar中也增加了一个面板 当在PanelEditor中选中某项时 ObjectInspector中会切换到与其对应的面板 我们就能设置该面板的Width Bevel和Alignment等属性 Bevel属性与面板的外观有关 一个状态行组件的各个面板可分别有不同的Bevel值 Alignment的可选值为taCenter 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 键盘上NumLock键的状态 显示为NUM或空白 我们让前三项居中显示 后两项靠左显示 如图3 16所示 图3 16程序运行时状态行中显示有关信息 操作要点将StatusBar控件放入窗体 设置其Align为alBottom SimplePanel和UseSystemFont为false 并选择适当的字体和颜色 右击StatusBar打开PanelEditor 五次点击New工具按钮添加面板 将五个面板的Width分别设置为100 100 100 50和50 并将前三项Alignment设置为taCenter 后两项设置为taLeftJustify 为了能实时显示动态信息 我们需要每隔一小段时间将状态行刷新一遍 因此要在Form1中加入一个定时器组件Timer1 位于组件面板上System页 我们将该Timer的Interval设为100 Enabled设为true 并为Timer1编写OnTimer事件的代码如下 void fastcallTForm1 Timer1Timer TObject Sender AnsiStringstr1 显示时间TDateTimeDateTime Time StatusBar1 Panels Items 0 Text 时间 TimeToStr DateTime 显示插入点位置str1 位置 str1 str1 IntToStr Memo1 CaretPos y 行 str1 str1 IntToStr Memo1 CaretPos x 列 StatusBar1 Panels Items 1 Text str1 显示字数 str1 Memo1 Lines Text StatusBar1 Panels Items 2 Text 字数 IntToStr str1 Length 显示NUM状态if GetKeyState VK NUMLOCK StatusBar1 Panels Items 3 Text NUM elseStatusBar1 Panels Items 3 Text 显示INS状态 if GetKeyState VK INSERT StatusBar1 Panels Items 4 Text INS elseStatusBar1 Panels Items 4 Text 评析 1 StatusBar1 Panels Items i Text属性代表状态行中第i个面板上的文本 i 0 1 2 3 4 我们只要将有关信息放入相应的Text属性即可 2 可用Time函数取得TDateTime类型的时间信息 再用函数TimeToStr把它转换为AnsiString字符串类型 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事件确定 注意 设置Timer的Enabled为true 以启动Timer的时控功能 6 本例中为了能显示一些有意义的信息 使用了若干WindowsAPI函数 在本书提高篇中将较系统地介绍WindowsAPI 对初学者来说 如何在各种场合取得所需的状态信息 可以是一个逐渐积累的过程 3 3对话框 3 3 1对话框与模态窗口设计对话框与设计普通的窗体没什么本质区别 但对话框一般具有如下特征 1 在程序中不作为主窗体 通常被缺省命名为Form2或Form3等 在BCB中为了给应用程序加入第二个窗体 或第三个窗体等 可选 Form菜单项或点击相应的工具按钮 对于有两个以上 含两个 窗体的程序 在与主窗体Form1对应的Unit1 h 或Unit1 cpp 中一般要加入 include Unit2 h 语句 或执行UnitHdr 命令 否则 在Form1中就不能识别Form2中定义的对象 至于是否要在uint2 h中加入 include Unit1 h 则应看具体情况 2 窗口标题一般应为对话框名称 窗口内没有主菜单 边框上无控制按钮 也不能改变窗口尺寸 要做到这一点 较简单的方法是设置BorderStyle属性为bsDialog 3 窗口往往以模态方式打开 Windows的窗口可定义为模态窗口或非模态窗口 当应用程序打开一个模态窗口后 只要该窗口未关闭 就不能对程序中的其它窗口进行任何操作 以此方式强制用户对该模态窗口作出响应 所谓以模态方式打开即指使打开的窗口成为模态窗口 在BCB中一个窗口是否为模态一般并非取决于其设计阶段 而是由打开该窗口时使用的方法所确定 如果一个窗口是被Show方法打开的 那么它就是非模态方式的 如果用ShowModal方法打开窗口 那么该窗口就是模态的 3 3 2信息框C Builder中使用ShowMessage和MessageDlg函数产生标准的Windows信息框 这种信息框是一个模态窗口 ShowMessage使用方便但功能较弱 只能显示一个带有OK按钮的信息框 在例3 1中我们已经用过该函数 MessageDlg函数适用范围更广 它有四个参数 BCB对该函数声明如下 int fastcallMessageDlg constAnsiStringMsg TMsgDlgTypeDlgType TMsgDlgButtonsButtons intHelpCtx Msg参数指定了显示的信息 DlgType参数可指定信息框的类型 该参数为TmsgDlgType类型 它的取值范围及含义如表3 1所示 Buttons参数指定了信息框所包含的按钮 类型为TmsgDlgButtons 它的取值范围及含义如表3 2所示 HelpCtx参数可指定当用户单击Help按钮或按F1键时所弹出的帮助主题的帮助上下文ID MessageDlg函数返回一个整数 代表用户在对话框中所选的按钮 该值必定为以下预定义常数之一 mrNone mrAbort mrYes mrOk mrRetry mrNo mrCancel mrIgnore mrAll 表3 1DlgType参数的取值 表3 2Buttons参数的取值 下面一段代码出现一个信息框询问用户是否退出程序 若选择Yes 则关闭Form1 使程序结束 代码运行时的画面如图3 17所示 if MessageDlg 是否退出程序 mtConfirmation TMsgDlgButtons Close 图3 17使用MessageDlg函数 3 3 3通用对话框组件在组件面板的Dialog页上有一组共10个通用对话框组件可供使用 这些对话框实际上是由Windows提供的 BCB把它们包装了一下 使用更加方便了 其中 最常用的是OpenDialog 打开文件 SaveDialog 保存文件 FontDialog 字体 和ColorDialog 颜色 对话框 图3 18 图3 21为这四个对话框的画面 另外几个是OpenPictureDialog 打开图形 SavePictureDialog 保存图形 PrintDialog 打印 PrinterSetupDialog 打印机设置 FindDialog 查找 和ReplaceDialog 替换 对话框 图3 18OpenDialog 图3 19SaveDialog 图3 20FontDialog 图3 21ColorDialog 这些对话框的用法是类似的 先调用组件的Execute方法打开对话框供用户操作 当操作完成对话框被关闭后 用户选定的对象被存放在该组件的相应属性内 如操作OpenDialog和SaveDialog对话框所选定的文件名被存放在属性内 FontDialog中选定的字体被存放在Font属性内 ColorDialog中选定的颜色则被存放在Color属性内 例3 4 在窗体Form1中放入一个TColorDialog组件ColorDialog1 再放入一个按钮组件Button1 为Button1的OnClick事件编写如下代码 void fastcallTForm1 Button1Click TObject Sender if ColorDialog1 Execute Form1 Color ColorDialog1 Color 程序运行时 点击Button1弹出颜色对话框 在对话框中选定颜色并点击 确定 后 程序使Form1的颜色改变为所选颜色 注意 ColorDialog1 Execute 函数返回一个整型值 若用户在对话框中选定后按 确定 退出则该值为1 若按 取消 退出则为0 因此 根据用户是否选中了某种颜色 程序中用if语句来判定是否需要设置窗体的颜色 具体设置窗体颜色则是通过 Form1 Color ColorDialog1 Color 语句完成的 3 4多窗体程序 3 4 1项目与窗体BCB应用程序通常是一个项目 项目文件的扩展名为 bpr 这是一个C 的源文件 我们可以执行Project ViewSource菜单命令打开该文件 通常BCB6 0缺省定义下项目文件包含如下代码 include pragmahdrstop USEFORM Unit1 cpp Form1 WINAPIWinMain HINSTANCE HINSTANCE LPSTR int try Application Initialize Application CreateForm classid TForm1 catch Exception 一般情况下初学者不需要修改该文件的代码 应用程序项目通常还含有若干窗体 每个窗体由三个文件组成 它们分别是扩展名为 cpp的源文件 扩展名为 h的头文件和扩展名为 dfm的窗体定义文件 在BCB5 0以前版本中 通常要按Ctrl F6键才能将对应某个 cpp文件的头文件在代码编辑器中打开 而BCB6 0只要在代码编辑器中选择某个 cpp文件 此时编辑器窗口的底部就会出现相应头文件的标签 点击该标签就能打开它 一个项目可以有多个窗体 但其中只有一个是主窗体 通常是Form1 主窗体构成程序的主控界面 每次启动时 BCB自动生成含有一个空的主窗体的项目框架 用户在设计中将各种组件放入该窗体 并编写若干事件代码 如果要编写多窗体应用程序 那么从第二个窗体开始 必须由用户在项目中进行添加 可以执行 Form菜单命令或者使用 NewForm 工具按钮为当前项目添加一个新窗体 注意 当我们需要建立一个新项目时 应首先执行All关闭当前项目 然后再执行 Application菜单命令 有些类型的项目如DLL是不包含任何窗体的 它们一般要由专门的向导生成 读者可参考本书提高篇9 5节 也可以将几个项目结合起来建立更复杂的应用 BCB支持项目组 ProjectGroup 的概念 可以执行View ProjectManager菜单命令进入项目管理器窗口对项目组进行管理 3 4 2窗体之间的关系在多窗体应用程序中窗体之间可以有两种常见的关系 主从关系和父子关系 C Builder创建的窗体中 Form1一般是主窗体 它在程序中具有较重要的地位 如Form1被关闭时 程序通常也就结束了 其它窗体与Form1的关系往往就是主从关系 如Form2可能是Form1在某项操作时需要的一个对话框等 一般 可在主窗体中调用从属窗体的Show Hide和Close等方法控制它们的显示 隐藏和关闭等 窗口的父子关系则是Windows中的概念 子窗口可以从父窗口那里继承到一些特性 但只能在父窗口客户区范围内显示或移动 此外 当父窗口关闭时 所有子窗口会自动被关闭 子窗口必定是从属于父窗口的 但一般在窗口的主从关系中 从属的一方不一定是子窗口 如BCBIDE的ObjectInspector和代码编辑器都是从属于主窗口的 但不是子窗口 它们可以在主窗口之外移动 在BCB程序中 当需要指定一个子窗口时 可以在相关的代码中将子窗口的Parent属性设置成它的父窗口 例如Form2 Parent Form1 3 4 3菜单的合并在多窗体应用程序中 从属于主窗体的窗口 不管它是否为子窗口 上如果有菜单 通常会将其与主窗体上的菜单合并 在BCB中要做到这一点很容易 只要适当设置菜单的AutoMerge和GroupIndex属性即可 下面给出一个例子 例3 5 应用程序主窗体Form1有如下菜单系统 主菜单上有三项 分别为 File Windows 和 Help File 下拉菜单中有 New Open Save 和 Exit 四项 Windows 下拉菜单中有 ShowForm2 和 HideForm2 两项 Help 没有下拉菜单 选 Exit 可退出程序 选 ShowForm2 或 HideForm2 则分别显示或隐藏Form2 Form2上也有一个主菜单 它只有一个下拉菜单 Edit 该下拉菜单上有 Copy 和 Paste 两项 要求程序开始时 Form2不显示 选 ShowForm2 时 Form2显示并将 Edit 菜单合并到Form1的菜单上 制作步骤 1 在窗体Form1上放一个主菜单MainMenu1 在MenuDesigner中设计主菜单 注意 MainMenu1的AutoMerge应设为false File Windows Help 三项的GroupIndex可分别设置为1 3 5 2 选取 Form菜单命令 在项目中加入Form2 在Form2中加入主菜单 将AutoMerge设置为true Edit 下拉菜单的GroupIndex可设为4 3 在Unit1 cpp中加入 include Unit2 h 语句 4 对Form1的 Exit ShowForm2 和 HideForm2 的OnClick事件编写如下的代码 void fastcallTForm1 Exit1Click TObject Sender Form1 Close void fastcallTForm1 ShowForm21Click TObject Sender Form2 Show void fastcallTForm1 HideForm21Click TObject Sender Form2 Hide 该程序运行时初始画面如图3 22所示 点击 ShowForm2 菜单后的画面如图3 23所示 注意 其中的菜单已被合并 合并后各下拉菜单的顺序是按照GroupIndex从小到大排列的 图3 22Form2未显示时 图3 23Form2显示时菜单被合并 我们可以进一步对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设计多页窗体多页窗体 也可称作属性对话框 是一种较新颖的图形界面 它使用某些控件 将窗体分成若干个页面 用户可单击页标签在不同的页面间切换 这种界面的一个明显好处是扩大了窗体的客户区 使其能排列大量的控件 也便于区分对话框的不同功能区域 BCB提供了几种用于建立多页窗体的控件 它们是TTabControl TPageControl和TNotebook等 它们都位于Win32组件页上 并且在用法上大同小异 下面我们简单介绍一下PageControl的用法 TPageControl也被称作页框 它是一种容器类型 它包含的控件为页面 TabSheet TPageControl的常用属性有ActivePage PageCount Pages Align TabPosition等 前两个属性分别代表当前页和页面总数 Pages是以TabSheet为元素的数组 Align用法与在其它控件中类似 TabPosition可取之值为tpTop tpBottom tpLeft和tpRight 分别表示页标签显示在页面的顶部 底部 左方和右方 当一个PageControl刚放入窗体中时 框内是空的 右击该PageControl控件 在弹出的快捷菜单上点击 NewPage 项 页框内即增加了一页 点击快捷菜单上 DeletePage 或按Delete键可删除一个页 新建页的Caption属性缺省名称为 TabSheet1 TabSheet2 等 用户可以对其修改 当完成了PageControl及其页面设置后 就能往各个页面上放置控件 这与往窗体上放置控件是一样的 3 4 5MDI程序MDI MultipleDocumentInterface 多文档接口 是Windows应用程序的一种规范 就如同Windows在桌面窗口中维护多个应用程序窗口一样 MDI应用程序在它的客户区中维护多个文档窗口 MicroSoft的Word97是标准的MDI应用程序 但Word2000在默认设置下不是一个MDI应用程序 通常情况下 MDI可分为父窗口和子窗口 父窗口也是程序的主窗口 它可以包含若干个子窗口 MDI还必须符合以下若干规范 1 MDI的父窗口通常包含主菜单和缩放边框 通常情况下 它的客户区不显示任何输出 而是用于在其中放置若干个处理文档的子窗口 这些子窗口看上去与普通的应用程序窗口非常相似 但是 子窗口没有菜单 必须使用父窗口上的菜单操作子窗口内的文档 或者说 MDI子窗口的菜单总是合并到父窗口的菜单上 2 MDI程序运行时 主程序客户区内可打开多个子窗口 但只能有一个子窗口是活动的 子窗口被最小化时 会以图标形式显示在主窗口的底部 3 主菜单通常包含 File 下拉菜单 该下拉菜单中有 New Open Save 和 Close 等基本的文档操作功能 4 主菜单中通常还有一个 Windows 下拉菜单 该下拉菜单一般能对子窗口进行 平铺 和 层叠 等操作 BCB对MDI程序提供了很好的支持 我们可以直接编程或使用向导来建立MDI程序 以下是TForm类所拥有的若干与MDI有关的属性和方法 1 ActiveMDIChild属性代表当前处于活动状态的子窗口 它是TForm类型的 2 MDIChildCount属性表示父窗口当前所拥有的MDI子窗口数量 3 MDIChildren属性是TForm的一个数组 它的每一个元素是一个MDI子窗口 4 Tile和Cascade这两个方法分别用于在主窗体的客户区内 平铺 和 层叠 MDI子窗口 5 Previous和Next这两个方法分别用于按顺序激活当前MDI子窗口的前一或后一个窗口 下面是在BCB中创建MDI程序的要点 1 创建主窗口主窗体Form1作为MDI的主窗口必须设置FormStyle属性为fsMDIForm 为了进行文件操作 一般还要在Form1中放入TOpenDialog和TSaveDialog等组件 2 创建子窗口选择 Form创建一个子窗口Form2 严格地说 这只是为子窗口建立一个窗口类TForm2 子窗口对象的实例要在程序运行时动态地创建 Form2的FormStyle属性应设置为fsMDIChild 根据文档处理的需要可在Form2中加入其它的组件 根据MDI程序的特点 我们还要在BCB的 Project 菜单中选择 Options 对话窗口进行相关的设置 使BCB不会自动创建Form2 3 编写事件处理代码MDI程序中通常要为 New Open Save Copy 和 Paste 等菜单项编写事件代码 具体与MDI处理子窗口中文档的方式有关 读者可参考本节中的范例 一般地 由于无法事先预料需建立的MDI子窗口的个数 MDI采用动态方式在 New 操作时创建子窗口 因此当关闭子窗口时必须释放内存 所以 通常要在Form2的OnClose事件中加入 Action caFree 语句 下面 我们给出一个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 提供剪贴板操作 Tile 和 Cascade 将MDI子窗口在主窗体客户区内 平铺 和 层叠 所有的子窗口按其打开的顺序编号 并在子窗口标题上显示 制作步骤 1 对主窗体Form1设置FormStyle属性为fsMDIForm 并放入TOpenDialog和TSave Dialog对话框组件各一个 2 在项目中加入Form2 它的FormStyle属性设置为fsMDIChild 在Form2中加入一个TMemo控件 并使它的Align属性为alClient Lines属性为空 3 在Unit1 cpp中加入 include Unit2 h 语句 4 在代码编辑器内切换到Unit2 h头文件 在TForm2类声明的public段内加入 AnsiString 语句 5 选择 Project 菜单上的Options项 打开项目设置对话框 如图3 26所示 选择 Forms 页 在 Autocreateforms 框内选中Form2 点击 按钮 将Form2从 Autocreateforms 框移到 Availableforms 框内 使程序开始时不创建Form2 图3 26项目设置对话框 6 为Form1菜单上各个项的OnClick事件以及Form2的OnClose事件编写代码 文件Unit1 cpp include Unit1 h include Unit2 h void fastcallTForm1 Tile1Click TObject Sender Form1 Tile 调用主窗体Tile方法平铺窗口 void fastcallTForm1 Cascade1Click TObject Sender Form1 Cascade 调用主窗体Cascade方法层叠窗口 void fastcallTForm1 New1Click TObject Sender TForm2 ChildForm ChildForm newTForm2 this 创建新窗体ChildForm Caption 子窗体 IntToStr MDIChildCount 窗体标题给以编号ChildForm UnTitled 相应文件未命名ChildForm Show void fastcallTForm1 Open1Click TObject Sender if OpenDialog1 Execute TForm2 ChildForm ChildForm newTForm2 this ChildForm Caption 子窗体 IntToStr MDIChildCount ChildForm OpenDialog1 ChildForm Memo1 Lines LoadFromFile OpenDialog1 ChildForm Show 将打开的文件放入新建窗体内并显示 void fastcallTForm1 Close1Click TObject Sender if MDIChildCount 0 ActiveMDIChild Close 关闭当前子窗体 void fastcallTForm1 Save1Click TObject Sender TForm2 ChildForm ChildForm TForm2 ActiveMDIChild 强制类型转换 if ChildForm UnTitled 文档尚未命名则打开保存文件对话框 if SaveDialog1 Execute ChildForm Memo1 Lines SaveToFile SaveDialog1 elseChildForm Memo1 Lines SaveToFile ChildFo

温馨提示

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

评论

0/150

提交评论