第7章 对话框和控件.ppt_第1页
第7章 对话框和控件.ppt_第2页
第7章 对话框和控件.ppt_第3页
第7章 对话框和控件.ppt_第4页
第7章 对话框和控件.ppt_第5页
免费预览已结束,剩余100页可下载查看

下载本文档

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

文档简介

第7章对话框和控件 版权所有复制必究 对话框是Windows应用程序中一种常用的资源 其主要功能是输出信息和接收用户的输入数据 控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口 它用于完成不同的输入 输出功能 对话框与控件关系密切 在每个对话框上一般都有一些控件 对话框依靠这些控件与用户进行信息的交互 本章主要介绍对话框的工作原理和编程方法 并通过实例学习一些标准控件和公共控件的使用方法 7 1对话框概述 就用户交互输入功能而言 菜单和工具栏的功能是极其有限的 而对话框除了用来显示提示信息 如程序启动时显示版权和运行进度信息 一个主要功能是用于接收用户的输入数据 在MFC中 对话框的功能被封装在CDialog类中 而CDialog类是CWnd类的派生类 作为窗口 对话框和其它窗口一样具有窗口的一切功能 对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框 当然 对话框也可以作为一个程序的主界面 7 1 1基于对话框的应用程序 可以直接利用MFCAppWizard向导创建一个基于对话框的应用程序 这种程序运行后首先出现一个对话框 在向导的第一步选择DialogBased项 此时 应用程序向导将出现与单文档和多文档程序向导不同的操作步骤 因为对话框应用程序一般不包含文档 故不支持数据库和复合文档 按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用程序项目 出现对话框编辑器和控件工具栏浮动窗口 它们采用的是一种所见即所得的可视化工作方式 利用向导创建应用程序的框架后 程序员可根据程序具体功能要求添加代码 例编写一个对话框应用程序MyDialog 程序运行后显示一个对话框 并在对话框上显示文本串 1 执行File New命令出现New对话框 选择MFCAppWizard exe 项 输入程序名MyDialog 单击OK按钮 在随后出现的MFCAppWizard Step1对话框窗口中选择DialogBased选项 单击Finish按钮就创建了应用程序项目 并在DeveloperStudio中打开了对话框编辑器和控件工具栏 2 去掉对话框中标题为 TODO 在这里设置对话控制 的静态文本控件 调整对话框大小 在成员函数CMyDialogDlg OnPaint 中添加代码 voidCMyDialogDlg OnPaint else CPaintDCdc this dc SetBkMode TRANSPARENT dc TextOut 20 50 这是一个对话框应用程序 CDialog OnPaint 7 1 2对话框类CDialog MFC提供了一系列对话框类 并实现了对话框消息响应和处理机制 CDialog类是对话框类中最重要的类 我们在程序中创建的对话框类一般都是CDialog类的派生类 CDialog类还是其它所有对话框类的基类 其派生关系如下所示 CObjectCCmdTargetCWndCDialog 对话框类为程序员提供了管理对话框的编程接口 CDialog类从CWnd类派生而来 所以它继承了CWnd类的成员函数 具有CWnd类的基本功能 可以编写代码移动 显示或隐藏对话框 并能根据对话框的特点增加新的成员函数 扩展它的功能 在你的CDialog类的派生类中可以直接调用CDialog类的成员函数 大部分的成员函数是虚函数 可以在你的派生类中重载 以实现特定的目的 除了CDialog类成员函数 类CWnd和CWinApp也提供了一些成员函数用于对话框的管理 有关对话框的常用处理函数CDialog CDialog 通过调用派生类构造函数 根据对话框资源模板定义一个对话框 CDialog DoModal 激活模态对话框 显示对话框窗口 CDialog Create 根据对话框资源模板创建非模态对话框窗口 如果对话框不是Visible属性 还需通过调用CWnd ShowWindow 函数显示非模态对话框窗口 CDialog OnOk 单击OK按钮时调用该函数 接收对话框输入数据 关闭对话框 CDialog OnCancel 单击Cancel按钮或按Esc键时调用该函数 不接收对话框输入数据 关闭对话框 CDialog OnInitDialog WM INITDIALOG消息处理函数 在调用DoModal或Create函数时系统发送WM INITDIALOG消息 在显示对话框前调用该函数进行初始化 CDialog EndDialog 用于关闭模态对话框窗口 CWnd ShowWindow 显示或隐藏对话框窗口CWnd DestroyWindow 关闭并销毁非模态对话框CWnd UpdateData 通过调用DoDataExchange 设置或获取对话框控件的数据CWnd DoDataExchange 被UpdateData 调用以实现对话框数据交换 不能直接调用 CWnd GetWindowText 获取对话框窗口的标题CWnd SetWindowText 修改对话框窗口的标题CWnd GetDlgItemText 获取对话框中控件的文本内容CWnd SetDlgItemText 设置对话框中控件的文本内容CWnd GetDlgItem 获取控件或子窗口的指针CWnd MoveWindow 用于移动对话框窗口CWnd EnableWindow 使窗口处于禁用或可用状态 7 1 3对话框数据交换DDX和验证DDV 在对话框中实现用户数据输入和输出的一般方法是通过ClassWizard类向导将对话框控件与成员变量相关联 利用对话框数据交换DDX DialogDataExchange 和验证DDV DialogDataValidation 机制实现数据的输入和输出 当利用ClassWizard类向导添加成员变量时 用户如果在窗口的左下角输入数据的范围 ClassWizard将自动加入函数DDV的调用代码 例如 当添加一个UINT型的成员变量m nInput时指定它的最小值和最大值分别为0和100 则ClassWizard类向导将在成员函数DoDataExchange 中添加以下DDV函数的调用语句 DDV MinMaxUInt pDX m nInput 0 100 程序运行后 如果用户的输入数据超出0 100的范围 DDV将显示一个提示信息对话框 例7 2c 提示用户有效的输入范围 UpdateData 的用法 当调用UpdateData TRUE 时 MFC通过调用DDX函数将数据从控件传递到关联的成员变量 当调用UpdateData FALSE 时 MFC通过调用DDX函数将数据从成员变量传递到关联的的控件 利用UpdateData 函数实现了在刷新后重新获取成员变量 注意 表面上看程序并没有调用UpdateData 但是 当程序调用CDialog DoModal 创建并显示对话框时 将自动调用CDialog OnInitDialog 完成初始化的工作 在OnInitDialog 中调用了UpdateData FALSE 将数据从成员变量传递到关联的控件 从而显示在控件中 而单击OK按钮将调用CDialog OnOk 函数 在OnOK 中调用了UpdateData TRUE 将数据从控件传递到关联的成员变量 由此看来 不管MFC将DDX技术如何复杂化 我们只需知道 DDX就如同一条双向通道 而方向控制开关就是UpdateData 函数中的BOOL类型参数是TRUE还是FALSE 7 1 4提示信息对话框 提示信息对话框也称消息对话框 用来显示有关的提示信息 提示信息对话框是一种最简单的对话框 不需要用户自己创建它就可以直接使用 VisualC 提供了相应的函数实现这样的功能 intAfxMessageBox LPCTSTRlpText UINTnType MB OK UINTnlDHelp 0 intMessageBox HWNDhWnd LPCTSTRlpText LPCTSTRlpCaption UINTnType intCWnd MessageBox LPCTSTRlpText LPCTSTRlpCaption NULL UINTnType MB OK 这三个函数分别是MFC全局函数 API函数和CWnd类的成员函数 它们的功能基本相同 但适用范围有所不同 AfxMessageBox 和 MessageBox 可以在程序中任何地方使用 而CWnd MessageBox 只能用于控件 对话框 窗口等一些窗口类中 例如 在软件安装过程中为了弹出如下图所示的警告提示信息对话框并进行相应的处理 编写的代码如下 intnChoice MessageBox 文件复制失败 错误 MB ICONWARNING MB ABORTRETRYIGNORE switch nChoice caseIDABORT 用户按下 终止 按钮 caseIDRETRY 用户按下 重试 按钮 caseIDIGNORE 用户按下 忽略 按钮 7 2使用对话框 为了在屏幕上显示对话框 1 首先需要建立对话框资源及其与资源相关的对话框类 2 然后添加控件 与控件关联的成员变量和消息处理函数 3 最后在程序中显示对话框并访问与控件关联的成员变量 在VisualC 中可以利用集成工具如对话框编辑器和ClassWizard类向导很方便地创建对话框 不需要程序员手工编写太多的源代码 7 2 1一般对话框工作流程 当定义了一个对话框类后 就可以利用这个对话框类声明一个对话框对象 即一个能够在屏幕上显示的对话框 声明了一个对话框对象后 可以调用对话框类的成员函数DoModal 建立对话框窗口并显示对话框 例如 假设定义了一个名为CMyDialog的对话框类 为了在屏幕上显示一个对话框 可以编写如下代码 CMyDialogmyDlg myDlg DoModal 函数OnOK OnCancel 与DoModal 的关系 对话框中一般都有OK和Cancel按钮 单击OK按钮时调用CDialog OnOK 函数 单击Cancel按钮时调用CDialog OnCancel 函数 OnOK 函数和OnCancal 函数都将结束DoModal 函数调用 但令DoModal 返回不同的值 OnOK 函数令DoModal 返回IDOK OnCancel 函数令DoModal 返回IDCANCAL 用户可以根据DoModal 的返回值做出不同的选择 如 if myDlg DoModal IDOK 对话框的初始化可以在三个不同的阶段所调用的函数中进行 1 对话框类构造函数 2 WM CREATE消息处理函数 3 WM INITDIALOG消息处理函数 通常是在消息WM INITDIALOG的消息处理函数OnInitDialog 中进行初始化 在收到WM INIT DIALOG消息时 对话框的框架已创建 对话框中的每个控件也已建立起来 但它们还没有在屏幕上显示 此时自然可以设置或优化对话框中各个控件的外观 尺寸 位置以及其它属性 函数OnInitDialog 将被成员函数DoModal 调用 7 2 2创建对话框 在Windows中对话框是作为一种资源被使用 在程序中要创建一个对话框 首先要创建一个对话框模板资源 然后创建一个基于该对话框模板资源的对话框类 对话框模板资源指定了对话框本身的属性 如大小 位置 风格 类型等 和对话框中的控件及属性 而对话框类规定了对话框和对话框中每个控件的行为 通过对话框模板资源才能创建对话框类和对象 为了向应用程序项目中添加一个对话框资源 执行Insert Resource命令或直接按Ctrl R键 弹出InsertResource资源列表框 一般要加入通用对话框资源 所以在InsertResource框中直接选择Dialog项 然后单击New按钮 系统将给对话框资源设置一个默认的ID标识 对话框的默认标题Caption为Dialog 对话框有OK和Cancel两个按钮 对话框资源的添加 添加对话框资源的简单方法 在项目工作区鼠标右击资源项Dialog 从弹出式菜单中选择 InsertDialog 命令项 对话框是在对话框模板资源和对话框类的基础上形成的 在完成了对话框的属性和外观设计后 再来设计对话框的行为 我们需要利用ClassWizard类向导创建一个对话框类 并将这个类同先前创建的对话框资源连接起来 在创建对话框类之前或之后 都可以为对话框资源添加控件 而在创建对话框类之后 还可以为对话框资源添加与对话框控件相关联的成员变量和消息处理函数 创建对话框类 如果按Ctrl W键或在对话框资源的非控件区域双击鼠标 ClassWizard类向导将发现已添加了一个对话框模板资源 却没有设计其对应的类 因此将弹出AddingaClass对话框 询问用户是否需要利用该对话框资源创建一个对话框类 Name框 用于输入对话框类的名称 FileName框 列出类的文件名 单击Change按钮可改变文件名 Baseclass下拉框 列出可选择的基类 DialogID下拉框 列出可选择对话框资源的ID 例假设已利用MFCAppWizard应用程序向导建立了一个名为Mysdi的单文档应用程序 请向应用程序中添加对话框资源和对话框类 在AddingaClass对话框单击OK按钮 弹出NewClass对话框 1 首先向应用程序项目添加一个对话框资源 在项目工作区鼠标右击资源项Dialog 从弹出式菜单中执行InsertDialog命令 插入一个对话框资源 2 设置对话框的属性 将光标指向对话框的空白位置 单击鼠标右键 从弹出式菜单中选择Properties项 或直接按Enter键 弹出DialogProperties属性对话框 该对话框包括General Styles MoreStyles ExtendedStyles MoreExtendedStyles等页面 用于设置对话框多种不同的属性 3 创建对话框类 鼠标双击对话框资源的非控件区域 7 2 3添加控件及关联的成员变量 如果没有控件 对话框完成不了什么具体功能 对话框与控件有着密不可分的关系 结合对话框编辑器 利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件 若VisualC 窗口中没有出现Controls工具栏 只需将光标指向菜单栏并单击鼠标右键 从弹出式菜单中选择Controls项 控件工具栏上的每一个图标都代表了一种控件 如果不能确定控件的类型 只要将光标在该控件图标上停留片刻 就会显示该控件类型的提示 向对话框添加控件时 先在Controls工具栏单击要添加的控件 再将光标指向对话框空白区域并单击鼠标 添加与控件关联的成员变量 在生成自己的对话框类并添加需要的控件后 可以利用ClassWizard类向导在对话框类的定义中为对话框资源上的每一个控件添加一个或多个对应的成员变量 ClassWizard类向导的MemberVariables页面主要用来为对话框类添加和删除与对话框控件关联的成员变量 我们在编写对话框程序时经常同该页面打交道 Classname下拉框 选择要添加成员变量的对话框类 ControlIDs栏 选择控件 因为要添加的成员变量总是与一个对话框控件ID联系在一起 它们代表控件对象本身或控件的某项属性 AddVariable按钮 添加与控件关联的成员变量 DeleteVariable按钮 删除控件的某个成员变量 ControlIDs栏 列出对话框资源上已有的控件 第1列ControlIDs表示控件的ID 第2列Type表示变量的类型 第3列Member表示成员变量名 在MemberVariables页面 AddMemberVariable对话框 Membervariablename框 输入成员变量名 Category下拉框 选择成员变量的类别 可为Control或Value Variabletype下拉框 选择成员变量的类型 如果在Category下拉框选择Value项 表示要为该控件的某项属性定义一个变量 这意味着程序关心的是控件中的值 而不是控件对象本身 这时 还可以通过Variabletype下拉框为变量选择不同的类型 可以选择一般的C 数据类型或VisualC 自定义的数据类型 例如 对于编辑框控件 此时成员变量的类型可以是int float long BOOL等C 一般数据类型或者是UINT CString等VisualC 自定义数据类型 如果在Category下拉框中选择Control项 则表示定义的变量代表控件对象本身 Control类别的变量实质是一个控件对象 其类型是MFC控件类 例如 对于编辑框控件 此时成员变量的类型为CEdit 因此 可以通过添加的控件对象访问控件类的成员变量和调用控件类的成员函数 实现对控件行为的控制和管理 可以为一个控件同时定义一个Control类别的变量和一个Value类别的变量 这些变量都是作为对话框派生类的成员变量 为了在程序其它地方能够直接访问添加的成员变量 它们都被声明为public属性 例完善Mysdi程序 向对话框资源添加需要使用的控件 并添加与控件关联的成员变量 1 向对话框资源添加控件 添加一个静态文本控件 其Caption为 请输入半径 添加一个EditBox编辑框控件 其ID标识为IDC EDIT RADIUS 该控件用于接收用户的输入数据 2 添加与控件关联的成员变量 按Ctrl W键启动ClassWizard类向导 单击MemberVariables标签 在Classname下拉框选择类CRadiusDialog 在ControlIDs栏选择编辑框IDC EDIT RADIUS 单击AddVariable按钮 通过AddMemberVariable对话框添加成员变量m nRadius 其数据类型为UINT 3 使用对话框数据验证DDV功能 在该页面的左下角输入成员变量m nRadius的最小值5和最大值250 例完善Mysdi程序 通过 编辑 菜单中的 输入半径 I 命令打开上述标题为 输入半径 的对话框 并根据输入的半径画一个圆 1 为了在视图对象中接收并存储对话框编辑控件的值 在视图类CMysdiView中手工定义一个UINT类型的成员变量m nCViewRadius 2 利用菜单编辑器在 编辑 菜单增加一个菜单项 输入半径 I 其ID标识为ID EDIT INPUTRADIUS Caption为 输入半径 I 按Ctrl W键启动ClassWzard类向导 在视图类中为ID EDIT INPUTRADIUS菜单项添加消息COMMAND的处理函数 在函数中添加代码 在程序中使用创建的对话框 voidCMysdiView OnEditInputradius TODO AddyourcommandhandlercodehereCRadiusDialogdlg 定义一个对话框对象dlg m nRadius 100 设置编辑框显示的初始值if dlg DoModal IDOK 显示对话框 m nCViewRadius dlg m nRadius 接收并存储编辑框数据Invalidate 刷新视图 3 在视图类构造函数CMysdiView CMysdiView 中将成员变量m nCViewRadius初始化为0 在函数CMysdiView OnDraw 中添加如下画圆的语句 pDC Ellipse 0 0 2 m nCViewRadius 2 m nCViewRadius 在视图类实现文件MysdiView cpp的开始位置加入包含对话框类头文件的语句 include RadiusDialog h 模态对话框在关闭之前 不允许用户切换到程序的其它窗口 因为当弹出模态对话框时 它就获得了程序的控制权 并且 模态对话框拥有自己的消息循环 因此其窗口中所有产生的消息都不会送到主窗口的消息循环 非模态对话框弹出后 用户不需要关闭它就可以在非模态对话框和应用程序其它窗口之间进行切换 常用的Find查找和Replace替换对话框就是非模态对话框 如果关闭非模态对话框的父窗口 非模态对话框一般也自动关闭 7 2 4非模态对话框 对于非模态对话框 使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类 成员变量和消息处理函数的方法与模态对话框一样 但创建和退出对话框的方式有所不同 创建模态对话框时是由系统自动分配内存空间 因此在退出对话框时 系统自动调用CDialog EndDialog 函数来删除对话框 而创建非模态对话框则需要用户来分配内存 退出时还需用户自己删除非模态对话框 非模态对话框的创建 非模态对话框的实例应声明为全局对象 不能象模态对话框那样作为局部对象 一般用new操作符生成 使用结束时用delete操作符将其删除 区别于模态对话框 非模态对话框用new生成对象后 不是调用CDialog DoModal 函数 而是调用CDialog Create 函数装入对话框资源 并创建和显示对话框 Create 函数在显示非模态对话框后就立即返回 而DoModal 函数是在模态对话框被关闭之后才返回 并且 由于Create 函数不会启动新的消息循环 非模态对话框与应用程序共用一个消息循环 这样 非模态对话框就不会垄断用户的输入 Windows将一些常用的对话框集成到操作系统中 作为Windows公用对话框库Commdlg dll的一部分 用户在程序中可以直接使用这些公用对话框 不必再创建对话框资源和对话框类 减少了大量的编程工作 并且 用户还可以定制公用对话框的外观和性能 为了在MFC应用程序中使用公用对话框 MFC提供了封装这些公用对话框的类 这些公用对话框类都是从CCommonDialog类派生而来 而CCommonDialog类又是CDialog类的派生类 7 2 5公用对话框 公用对话框 7 3标准控件 Windows提供的控件分为两类 标准控件和公共控件 标准控件 静态控件 编辑框 按钮 列表框 组合框和滚动条等 利用标准控件可满足大部分用户界面程序设计的要求 公共控件 滑块 进度条 列表视控件 树视控件和标签控件等 利用公共控件实现应用程序用户界面风格的多样性 7 3 1控件概述 控件是Windows提供的完成特定功能的独立小部件 它使应用程序对话功能的设计更容易完成 在对话框与用户的交互过程中担任主要角色 用于完成用户输入和程序运行过程中的输出 控件对应一个CWnd派生类的对象 它实际上也是一个窗口 可以通过调用窗口类的成员函数实现控件的移动 显示或隐藏 禁用或可用等操作 也可以重新设置它们的尺寸和风格等属性 MFC以类的形式对标准控件和公共控件进行了封装 这些类大部分是从CWnd类直接派生而来 常用的MFC控件类 常用的MFC控件类 控件通知Notification消息 用户对控件的操作将引发控件事件 Windows产生对应的控件通知Notification消息 消息由其父窗口 如对话框 接收并处理 标准控件发送WM COMMAND控件通知消息 公共控件一般发送WM NOTIFY控件通知消息 有时也发送WM COMMAND消息 通过WM COMMAND消息参数标识发出消息的控件和具体的事件 消息参数中包含了控件的ID标识和通知码 如BN CLICKED单击按钮事件 控件通知码前缀最后一个字母为N 程序员不必关心消息具体的发送和接收 只需利用ClassWizard将控件映射到成员变量 将控件消息映射到成员函数 然后编写具体的处理代码 控件的创建方法 控件在程序中可作为对话框控件或独立的窗口两种形式存在 因此 控件的创建方法也有两种 一种方法是在对话框模板资源中指定控件 这样当应用程序创建对话框时 Windows就会为对话框创建控件 编程时我们一般都采用这种方法 一种方法是通过调用MFC控件类的成员函数Create 创建控件 也可以调用API函数CreateWindow 或CreateWindowEx 创建控件 控件也可以用于其它窗口 如在程序视图窗口显示控件 这时 需要首先声明一个MFC控件类的对象 然后调用Create 函数创建控件 7 3 2控件的组织 1 添加或删除控件打开对话框编辑器和控件工具栏 在控件工具栏中单击要添加的控件 此时 当光标指向对话框时将变成十字形状 在对话框指定位置处单击鼠标左键 则该控件被添加到对话框中指定的位置 也可以将光标指向控件工具栏中的控件 然后按住鼠标不放 采用鼠标拖曵的方法将控件拖入到对话框中 要删除已添加的控件 先单击对话框中的控件 再按Delete键即可删除指定的控件 2 设置控件属性将光标指向对话框中需设置属性的控件 按回车键 或右击鼠标 在弹出式菜单中选择Properties项 弹出Properties对话框 在Properties对话框中设置控件属性 可以将属性对话框始终保持打开 只需要按下属性对话框左上角的图钉按钮 3 调整控件的大小对于静态文本控件 当输入标题内容时 控件的大小会自动改变 对于其它控件 先单击控件 然后利用控件周围的尺寸调整点来改变控件的大小 所选对象的位置和大小将显示在状态栏的右端 4 同时选取多个控件一种方法是在对话框内按住鼠标不放 拖曵出一个大的虚线框 然后释放鼠标 则被该虚线框所包围的控件都将被同时选取 另一种方法是按住Shift 或Ctrl 键不放 然后用鼠标连续选取控件 5 移动和复制控件当单个或多个控件被选取后 按方向键或用鼠标拖动选择的控件可移动控件 若在鼠标拖动过程中按住Ctrl键则复制控件 复制的控件保持原来控件的大小和属性 并且 控件能够通过复制和粘贴操作而加入到其它对话框中 6 编排控件编排控件主要是指同时调整对话框中一组控件的大小或位置 编排控件有两种方法 一种方法是使用控件布局工具栏 自动编排对话框中同时选定的多个控件 另一种方法是使用Layout菜单 当打开对话框编辑器时 Layout菜单将出现在菜单栏上 为了便于用户在对话框内精确定位各个控件 系统还提供了网格 标尺等辅助功能 测试对话框和控件的方法 通过按下Ctrl T组合键就能测试对话框运行时的界面效果 7 3 3控件共有属性 控件的属性决定了控件的外观和功能 我们只有通过控件属性对话框才能设置控件的属性 控件属性对话框上有若干选项卡 如General 通用属性 Style 风格 及ExtendStyles 扩展风格 选项卡等 其中General页用于设置控件的通用属性 Styles和ExtendcdStyles页用来设置控件的外观和辅助属性 不同控件有不同的属性 但它们都具有通用属性 如控件标识ID 标题Caption等项 控件的General属性 7 3 4静态控件 静态控件 Staticcontrol 是用来显示一个文本串或图形信息的控件 它包括静态文本控件 图片控件和组框 静态文本控件用来显示一般不需要变化的文本 图片控件用来显示边框 矩形 图标或位图等图形 组框用来显示一个文本标题和一个矩形边框 通常用来作为一组控件周围的虚拟边界 并将一组控件组织在一起 管理静态文本控件和图片控件的MFC类是CStatic类 而管理组框的MFC类是CButton类 所有静态控件默认的ID标识都为IDC STATIC 如果要为一个静态控件添加成员变量或消息处理函数 必须重新为它指定一个唯一的ID标识 编程时用的最多是静态文本控件 它被用来作为其它控件的标题 每一个静态文本控件最多可以显示255个字符 可以使用 n 换行符 并可以通过Styles页面设置控件的风格 7 3 5编辑框 编辑框 Editbox 又称文本框或编辑控件 它一般与静态文本控件一起使用 用于数据的输入和输出 编辑框提供了完整的键盘输入和编辑功能 可以输入各种文本 数字或者口令 编辑框为用户提供了良好的输入 输出功能 能够将键盘输入的字符串转化为要求的数据类型 并验证它是否符合输入要求 字符串长度或数值范围 通过前述对话框内容的学习我们已经知道 完成上述工作是利用了MFC提供的对话框数据交换 DDX 和数据验证 DDV 技术 编辑框常用属性 Multiline设置单行或多行编辑 Aligntext设置文本对齐方式 Number表示只能输入数字 Password表示键入编辑框的字符都将显示为 Uppercase或Lowercase表示键入编辑框的字符全部转换成大写或小写形式 Read Only表示只能输出数据 当编辑框的文本被修改 会向父窗口发送消息 可以利用ClassWizard在对话框类中添加消息处理函数 编辑框发送消息有 EN CHANGE EN KILLFOCUS EN SETFOCUS EN MAXTEXT EN UPDATE等 例编写一个SDI应用程序Password 程序启动后首先弹出一个如图所示的用户身份确认对话框 当用户键入正确的口令后才能进入程序的主界面 7 3 6按钮 按钮 Button 包括按键按钮 单选按钮 复选框和组框等4种类型 虽然封装按钮控件的MFC类都是CButton类 但它们具有不同的功能 按键按钮在被按下时会立即执行某个命令 也被称为命令按钮 单选按钮用于在一组互相排斥的选项中选择其中一项 复选框用于在一组选项中选择其中一项或多项 组框可以使一组控件关联起来 1 按键按钮 几乎所有的对话框都使用简单的按键按钮 如OK按钮 通过Properties对话框可以设置按钮的不同风格 如通过设置Defaultbutton属性设置一个默认按钮 默认按钮是指当对话框刚显示时的命令执行按钮 此时按下Enter键将执行该按钮的命令功能 一个对话框只能有一个Defaultbutton默认按钮 通常情况下将OK按钮设置为默认按钮 其它属性 Ownerdraw利用WM DRAWITEM消息处理函数定制按钮的外观 Icon表示用图标代替原来的文本标题 Bitmap表示用位图代替原来的文本标题 Clientedge Staticedge Modalframe用于设置按钮的外观 2 单选按钮 单选按钮是由一个圆圈和紧随其后的文本标题组成 当它被选中时 圆圈中就标上一个黑点 单选按钮设置Auto自动属性为默认属性 Auto属性表示用户若选中同组中的某个单选按钮 则自动清除其余单选按钮的选中状态 保证一组选项中始终只有一项被选中 一般将一组单选按钮放在一个组框中 在一组单选按钮中 第一个 Tab键顺序 按钮最重要 其ID值可用于在对话框中为控件建立关联的成员变量 必须为同组中的第一个单选按钮设置Group属性 而同组的其它单选按钮不可再设置Group属性 3 复选框 复选框是由一个空心方框和紧随其后的文本组成 当它被选中时 空心方框中就加上一个 或 标记 不同于单选按钮 在一组复选框中每次可以同时选择多项 除了选中和没选中两种状态 复选框还有第三种状态 此时选中标记显示为暗色 它表示该项不可以由用户选择 通过设置Tri state属性得到这种三态复选框 另外 我们可以通过设置Push like属性使单选按钮或复选框具有普通按钮的外观 按钮控件发送的消息 按钮控件只能发送通知码为BN CLICKED 单击按钮 和BN DOUBLECLICKED 双击按钮 的WM COMMAND消息 我们经常需要编写按钮的BN CLICKED消息处理函数 CButton类提供了一些成员函数实现对按钮控件对象的控制和管理 如利用成员函数GetCheck 或SetCheck 获取或设置单选按钮或复选框的当前状态 利用成员函数GetButtonStyle 或SetButtonStyle 获取或改变按钮控件的风格 例编写一个对话框应用程序ColrButn 对话框中有两个用于选择颜色模式的单选按钮和三个用于选择具体颜色的复选框 只有在彩色模式下才能选择三种不同颜色的组合 当用户单击 应用 按钮 对话框右边的按键按钮将根据选择的颜色实现按钮的自画 7 3 7列表框 Windows提供了几个列表类型控件 如列表框 组合框 列表视控件和树视控件 其中列表框是一种最简单的列表类型控件 列表框 Listbox 是一个列出了一些文本项的窗口 常用来显示类型相同的一系列清单 如文件 字体和用户等 与复选框类似 用户可以选择其中一项或多项 但同时列表框中选项的数目和内容可以动态变化 用户可往列表框中添加或删除某些选项 列表框有单选Single 多选Multiple 扩展多选Extended 不选None四种风格 在控件Properties属性对话框的Selection下拉框中设置 当列表框中发生了某个事件 列表框就会向其父窗口发送一条通知消息 列表框常用的通知消息有 用户双击列表框中的列表项时发送消息LBN DBLCLK 列表框失去键盘输入焦点时发送消息LBN KILLFOCUS 列表框获得键盘输入焦点时发送消息LBN SETFOCUS 列表框中的当前选择项发生改变时发送消息LBN SELCHANGE 封装列表框控件的MFC类是CListBox类 当列表框创建之后 在程序中可以通过调用CListBox类成员函数来实现列表项的添加 删除 修改和获取等操作 例编写一个对话框应用程ExmpList 对话框中有一个列表框 当用户单击列表框中的一个列表项 一个国家 时 在四个编辑框分别显示指定国家的名称 首都 面积和人口 单击 添加 按钮时 国家 编辑框中的文本将被添加到列表框中 单击 删除 按钮时 当前的列表项将被删除 7 3 8组合框 编辑框和列表框在使用时受到一些限制 编辑框允许用户输入文本内容 但用户却不能直接选择以前已输入的文本内容 列表框可列出各种可能的选项 但用户却不能在列表框中输入新的列表项 而组合框 Combobox 吸收了列表框和编辑框的优点 它可以显示列表项供用户进行选择 也允许用户输入新的列表项 实质上 组合框是多个控件的组合 包括编辑框 列表框和按钮 组合框有简单组合框 Simple 下拉组合框 Dropdown 和下拉列表框 DropList 等三种形式 通过控件Properties属性对话框Styles页面的Type下拉框设置这三种形式 组合框控件的Data属性 与编辑框或列表框相比 组合框有一个新的功能属性 可以通过组合框控件属性对话框的Data页面添加初始的列表项 注意 每输入完一个列表项 按下Ctrl Enter键后才能换行输入下一项 也可以在对话框类的初始化成员函数OnInitDialog 中编写代码添加列表项 组合框发送的消息 组合框消息有 关闭组合框消息CBN CLOSEUP 打开列表框消息CBN DROPDOWN 双击列表项消息CBN DBLCLK 选择一个列表项并按下Enter键或单击下拉按钮隐藏列表框时发送消息CBN SELENDOK 当前选项被取消时 如重新选择其它控件或关闭对话框 发送消息CBN SELENDCANCEL 当前选项改变消息CBN SELCHANGE 当组合框的编辑框中的文本被修改且新的文本显示之后发送消息CBN EDITCHANGE 当编辑框中的文本被修改且新的文本显示之前发送消息CBN EDITUPDATE 组合框失去键盘输入焦点消息CBN KILLFOCUS 组合框获得键盘输入焦点消息CBN SETFOCUS 例编写一个单文档应用程序ExmpCombo 执行 测试控件 组合框 菜单命令时打开一个对话框 初始的对话框有一个用于显示标准控件名的组合框 当用户在组合框下拉的列表框中选择一个控件时 该控件将显示在对话框的右部 当用户在组合框的编辑框中输入一个列表项并单击 应用 按钮 一个指定标题的静态文本控件将出现在对话框的右部 7 3 9滚动条 滚动条作为一个独立的控件 其主要作用通过可视化的滚动操作实现程序设计所要求的功能 如滚动显示数据内容 在一个有效范围内选取合适的数值等 滚动条分为垂直滚动条和水平滚动条两种类型 滚动条两端有两个箭头按钮 中间有一个可沿滚动条方向移动的滚动块 当移动滚动条时发送消息WM HSCROLL或WM VSCROLL 滚动消息含有通知码 表示用户对滚动条的操作方式 如SB LINEUP和SB LINEDOWN表示向上或下滚动一行 或一个单位 SB PAGEUP表示向上滚动一页 7 4公共控件 在Window95推出之前 只提供了静态文本 按钮 编辑框 列表框和组合框等标准控件 在推出Window95时 将其中一些较为流行的控件作为公共控件引入到Windows中 如旋转按钮 进度条 滑块 列表视控件 树视控件 日期时间选取器等公共控件 标准控件保存在System目录下的User exe文件中 公共控件保存在System目录下的Comctl32 dll中文件 MFC对这些公共控件以类的形式进行了封装 如CProgressCtrl CListCtrl和CTreeCtrl等 7 4 1旋转按钮 旋转 Spin 按钮控件也称微调控件或上下控件 其形状与滚动条类似 两端也有两个箭头按钮 但中间没有滚动块 用户单击箭头按钮可以增加或减少一个数值 这个值表示旋转按钮滚动位置或另一个与旋转按钮相关联的控件中的数据 当程序需要用户在某个范围内输入一个值时可以使用旋转按钮 其好处是无需当心用户输入一个无效值而导致程序的崩溃 旋转按钮控件经常和一个关联控件 如编辑框 绑定在一起使用 用户只需用鼠标单击旋转按钮控件的上下箭头 就能设置关联控件中的数据内容 对用户而言 一个旋转按钮和它的关联控件看起来就象一个控件 关联控件的设置 可以在程序中通过调用成员函数设置关联控件 但常用的方法是通过控件Properties对话框直接设置关联控件 在Alignment下拉框设置旋转按钮与关联控件的位置关系 Right和Lift分别表示旋转按钮紧靠在关联控件窗口的右内侧或左内侧 Unattached表示旋转按钮的位置与关联控件无关 属性Autobuddy表示旋转按钮把它前一个控件 按TabOrder顺序 作为关联控件 属性Setbuddyinteger表示单击旋转按钮改变位置时 关联控件窗口能自动显示这个位置值 旋转按钮的属性和操作 在控件Properties属性对话框的Orientation下拉框中设置垂直 Vertical 或水平 Horizontal 方向两种风格 Wrapt表示当旋转按钮达到最大 最小 值时重新回绕到最小 最大 值 Nothousands表示取消显示数值中的千分位分隔符 Arrowkeys表示可以使用键盘 和 键改变控件位置值 对旋转按钮的操作通过调用MFC类CSpinButtonCtrl的成员函数来完成 主要成员函数有 SetRange 和GetRange 用于设置或获得旋转按钮的上下限范围 SetPos 和GetPos 用于设置或获得旋转按钮的当前位置值 函数SetBuddy 用于动态设置关联控件 函数GetBuddy 用于获得关联控件窗口的指针 例编写一个单文档应用程序ExmpComctl 执行 测试控件 公共控件 菜单命令打开一个对话框 对话框有一个带旋转按钮的编辑框 用于输入圆周线的宽度 单击旋转按钮 在编辑框显示旋转按钮所表示的线宽 单击OK按钮 程序根据线宽在用户视图区画一个圆 7 4 2滑块 滑块 Slider 控件也称滑动条或游标控件 它由滑杠 可沿着滑杠方向移动的滑块和可选择刻度的标尺组成 用户可以通过鼠标或键盘移动滑块 滑块不同的位置代表了一个不同的数值 与滚动条相比 滑块控件中间只有一个滑块 两端箭头按钮 与旋转按钮相比 滑块控件比旋转按钮控件更具独立性 一般不需要关联控件 滑块控件的属性 Orientation下拉框设置滑块控件的垂直 Vertical 或水平 Horizontal 方向风格 Point设置刻度标尺的位置 Both表示滑块是一个矩形块 Top Left表示标尺位于滑杆的左边或上方 Bottom Right表示标尺位于滑杆的右边或下方 滑块控件发送的消息和操作 当滑动滑块时 滑块控件将发送滚动消息来通知父窗口 垂直滑块发送消息WM VSCROLL 水平滑块发送WM HSCROLL 可调用封装滑块控件的MFC类CSliderCtrl的成员函数设置滑块的最小 最大值 刻度出现的疏密 行和页间距 如 GetLineSize SetLineSize GetPageSize SetPageSize GetRange Set Range GetPos SetPos 等 例完善例7 10a中的应用程序ExmpComctl 向对话框资源添加一个滑块控件 用于设置圆的半径 在对话框中单击OK按钮 程序根据设置的线宽和半径在用户视图区画一个圆 7 4 3进度条 进度条 Progress 是一个在进行一系列费时操作时显示反馈信息的控件 通过其状态的动态变化告诉用户当前的操作进度 进度条也能表示某个范围内的值 如温度 水平面高度以及音响系统频率的模拟显示 形状上看 进度条由一个细长的矩形窗口和一些填充块组成 其中的填充块越多 表示任务越接近于完成 当蓝色块填满时 任务也就完成了 我们一般使用进度条的默认属性 其常用的属性有 Border表示进度条有一个边框 Vertical表示垂直进度条 Smooth表示使用不间断的蓝色条填充控件窗口 进度条控件的操作 进度条控件也有一个 范围 和 当前位置 范围表示整个操作需要完成的工作量 当前位置表明该操作已完成了多少 初始化时只需设置进度条值的范围 当前值和使用步长 进度条控件用于输出 一般不需要进行消息处理 为了设置和获得进度条有关参数 需要调用封装进度条控件MFC类CProgressCtrl的有关成员函数 函数SetRange 或GetRange 用于设置或获取控件值的范围 函数SetPos 和GetPos 用于设置或获取控件的当前位置 函数SetStep 用于设置步长 函数StepIt 用于在控件窗口填充一个蓝色块 例编写一个单文档应用程序PrgresAnmt 执行 测试控件 进度条和动画 菜单命令时在用户视图区播放一段动画 并用进度条提示动画播放的进程 7 4 4标签控件和属性表 1 标签 Tab 控件标签 Tab 控件也称选项卡控件 它是一个分割成多个页面的窗口 每个页面都配有一个带有标题的标签 单击一个标签就显示对应的页面 标签控件在功能上等价一系列对话框窗口 但使用起来更接近于我们的使用习惯 编程时使用标签控件 可以在一个窗口的相同区域内定义多个页面 其中每个页面 可以是一个对话框 上包括一些不同的控件 以实现不同的对话功能 标签作为控件使用 它不是对话框 编程时不能直接在各个标签页上添加控件 只能在选中不同标签时在相同位置显示含有不同控件的对话框 标签控件的属性和消息 标签控件的属性有 Alignment下列框用于设置每个标签的宽度为自动随标题长度调节 RightJustify 或固定宽度 FixedWidth0 Buttons表示标签采用按钮形状 Multiline表示标签可以多行的形式显示 Bottom表示标签位于控件的底端 Vertical表示标签以垂直的方式出现 标签控件消息 单击标签时发送消息NM CLICK 选择不同标签时发送消息TCN SELCHANGING 标签切换前 或TCN SELCHANGE 标签切换后 封装标签控件的MFC类 MFC类CTabCtrl提供了标签控件的各项服务功能 通过其成员函数实现了对控件及其数据结构进行操作的方法 编程时

温馨提示

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

评论

0/150

提交评论