430 likes | 666 Views
第 3 章 对话框. 3.1 创建对话框. [ 例 Ex_DlgDemo] 使用向导创建对话框应用程序 (1) 选择“文件” “新建”菜单,在弹出的“新建”对话框中选择“工程”页面,选择 MFC AppWizard(exe) ,在工程框中输入项目名 Ex_DlgDemo 。. 3.1 创建对话框. (2) 单击 [ 确定 ] 按钮,在出现的“ Step 1” 对话框中选择“基本对话 ( 框 )” 应用程序类型,如图所示。.
E N D
3.1 创建对话框 [例Ex_DlgDemo] 使用向导创建对话框应用程序 (1) 选择“文件”“新建”菜单,在弹出的“新建”对话框中选择“工程”页面,选择MFC AppWizard(exe),在工程框中输入项目名Ex_DlgDemo。
3.1 创建对话框 (2) 单击[确定]按钮,在出现的“Step 1”对话框中选择“基本对话(框)”应用程序类型,如图所示。 (3) 单击[下一个]按钮,出现如图(右)所示的对话框,允许用户设置对话框的风格及ActiveX控件等特点的支持。
3.1 创建对话框 (4) 单击[下一个]按钮出现如图(左)所示的对话框,两个方面的选项可供用户选择:一是在源文件中是否加入注释用来引导用户编写程序代码,另一是使用动态链接库还是静态链接库。 (5) 保留默认选项,单击[下一个]按钮出现如图(右)所示的对话框。
3.1 创建对话框 (6) 单击[完成]按钮出现一个对话框,显示出用户在前面几个步骤中作出的选择内容,单击[确定]按钮系统开始创建。 或 按快捷键 上的运行工具按钮 (7) 单击编译工具条 Ctrl+F5,系统开始编连并运行生成的对话框 应用程序可执行文件Ex_DlgDemo.exe,结果如图所示
3.1 创建对话框 • 1. 资源的分类 • 创建一个默认的单文档应用程序项目Ex_SDI1,并其项目工作区窗口切换到“ResourceView”页面,Ex_SDI1资源视图:
3.1 创建对话框 Visual C++ 6.0使用的资源可分为下列几类: 快捷键列表(Accelerator):一系列组合键的集合,被应用程序用来引发一个动作。 对话框(Dialog):含有按钮、列表框、编辑框等各种控件的窗口。图标(Icon):代表应用程序显示在Windows桌面上的位,它同时有3232像素和1616像素两种规格。 菜单(Menu):用户通过菜单完成应用程序的大部分操作。 字串表(String Table):应用程序使用的全局字符串或其他标识符。 工具栏按钮(Toolbar):工具栏外观是以一系列具有相同尺寸的位图组成的 版本信息(Version):包含应用程序的版本、用户注册码等相关信息。
3.1 创建对话框 2. 标识符 当添加或创建资源或资源对象时,系统会为其提供默认的名称,如IDR_MAINFRAME等。要遵循下列规则: (1) 在标识符名称中允许使用字母a~z、A~Z、0~9以及下划线。 (2) 标识符名称不区分大小写字母,如new_idd与New_Idd是相 同的标识符。 (3) 不能以数字开头,如8BIT是不合法的标识符名。字符个数不得超过247个。 Visual C++还提供了一些常用的定义标识符名称的前缀供用户使用、参考,每一个定义的标识符都保存在应用程序项目的Resource.h文件中,它的取值范围为0~32767。
3.1 创建对话框 字符个数不得超过247个。除了上述规则外,出于习惯,Visual C++还提供了一些常用的定义标识符名称的前缀供用户使用、参考,见表
3.2.2 添加对话框资源 [例Ex_SDI] 在单文档程序中添加对话框资源 创建一个默认的单文档应用程序项目Ex_SDI。 (1) 选择“插入”“资源”菜单,或按快捷键Ctrl+R打开“插入资源” 对话框中看到资源列表中存在Dialog项,若单击Dialog项左边的“+”号,将展开对话框资源的不同类型选项,表列出各种类型的对话框资源的不同用途。“插入资源”对话框 :
3.2.2 添加对话框资源 [新建]按钮用来创建一个由“资源类型”列表中指定类型的新资源。 [定制]按钮是用来创建“资源类型”列表中没有的新类型的资源。 [导入]按钮是用于将外部已有的位图、图标、光标或其他定制的 资源添加到当前应用程序中。
3.2.2 添加对话框资源 (2) 对展开的不同类型的对话框资源不作任何选择,选中“Dialog”,单击[新建]按钮,系统就会自动为当前应用程序添加了一个对话框资源。
3.2.2 添加对话框资源 系统为对话框资源自动赋给它一个默认标识符名称 使用通用的对话框模板创建新的对话框资源。对话框的默认标题为Dialog,有[OK]和[Cancel]两个按钮,这两个按钮的标识符分别为IDOK和IDCANCEL。 对话框模板资源所在的窗口称为对话框资源编辑,在这里可以通过控件工具栏和布局工具栏向对话框添加和布局控件,并可设置对话框的属性。 Visual C++6.0开发环境的工具栏具有“浮动”与“停泊”功能,图中的控件工具栏是处于“浮动”状态,通常将它拖放到窗口右侧,以便于操作。
3.2.3 设置对话框属性 在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,出现如图所示的对话框属性窗口。 对话框的属性有General(一般)、Styles(风格)、More Styles(更多)、Extended Styles(扩展风格)、MoreExtended Styles(更多扩展风格)等部分,这里仅介绍最常用的General属性。
3.2.3 设置对话框属性 对话框的General属性 将添加对话框的General属性进行如下三点修改, 将对话框标识符改成IDD_DIALOG_FIRST; 将对话框标题改为“我的第一个对话框”; 单击[字体]按钮,通过弹出的字体对话框将对话框内的文本设置成“宋体,9” ,以使自己的对话框和Windows中的对话框保持外观上的一致。
控件的选择 静态图片 静态文本 编辑框 组框 按钮 复选框 单选框 组合框 列表框 水平滚动条 垂直滚动条 旋转按钮 进展条 滑动条 热键 列表视图 树形视图 标签 动画 复合编辑 日期选择 月历 IP地址 用户定制工具 组合框的扩展 3.2.4 添加和布局控件 • 1. 控件的添加 • 对话框编辑器最初打开时,控件工具栏是随之出现的,利用 此工具栏中的各个按钮可以顺利完成控件的添加。说明了各 个图标按钮所对应的控件类型。
3.2.4 添加和布局控件 • 对话框中添加一个控件的方法有下列几种: 在控件工具栏中单击某控件,此时鼠标箭头在 对话框内变成“十”字形状;在对话框指定位置单击 鼠标左键,则此控件被添加到对话框的相应位,再 拖动选择框可改变控件的大小和位置。 在控件工具栏中单击某控件,此时鼠标箭头对 话框内变成“十”字形状;在指定位置单击鼠标左键 不放,拖动鼠标至满意位置,释放鼠标键。 用鼠标左键点中控件工具栏中的某控件,按住 鼠标左键不放;在移动鼠标到对话框的指定位置的 过程中,会看到一个虚线框,下面带有该控件的标 记;释放鼠标左键,新添加的控件立即出现在对话 框中。
3.2.4 添加和布局控件 2. 控件的选取 控件的删除、复制和布局操作一般都要先选取控件,若选取单个控件,则可以下列方法: 鼠标直接选取。首先保证在控件工具栏中的选择按钮( )是被选中的,然后移动鼠标指针至指定的控件上,单击鼠标左键即可。 用助记符来选取。如果控件的标题中带有下划线的字符,这个字符就是助记符,选择时直接按下该助记符键或“Alt+助记符”组合键即可。 用Tab键选取。在对话框编辑器中,系统会根据控件的添加次序自动设置相应的Tab键次序。利用Tab键,用户可在对话框内的控件中进行选择。
(a) (b) 3.2.4 添加和布局控件 对于多个控件的选取,可采用下列方法: 先在对话框内按住鼠标左键不放,拖出一个大的虚框,然后释放鼠标,则被虚框所包围的控件将被选取。 先按住Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。 需要注意的是: (1) 单个控件被选取后,选择框上还有几个蓝色实心小方块,拖动它可改变控件的大小。 (2) 多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件的小方块。
靠齐右边 左右居中 高度相同 测试对话框 靠齐下边 上下间隔相等 显示网格 靠齐上边 左右间隔相等 大小相同 靠齐左边 上下居中 宽度相同 显示标尺 3.2.4 添加和布局控件 • 3. 控件的删除、复制和布局 • 单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。在鼠标拖动过程中还按住Ctrl键则复制控件。按Del键可将选取的控件删除。对控件的布局,对话框编辑器中提供了控件布局工具栏可以自动地排列对话框内的控件,并能改变控件的大小。
3.2.4 添加和布局控件 布局工具相对应的菜单命令在“编排”菜单下,而且大部分命令均有相应的快捷键。 “编排”菜单不是在Visual C++ 6.0开发环境一开始就出现的,而是随着对话框编辑器的打开而显示的。值得注意的是: 大多数布置控件的命令使用前,都需要用户选取多个控件,且“主要控件”起到了关键作用。只改变其它控件的大小,并与“主要控件”的尺寸一致。设置的方法是按住Ctrl或Shift键,然后用鼠标单击所要指定的控件即可。 为了便于用户在对话框内精确定位各个控件,系统还提供了网格、标尺等辅助工具。一旦网格显示,添加或移动控件时都将自动定位在网格线上。
3.2.4 添加和布局控件 • 4. 测试对话框 • “编排”菜单下的Test命令或布局工具栏上的测试按钮 • 是用来模拟所编辑的对话框的运行情况,帮助用户检验 • 对话框是否符合用户的设计要求以及控件功能是否有效 • 等。如图 (右下) 右击添加的控件,从快捷菜单中选择“属性”,出现如 图(左上)
3.2.5 创建对话框类 在应用程序中使用添加的对话框须先为该对话框模板创建 一个用户对话框类。在对话框资源模板的空白区域(没有其他 元素或控件)内双击鼠标,将弹出对话框 单击[OK]按钮,弹出 右图所示的对话框。 在Name框中输入类名CFirstDlg,单击[OK]按钮,一个基于 对话框资源模板的用户对话框类CFirstDlg就创建好了。此时 出现MFC ClassWizard(MFC类向导)对话框。
3.2.6 添加对话框代码 在MFC ClassWizard对话框中,可以看到“Class name”组合框已经是CFirstDlg。 在Member functions表框中选择刚添加 的OnInitDialog,单击[Edit Code] 将出现函数代码编辑窗口,在函数中添码: BOOL CFirstDlg::OnInitDialog() { CDialog::OnInitDialog(); Static*pWnd=(CStatic*)GetDlgItem (IDC_STATIC_1); pWnd->SetWindowText (“这是我的 第一个对话框!"); return TRUE; // return TRUE unless you set the focus to a control } 单击[Add Function]按钮或双 击WM_INITDIALOG消息,MFC ClassWizard自动为CFirstDlg 类添加OnInitDialog函数。
3.2.7 在程序中使用对话框 (1) 在项目工作区窗口中选择ResourceView页面, 双击资源“Menu”项中的IDR_MAINFRAME,则菜单 编辑器窗口出现在主界面的右边,相应的Ex_SDI项 目的菜单资源被显示出来,在菜单的最后一项,Vis ual C++为用户留出了一个空位置,用来输入新的菜 单项,如图
3.2.7 在程序中使用对话框 (2) 在菜单的空位置上双击鼠标左键,则出现它的属性 对话框,在标题框中输入“测试(&T)”,结果如图所示,其 中符号&用来其后面的字符作为该菜单项的助记符,这样 当按住“Alt”键不放,再敲击该助记符键时,对应的菜单项 就会被选中,或在菜单打开时,直接按相应的助记符键, 对应的菜单项也会被选中。
3.2.7 在程序中使用对话框 (3) 单击菜单属性对话框中的“保存可见”(Keep Visible) 按钮,使此属性对话框一直可见,以方便操作。单击“测 试”菜单项下方的空位置,在属性对话框中,输入标题“对 话框(&D)”,在ID框输入该菜单项的资源标识;_TEST_DLG, 结果如图所示,单击属性对话框右上角的关闭按钮。
3.2.7 在程序中使用对话框 (4) 用鼠标将新添加的菜单项拖到“查看”和“帮助”菜单项 之间,结果如图所示。 菜单项“对话框”拖放后的位置 (5) 选择“查看”“建立类向导”菜单命令或直接按Ctrl+W快 捷键,则出现MFC ClassWizard对话框,该对话框会自动 切换到Message Maps页面。 (6) 从“Class name”组合框中选择CMainFrame,在Object Ids 列表中选择ID_TEST_DLG,然后在Messages框中选择CO MMAND消息。
3.2.7 在程序中使用对话框 (7) 单击[Add Function]按钮或双击COMMAND消息,出 现“Add Member Function”对话框以输入成员函数的名称。系统默认的函数名为OnTestDlg,如图所示。该函数是对菜单项ID_TEST_DLG的映射,也就是说,当在应用程序运行时,用户选择“对话框”,则该函数OnTestDlg被调用,执行函数中的代码。
3.2.7 在程序中使用对话框 • 单击[OK]按钮,在ClassWizard的“Member functions”列 • 表中将列出新增加的成员函数。选择此函数,单击[Edit Co • de]按钮(或直接在函数名双击鼠标),在此成员函数中添加下 • 列代码: • void CMainFrame::OnTestDlg() • { • CFirstDlg dlg; // 定义对话框类对象 • dlg.DoModal(); // 显示对话框 • } • 代码中,DoModal是CDialog基类成员函数,它是用来显 • 示和终止模式对话框。
3.2.7 在程序中使用对话框 • 在OnTestDlg函数的实现文件MainFrm.cpp的前面添加 • CFirstDlg类的头文件包含,即: #include "Ex_SDI.h" #include "MainFrm.h" #include "FirstDlg.h“ (10) 编译并运行。在应用程序菜单上,选择“测试”“对 话框”菜单项,将出现如图的对话框,这个对话框就是刚 才添加的对话框。
4.3 使用无模式对话框 1. 模式对话框 所谓“模式对话框”是指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。 一般情况下,模式对话框会有[OK](确定)和[Cancel](取消)按钮。单出[OK]按钮,系统认定用户在对话框中的选择或输入有效,对话框退出;单击[Cancel]按钮,对话框中的选择或输入无效,对话框退出,程序恢复原有状态。 模式对话框的应用范围较广,上面示例中的对话框和平常所见到的大多数对话框都是模式对话框。
4.3 使用无模式对话框 • 2. 无模式对话框 • 所谓“无模式对话框”是指当对话框被弹出后,一直保留 • 在屏幕上,用户可继续在对话框所在的应用程序中进行其 • 它操作;当需要使用对话框时,只需象激活一般窗口一样 • 单击对话框所在的区域即可激活。 • [例Ex_Modeless] 创建并使用无模式对话框 • 用MFC AppWizard(exe)创建一个默认的单文档应用程 • 序x_Modeless。 • (2) 在该项目中添加一个对话框资源,将其标识符设为IDD_DIALOG_SECOND,标题设为“无模式对话框”, • (3) 对话框字体和大小设为“宋体,9号”。为IDD_DIALOG_SECOND对话框资源创建一个 • 对话框类CSecondDlg。
4.3 使用无模式对话框 • 按Ctrl+W快捷键打开MFC ClassWizard,从“Class • name”列表中选择CSecondDlg,在IDs列表中选择IDOK, • 是对话框中[OK] 按钮的标识符,然后在Messages框中 • 选择BN_CLICKED(单击按钮)消息,单击[Add Function] • 按钮或双击BN_CLICKED消息,出现“Add Member • Function”对话框以输入成员函数的名称,保留系统默 • 认的函数名为OnOK,如图所示。
4.3 使用无模式对话框 • (5) 修改CSecondDlg::OnOK函数中的代码。 • void CSecondDlg::OnOK() • { • // 添加其他代码使用户输入对话框的数据有效 • DestroyWindow(); // 终止对话框显示 • delete this; // 删除对话框,释放内存空间 • } • 代码中,DestroyWindow是对话框基类CWnd的一个成员函数, • 用来终止窗口。 • 添加[Cancel]按钮(标识符为IDCANCEL)的BN_CLICKED • 消息映射,并修改其映射函数CSecondDlg::OnCancel的代码。 • void CSecondDlg::OnCancel() // 单击[Cancel](取消)按钮 • { • DestroyWindow(); • delete this; • }
4.3 使用无模式对话框 • 在项目工作区窗口中选择ResourceView页面,双击资源“Menu”项中的IDR_MAINFRAME,打开菜单资源。 • (8) 在菜单“查看”与“帮助”之间添加一个“测试(&T)”菜单,该菜单项的资源标识设为ID_TEST_DLG。 • (9) 按Ctrl+W快捷键,打开MFC ClassWizard对话框,在Message Maps页面中从“Class name”列表中选择CMainFrame,在Object IDs列表中选择ID_TEST_DLG,然后在Messages框中选择COMMAND消息。
4.3 使用无模式对话框 • 单击[Add Function]按钮或双击COMMAND消息,出现 • “Add Member Function”对话框,取系统默认的函数名OnTestDlg,并在此成员函数中添加下列代码: • void CMainFrame::OnTestDlg() • { • CSecondDlg *pDlg = new CSecondDlg; • // 使用new为对分配内存空间 • pDlg->Create( IDD_DIALOG_SECOND ); • // 创建对话框 • pDlg->ShowWindow( SW_NORMAL ); // 显示对话框 • } • 代码中,Create可用来以一个对话框资源来创建对话框, ShowWindow是一个CWnd成员函数,用来显示对话框, SW_NORMAL是用来指定将窗口显示成一般常用的状态。
4.3 使用无模式对话框 • 在文件MainFrm.cpp前面添加CSecondDlg类的文件包含 • #include "MainFrm.h" • #include "SecondDlg.h" • 编译并运行。在应用程序菜单上,多次选择“测试”“对 • 话框”菜单项,将会在同一个位置中出现多个对话框,拖动这 • 些对话框到适当位置,如图: 这就是无模式对话框的效果,从上述示例可以看出:模式和无模式对话框在用 编辑器设计和使用 MFC ClassWizard创建用 户对话框类的方法是一致 的,但在对话框的创建和 退出的方式是不同的。
3.4.1 通用对话框 表MFC的通用对话框 这些对话框都有一个共同特点:它们都从用户获取信息,但并不对信息作处理。
3.4.1 通用对话框 选定一个文件后,单击[打开]按钮,就会弹出一个消息对话框,显示该文件的全路径名称。 void CMainFrame::OnTestDlg() { CString filter; filter = “文本文件(*.txt)|*.txt|C++文件 (*.h,*.cpp)|*.h;*.cpp||"; CFileDialog dlg (TRUE, NULL, NULL, OFN_HIDEREADONLY, filter); if (dlg.DoModal () == IDOK){ CString str; str = dlg.GetPathName(); AfxMessageBox(str); } } 代码中,CString是MFC中的一个类,用来操作字符串。
3.4.1 通用对话框 通用文件对话框类CFileDialog的构造函数的原型如下: CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_O VERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); 函数原型中,LPCTSTR类型用来表示一个常值字符指针, 这里可以将其理解成是一个常值字符串类型。上述代码中, AfxMessageBox用来弹出一个消息对话框(后面还要讨论)。 GetPathName是CFileDialog类成员函数,用来获取文件的 全路径名。
3.4.2 消息对话框 消息对话框是最简单的一类对话框,用来显示信息的。 消息对话框常用按钮类型
习 题 • 什么是对话框模板、对话框资源和对话框类? • 对一个对话框编程一般经过几个步骤? • 什么是模式和无模式对话框?它们有哪些不同? • 通用对话框有哪些?调用时需要注意哪些要点? • 在单文档应用程序中,通过调用对话框类DoModal函数 • 将每一个通用对话框都显示一遍,看看这些通用对话框的界面是怎样的? • 创建一个默认基于对话框的应用程序,然后看一看其中的 • 对话框类和本章在单文档应用程序添加的对话框类有什么不同?