计算机高级程序设计 第五章
对话框的基本概念 对话框是一种次要窗体,通常在响应某个命令菜单时弹出。在对话框上可以添加各种通用控件。 所有对话框及对话框上的控件都由CWnd类派生而来。因而能对窗体进行的操作也适用于对话框及控件。 对话框是一种能包含各类通用控件的特殊窗口,通过添加到其上的控件,对话框可以完成指定的任务。分为两部分: 对话框模板 开发人员可利用对话框模板往对话框上添加控件并进行合理布局。 对话框在创建时会收到WM_INITDIALOG的消息,响应该消息的事件处理函数为OnInitDialog(),其作用是对话框初始化 对话框类 开发人员可以为每个对话框定义一个派生CDialog的新类用来实现为对话框指定的特殊功能 就象家庭娱乐系统:sony的功放、长虹的电视、步步高的DVD,Energy的音箱,他们来自不同的硬件制造商,却能通过线缆把各自的输入输出串接在一起,每个部件都不知道别的部件是如何工作的,但却能尽自己功能之职,完成系统的总需求,如通过遥控器在卫星频道和DVD播放之间进行切换。 西南交通大学经济管理学院:何耀琴
5.1 模态对话框 以排他方式工作的对话框。这类对话框出现时,用户虽然可以看见应用程序的其他对象,但在其关闭之前,输入焦点不能切换到拥有该对话框的应用程序的其他窗口中去,也就是不能实现同其他对象的交互。 在MFC单文档项目中,可以通过对话框类的成员函数DoModal()来创建并显示一个模态对话框。 西南交通大学经济管理学院:何耀琴
创建模态对话框的流程 (1)创建一个MFC单文档项目,命名为“ModelDialog” (2)切换到“资源视图”,右键单击“ModelDialog”。右键菜单中选择“添加” →“资源” →“Dialog”; (3)选择“Dialog”,单击“新建”; 此时屏幕上会出现一个对话框模板; (4)双击对话框模板,在“MFC类向导”窗口中为新添加的对话框资源声明一个派生于CDialog的类CModel; (5)单击“完成”; 西南交通大学经济管理学院:何耀琴
对话框模板 西南交通大学经济管理学院:何耀琴
新派生的类 基类 西南交通大学经济管理学院:何耀琴
创建模态对话框的流程(续) (6)切换到“解决方案资源管理器”; (7)双击打开“ModelDialog.h”,添加 “#include “Model.h”的包含语名; (8)打开“ModelDialog.cpp”文件,找到应用程序类的初始化函数BOOL CModelDialogApp::InitInstance(),在初始化函数中添加创建和显示模态对话框的代码。(见下页图); (9)调试并运行程序。 西南交通大学经济管理学院:何耀琴
西南交通大学经济管理学院:何耀琴
说明:成员函数DoModal() 用来生成一个模态对话框 CPropertySheet::DoModal //所属的类 virtual int DoModal(); //是一个虚函数 返回值: 如果函数生成成功则返回IDOK或IDCANCEL;否则返回0或-1。如果此属性表是作为一个向导(参见SetWizardMode)建立的,DoModal返回ID_WIZFINISH或IDCANCEL。 说明: 此成员函数用来显示一个模态对话框。其返回值对应于用来关闭对话框的控件的ID。此函数返回后,Windows响应这个对话框,所有的属性页都会被销毁。而这些对象本身仍然存在。通常,在DoModal返回IDOK之后可以从CPropertyPage对象检取数据。 西南交通大学经济管理学院:何耀琴
5.2 非模态对话框 非排他方式工作的对话框为非模态对话框。在非模态对话框出现时,用户仍然可以实现与应用程序其他对象的交互。 要生成一个非模态对话框,需调用CDialog类的Create()函数 和CWnd类的ShowWindow() 函数来实现。 Create()函数说明如下: Virtural BOOL Create(LPCTSTR lpszTemplateName,CWnd* pParentWnd=NULL); Virtural BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd=NULL); 两种形式中,参数lpszTemplateName和nIDTemplate分别指明所使用的对话框模板资源的名字和ID值,参数pParentWnd则指向该对话框的父窗体对象。 西南交通大学经济管理学院:何耀琴
ShowWindow()函数说明如下: BOOL ShowWindow(int nCmdShow); 含 义 SW_HIDE 隐藏窗口,并将活动权交给其他窗体 SW_MINIMIZE 最小化窗口,并激活位于系统列表最前端的窗体 SW_RESTORE 激活并显示窗口 SW_SHOW 激活窗口,并以当前位置和大小显示 SW_SHOWMAXMIZED 激活窗口,并以最大化方式显示 SW_SHOWMINIMIZED 激活窗口,并以图标形式显示 SW_SHOWMINNOACTIVE 保持窗口的当前状态,并以图标方式显示 SW_SHOWNA 令窗口以当前的状态显示 SW_SHOWNOACTIVATE 保持窗口的当前状态,并令其以最近的位置和大小显示 SW_SHOWNORMAL 激活并显示窗口,如果窗口被最大化或最小化,Winsows会将其恢复到原始的大小和位置。 西南交通大学经济管理学院:何耀琴
创建并显示一个非模态对话框的步骤: (1)创建一个MFC单文档项目,命名为“UnModalDialog” (2)切换到“资源视图”,右键单击“UnModalDialog”。右键菜单中选择“添加” →“资源” →“Dialog”; (3)选择“Dialog”,单击“新建”, 此时屏幕上会出现一个对话框模板; (4)双击对话框模板,在“MFC类向导”窗口中为新添加的对话框资源声明一个派生于CDialog的类CUnModel; (5)单击“完成”; (6)切换到“解决方案资源管理器”; (7)双击打开“UnModalDialog.h”,添加包含对话框头文件的语句#include “UnModel.h” ; 并在此文件的class CUnModalDialogApp : public CWinApp下的public中添加成员说明语句:CUnModel *dlg; 西南交通大学经济管理学院:何耀琴
添加的包含语句 添加的说明语句 西南交通大学经济管理学院:何耀琴
(8)双击打开“UnModelDialog (8)双击打开“UnModelDialog.cpp”文件,在CUnModalDialogApp::CUnModalDialogApp()函数中添加对dlg初始化的语句: dlg=NULL; 添加代码 西南交通大学经济管理学院:何耀琴
(9)找到应用程序类的初始化函数 BOOL CUnModelDialogApp::InitInstance(),在初始化函数中添加创建和显示非模态对话框的代码。(见下页图); ……//此处代码省略,下面是添加的代码 西南交通大学经济管理学院:何耀琴
……//此处代码省略 ……//下面方框内是添加的代码,注意添加位置 西南交通大学经济管理学院:何耀琴
(10)调试运行结果,可看出当非模态Dialog对话框出现时,其它对话框仍然可以操作。 西南交通大学经济管理学院:何耀琴
5.3 图形界面 “图形界面”GUI(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。 GUI(图形界面)提供给用户以鼠标点击按钮方式进行操作,很直观。过去DOS环境下只能输入命令的界面叫CLI (Command line User Interface ) ,称为命令行模式用户界面。 GUI常读做“goo-ee” 。 GUI 设计需结合计算机科学、美学、心理学、行为学及实际应用领域需求分析,强调人—机—环境三者作为一个系统进行总体设计。 图形界面设计的目的是优化产品的性能,使操作更人性化,减轻使用者的认知负担。 有了GUI,极大地方便了非专业用户的使用。人们从此不再需要死记硬背大量的命令,取而代之的是通过窗口、菜单、按键等方式来方便地进行操作。 西南交通大学经济管理学院:何耀琴
GUI的组成 桌面:桌面是界面中最底层,有时也指包括窗口、文件浏览器在内的“桌面环境”。在桌面上由于可以重叠显示窗口,因此可以实现多任务化。桌面与既存的文件夹构成里面相违背,所以要以特殊位置的文件夹的参照形式来定义内容。比如在微软公司的Windows XP系统中,各种用户的桌面内容实际保存在系统盘(默认为C盘):\Documents and Settings\[用户名]\桌面 文件夹里。 墙纸:即桌面背景。可以设置为各种图片和各种附件,成为视觉美观的重要因素之一。 视窗/窗体/窗口:应用程序为使用数据而在图形用户界面中设置的基本单元。用户可以在窗口中操作应用程序,进行数据的管理、生成和编辑。通常在窗口四周设有菜单、图标,数据放在中央。 根据各种数据/应用程序的内容,窗口设有标题栏,并设有最大化、最小化(隐藏窗口,并非消除数据)、最前面、缩进(仅显示标题栏)等动作按钮。 单一文件界面:在窗口中,一个数据在一个窗口内完成的方式。在这种情况下,数据和显示窗口的数量是一样的。若要在其他应用程序的窗口使用数据,将相应生成新的窗口。因此窗口数量多,管理复杂。 多文件界面:在一个窗口之内进行多个数据管理的方式。这种情况下,窗口的管理简单化,但是操作变为双重管理。 西南交通大学经济管理学院:何耀琴
GUI的组成 标签:多文件界面的数据管理方式中使用的一种界面,将数据的标题在窗口中并排,通过选择标签标题显示必要的数据,这样使得接入数据方式变得更为便捷。 上述中,多文件界面主要是微软视窗系统采用。而在其他环境中,通常多是单文件界面,所以无所谓单一/多文件界面的称呼问题。 菜单:将系统可以执行的命令以阶层的方式显示出来的一个界面。一般置于画面的最上方或者最下方,应用程序能使用的所有命令几乎全部都能放入。重要程度一般是从左到右,越往右重要度越低。命定的层次根据应用程序的不同而不同,一般重视文件的操作、编辑功能,因此放在最左边,然后往右有各种设置等操作,最右边往往设有帮助。一般使用鼠标的第一按钮进行操作。 即时菜单:又称功能表。与应用程序准备好的层次菜单不同,在菜单栏以外的地方,通过鼠标的第二按钮调出的菜单称为“即时菜单”。根据调出位置的不同,菜单内容即时变化,列出所指示的对象目前可以进行的操作。 图标:显示在管理数据的应用程序中的数据,或者显示应用程序本身。 数据管理程序:即在文件夹中用户数据的管理、进行特定数据管理的程序的情况下,数据通过图标显示出来。通常情况下显示的是数据的内容或者与数据相关联的应用程序的图案。另外,点击数据的图标,一般可以之间完成启动相关应用程序以后再显示数据本身这两个步骤的工作。 应用程序的图标:只能用于启动应用程序。 按钮:菜单中,利用程度高的命令用图形表示出来,配置在应用程序中,成为按钮。应用程序中的按钮,通常可以代替菜单。一些使用程度高的命令,不必通过菜单一层层翻动才能调出,极大提高了工作效率。但是,各种用户使用的命令频率是不一样的,因此这种配置一般都是可以由用户自定义编辑。 西南交通大学经济管理学院:何耀琴
GUI 应用领域和赛事 手机通讯移动产品 电脑操作平台 软件产品 PDA产品 数码产品 车载系统产品 智能家电产品 游戏产品 产品的在线推广 国际性竞赛 国际上每两年举行一次GUI锦标赛的的界面竞赛。“图形用户界面大奖赛” 前身是“图形用户界面奥林匹克”,五大IT社区联合主办,属于微软认证的金牌合作计划。2008年大赛共有世界各国 26 个团队参加,参与 9 个项目,争夺共计一万二千美元的奖金(包括 X-Box 360、Nvidia 显卡在内的实物奖品)。比赛集中在桌面背景(Wallpaper)、桌面图标(Icon)、桌面主题(Visual Style)三个方面,而比赛项目的类型则分为“最实用”(Most Usable)、“最具原创性”(Most Original)、“综合最佳”(Best Overall)。 2008GUI锦标赛我国获奖情况 我国设计师获得了1金3银3铜的好成绩。 我国设计师iconboy的作品Non-Mainstream2008 获得了综合最佳桌面图标奖二等奖(Best Overall Icon Package Winners 2nd Place) 最实用桌面图标奖二等奖(Most Usable Icon Package Winners 2nd Place)。 手机通讯移动产品 电脑操作平台 软件产品 PDA产品 数码产品 车载系统产品 智能家电产品 游戏产品 产品的在线推广 西南交通大学经济管理学院:何耀琴
VC++中工具箱内有多种类型的控件和组件。 5.4 常用控件 控件特指程序运行时有一个图形化表示的组件,它可以被添加到窗体或对话框上以实现人机交互。如字体选择下拉框、工具栏、滚动条、状态栏 Windows窗体是一种用于创建程序的GUI。窗体可以是一个对话框、SDI窗口、MDI窗口。 VC++中工具箱内有多种类型的控件和组件。 在MFC中,每一种控件都有其对应的MFC控件类,而所有的控件类都派生于CWnd类,通过控件类开发人员可以很容易地实现对控件的控制和对控件事件和处理。 MFC中所包含的控件类如表中所示。 控件名称 对应的MFC类 静态控件 CStatic 下压控件 CButton 单选按钮 复选框 编辑框控件 CEdit 列表框控件 CListBox 组合框控件 CComboBox 滚动条控件 CScrollBar 列表控件 CListCtrl Tab控件 CTabCtrl 西南交通大学经济管理学院:何耀琴
使用控件的步骤 (1)准备对话框:对话框相当于控件的容器 (2)添加控件:从工具箱中将控件添加到对话框上; (3)设置控件的属性。通过属性可以定义控件的名称、样式、大小、位置、字体颜色等。 (4)映射控制变量或对象:在程序中,控件必须映射为一个值变量(value)或控件对象(control)。这样程序运行时就可以象控制变量一样控制控件了。例如一个文本编辑框可以映射为CString值或CEdit对象, CString是一个字符串,而CEdit是MFC为文本编辑框专门准备的控件类。 (5)编写响应控件事件函数:控件都是有事件的,如按下鼠标左键或右键,或选择“确定”或“取消”等。应编制好响应函数。 (6)调用控件方法:既然控件可以映射成对象变量,就可以用调用其成员函数(或方法,method)来完成特定的功能 。 西南交通大学经济管理学院:何耀琴
案例:静态控件的使用 静态控件包括静态文本控件和静态picture控件两种,用于显示要在对话框中出现的文本和图片。 往对话框中添加静态控件时,控件的所有ID都被自动设置成IDC_STATIC,因此,如果要为静态控件添加控制变量或事件处理函数,必须重新指定一个唯一的ID值。修改ID值可在静态控件的“属性”窗口中进行。 使用静态控件的流程: (1)创建一个单文档工程StaticControl并添加对话框; (2)创建一个非模态对话框并添加静态控件并设置静态文本控件及静态picture控件的属性,为控件映射控制变量。 (3)重载对话框类的OnInitDialog()函数,在函数中为picture控件加载位图。 西南交通大学经济管理学院:何耀琴
具体步骤: (1)创建一个单文档工程StaticControl; (2)在资源视图中用右键菜单“添加”“资源”向MFC工程中添加一个对话框资源,屏幕上会出现对话框模板; (3)双击对话框模板,定义一个派生类“CMyDialog”; (4)返回“解决方案资源管理器”窗口,双击打开主头文件“StaticControl.h”,添加包含定义对话框的头文件MyDialog.h的语句“#include ”MyDialog.h“ ”,并定义一个指针对象CMyDialog *dlg; 见图所示。 西南交通大学经济管理学院:何耀琴
添加包含语句 定义指针变量 西南交通大学经济管理学院:何耀琴
(4)双击打开应用程序“StaticControl (4)双击打开应用程序“StaticControl.cpp”,在初始化函数“BOOL CStaticControlApp::InitInstance()”中找到下面位置后添加语句。 完成非模态对话框的创建。见下图所示。 添加 西南交通大学经济管理学院:何耀琴
(5)切换到资源视图,右击工程项目名“StaticControl” →“添加” →“资源”,向单文档工程中导入一个位图资源Bitmap并新建一个Dialog资源?,这个位图资源可以是事先放好在某个文件中的位图文件。这里导入了一个衬衣.bmp位图。如图所示。 西南交通大学经济管理学院:何耀琴
西南交通大学经济管理学院:何耀琴
(6)展开资源视图树形结构,双击新添加的类模板IDD_DIALOG1,打开Dialog模板。 西南交通大学经济管理学院:何耀琴
(8)选择“视图” →“其他窗口” →“属性窗口”,打开属性窗口。 (7)从工具箱中向对话框模板添加一个静态文本框控件StaticText 和 一个Pictrue Control 控件,见图所示。 西南交通大学经济管理学院:何耀琴
(11)这里将其ID值修改为“IDC_STATIC1”,将其“Type”属性值选择修改为“Bitmap”,即位图。 (9)选择“静态文本”框,在“静态文本”框的“Caption”属性中,将“Caption”的值“静态”改为“在静态控件picture中显示一幅位图”。 (10)选中picture控件,由于所有静态变量控件的ID都被设置成了IDC_STATIC,因此,如果要为静态控件添加控制变量或事件处理函数,必须修改ID值。可在静态控件的“属性”窗口中进行修改。 (11)这里将其ID值修改为“IDC_STATIC1”,将其“Type”属性值选择修改为“Bitmap”,即位图。 西南交通大学经济管理学院:何耀琴
(12)右键单击Picture控件,选择“添加变量”。 (13)通过添加成员变量向导对话框,Picture控件,选择“添加变量”,为Picture控件添加一个控制变量m_picture。 单击“完成”。在MyDialog.h头文件中,可看到对m_picture的定义。 (12)右键单击Picture控件,选择“添加变量”。 西南交通大学经济管理学院:何耀琴
(15)在MyDialog.h头文件中定义一个CBitmap类对象bitmap; (14)用鼠标单击类的声明“class CMyDialog : public CDialog”中的 CMyDialog,并单击右边属性窗口中的“重写”按钮,在下面的列表中找到OnInitDialog并单击右边下拉菜单选择添加OnInitDialog()函数。操作后马上可看到头文件中出现了函数的声明语句。 (15)在MyDialog.h头文件中定义一个CBitmap类对象bitmap; 定义对象 西南交通大学经济管理学院:何耀琴
(16)在MyDialog.cpp的OnInitDialog()函数中,为picture控件添加加载位图的语句。 添加的语句 西南交通大学经济管理学院:何耀琴
(17)单击“启动调试”按钮运行程序。可以看到在对话框中,静态文本框显示了我们给出的一段文字,而picture控件则显示了我们加载的一幅位图图片。 西南交通大学经济管理学院:何耀琴
归纳 控件可以通过5个部分进行描述: 1. ID(控件的标识,用于在程序中调用控件) 2. 控件实体(添加到对话框中的图形) 3. 控件变量() 4. 属性函数 5. 消息函数 MFC中关联一个控件和变量的时候,可以选择是控件方式还是值方式,如果是控件方式,那么就是这个变量就代表了控件,如果是值方式,那么这个变量就代表了控件中显示的值。比如你说的静态控件,可以与CStatic类型的变量关联,也可以与CString类型的变量关联。 所谓的关联,只是MFC的一层封装而已,内部还是采用Windows SDK来操作的。 西南交通大学经济管理学院:何耀琴
可添加到项目中的资源 Accelerator:快捷键 Bitmap:位图 Cursor:标尺 Dialog:对话框 HTML:网页 Icon:图标 Menu:菜单 StingTab:字符表 Toolbar:工具条 Version:版本信息 西南交通大学经济管理学院:何耀琴
可添加到对话框中控件 下压按钮控件 复选框控件 编辑按钮控件 组合框控件 列表框控件 分组框控件 单选按钮控件 静态文本框控件 图片 控件 水平滚动条控件 垂直滚动条控件 滑块控件 旋转 控件 进度控件 热键控件 列表控件 树结构 控件 Tab键控件 动画 控件 带标尺的编辑器控件 日期时间选择控件 月历控件 IP地址控件 扩展组合框 自定义控件 超链接控件 分离按钮控件 网络地址控件 命令按钮控件 西南交通大学经济管理学院:何耀琴
主要属性及含义: Accept File:指定控件要接受拖放的文件 Caption(标题):显示在按钮上的文本 Bitmap:指定控件显示位图而非文本 Acclerator:快捷键编辑器 Client Edge:指定控件为带凹陷性边缘的边框 Default Button:指定控件是对话框默认的按钮 Disable:指定最初禁用控件 Flat:指定控件的可视外观是二维的 Group:指定基于Tab键顺序的一组控件中的第一个控件 Help ID:给控件分配基于资源ID的帮助ID Horizontal Alignment:指定水平对齐方式 可选择其中一种 默认值 Left---左对齐 Right---右对齐 Center—居中 西南交通大学经济管理学院:何耀琴
Modal Frame:指定控件将具有双边框; Multiline:指定控件文本太长时可以折为多行显示; 3D Look :是否具有3D效果; Absolute Align: 绝对位置; Icon:指定控件显示为图标而非文本; ID:指定控件的标识符; Modal Frame:指定控件将具有双边框; Multiline:指定控件文本太长时可以折为多行显示; Notify:指定控件向父级发送焦点通知; Owner Draw:指定按钮为所有者描述的按钮; Right Align Text:指定控件的文本右对齐; Left Align Text:指定控件的文本左对齐; Static Edge:指定控件具有三维边框; TabStop:指定用户可以用Tab键移动光标到该控件; TransParent:指定控件将具有透明背景 西南交通大学经济管理学院:何耀琴
Horizontal Alignment:指定水平对齐方式 可选择其中一种 Visable:指定控件最初可见; 默认值 Bottom---底部对齐 Top---顶部对齐 Center—居中对齐 Horizontal Alignment:指定水平对齐方式 可选择其中一种 Visable:指定控件最初可见; Tri-State:指定复选框是三种状态; Push Like:指定控件的外观和行为与普通控件一样; Auto HScroll:指定编辑控件中用户输入的文本水平滚动; Lower Case:编辑控件中输入的字符全部转换为小写字符; Upper Case:编辑控件中输入的字符全部转换为大写字符; No Hide Seletion:没有焦点时也显示某选定内容; Number:指定编辑控件中只能输入数字; OEM Convert:将输入到编辑框中的文本转换成OEM字符集( OEM字符集有好几套,分别对应不同的PC) 西南交通大学经济管理学院:何耀琴
ASCII码字符集 OEM字符集 西南交通大学经济管理学院:何耀琴
主要属性及含义: Password:对输入到编辑框中去的字符全显示为“ * ”; Read Only:禁止用户输入文本到编辑框; Want Return:允许编辑框接受Enter键; No Integral Height:指定组合框的大小正好是应用程序指定的大小; Right To Left Reading Order:指定从右到左的阅读顺序; Sort:对添加到列表框中的字符串进行自动排序; Type:类型(简单的--Simple、下拉--DropDown、下拉列表—Drop List); 数据:指定用来填充控件的数据,数据之间用分号分隔; 西南交通大学经济管理学院:何耀琴