实践教程第三章第二版.ppt_第1页
实践教程第三章第二版.ppt_第2页
实践教程第三章第二版.ppt_第3页
实践教程第三章第二版.ppt_第4页
实践教程第三章第二版.ppt_第5页
已阅读5页,还剩148页未读 继续免费阅读

下载本文档

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

文档简介

第三章 MFC程序设计 本章的内容,简洁而不失完整性:由应用程序向导 建立程序框架,由资源编辑器建立用户界面,由 类向导建立成员变量、消息映射和处理函数,加 上文档序列化和注册 MFC包含了所有与系统相关的类(包括图形用户界面相关的 类),其中封装了大多数的API函数,提供了应用程序框架 和开发应用程序的工具如应用程序向导、类向导、可视化 资源设计等高效工具,用消息映射处理消息响应,大大简 化了Windows应用程序的开发工作,使程序员可以从繁 重的编程工作中解脱,提高工作效率。 3.1.3.1.MFCMFC程序设计简介程序设计简介 3.2.3.2.MFC MFC 程序设计程序设计 3.3.3.3.用户界面资源的应用用户界面资源的应用 3.4.3.4.对话框的应用对话框的应用 3.5.3.5.基于对话框的应用程序设计实例基于对话框的应用程序设计实例 3.6.3.6.文本和图形输出文本和图形输出 3.7.3.7.文档的保存文档的保存 3.8.3.8. MDI MDI应用程序设计应用程序设计 目录 3.1 MFC程序设计简介 MFC类库 基础类 (已在第二章中介绍) 宏、全局变量及全局函数 应用程序框架 3.1.1 MFC定义的宏、全局函数及全局变量 类库 1. MFC提供的主要宏: 消息映射宏:声明消息映射表宏DECLARE_MESSAGE_MAP、消 息映射定义宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP消息映射 表入口宏ON_消息名。(本章只介绍消息映射宏) 3.1.1 MFC定义的宏、全局函数及全局变量 动态MFC对象宏 DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC 动态创建对象宏 DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE 运行时类宏: RUNTIME_CLASS 序列化宏: DECLARE_SERIAL和IMPLEMENT_SERIAL 诊断服务宏: ASSERT、VERIFY 跟踪服务宏: TRACE 异常处理宏: THROW 3.1.1 MFC定义的宏、全局函数及全局变量 MFC提供一些不属于任何类的全局函数,函数名以Afx开 头,可以被应用程序中的所有类和函数所调用。如: AfxAbort(),无条件终止一个应用程序的执行; AfxGetAppName(),返回指向应用程序名的字符串指 针;AfxWinInit(),由WinMain()调用,对MFC应用程 序进行图形用户界面(GUI)的初始化等等。 3. 全局变量 全局变量名以afx开头,如afxTraceFlag、 afxDump等,主要与异常处理有关。 2. 全局函数 3.1.2 MFC命名规则 匈牙利命名法规定: 变量名以一个或多个小写字母开头作为 前缀,标识变量的数据类型; 类型标识后是若干个单词,标识变量含义 ,每个单词以大写字母开头,其余字母小写; MFC中所有类及自定义类都以C开头; 类成员变量以m_为前缀,下划线后是变 量名等等。 前缀数据类型例 B,bBOOLbIsValid ChcharChText,ChGrade cclasscString CsCStringCsName DwDWORDDwFlags fnfunctionfnSort handlehWnd,hPen iintiCount ppointerpFrame szASCII stringszName m_Data memberm_szName 表3.1 命名规则 h MFC提供了构造Windows应用程序的框架,它不 仅为应用程序建立标准的结构,生成一系列起动文 件,还提供标准的图形用户界面如菜单、工具栏、 状态条等供开发人员在程序中补充完善,开发人员 只需要完成针对特定应用的代码。使用应用程序框 架的应用程序代码小,运行速度快,它提供的工具 也降低了编码的难度。 3.1.3 应用程序框架介绍 程序的数据储存在文档类中(作为文档类的数据成员),是 对数据的抽象表示。数据显示由视图负责,视图是程序 窗口的客户区,框架窗口是客户区的框架,程序数据显 示在窗口,用户通过视图与程序交互。 一个文档可以对应多个不同视图;而一个视图一般只对应一 个文档。当文档数据发生变化时,视图显示的状态也会 随之变化;对于多个视图的情况,基于同一文档的多个 视图的显示同步变化。 1.文档-视图结构 文档视图结构提供一种连续处理数据的方式,使 应用程序的数据与数据的显示分开处理。 文档、视图及框架的关系: 框架窗口对象 文档与视图之间 的双向数据交换 发送至视图 对象的消息 文档对象 (保存程序 数据) 应用程 序对象 视图对象 发送至框架 窗口的消息 图3.1 2. 单文档界面应用 单文档界面应用程序简称SDI(Single Document Interface),只允许一个框架窗口存在,每次 只能创建和拥有一个文档对象,也只允许打开 一个文档。 SDI各类 关系图 可将文档比作一个文件袋,专门用于保存文件 数据,需要看时需从文件袋(文档)中取出来, 放到桌面(视图)上看。 表3.2 基于文档/视图关系的SDI应用中的类 Document 文档类类 储储存与应应用程序相关的数据 View 视图类视图类决定文档数据的显显示方式,提供用户户界面 Frame window 框架窗口 派生自CFrameWnd,为为CWinApp类类的 m_pMainWnd成员赋值员赋值 Document template文 档模板 CSingelDocTemplate类对类对 象,用构造函数 将文档、视图视图 、框架窗口及用户户界面资资 源联联系在一起,创创建并管理文档 Application 应应用程序 类类 代表应应用程序,拥拥有指向文档管理类类的指 针针,管理应应用程序中所有文档模板,负负 责责初始化和退出清理工作 返回 应用程序类 框架类( 窗口框架) 资源(决定用户 界面的显示) 视图类 (显示数据并 与用户交互) 文档类 (保存数据) 单文档模板 返回 应用程序类 CDocManager* m_pDocManager 框架类( 窗口框架) 资源(决定用户 界面的显示) m_pDocument 视图类(显示数据 并与用户交互) 文档类(保存数据) m_pDocTemplate m_viewList 返回 单文档模板 CRuntimeClass*m_pDocClass CRuntimeClass*m_pFrameClass CRuntimeClass*m_pViewClass UINT m_nIDResource 多文档界面应用简称MDI(Multiple Document Interface),允许有多个文档类、视图类和多个文 档模板CMultiDocTemplate(建立多种文档-视图-子 框架关系)存在,运行时允许打开多个MDI子框架窗 口,拥有各自的文档和视图对象。示例 关系图 在打开的多个子窗口中,只有一个活动窗口,应 用程序菜单和工具栏的所有的命令都是针对活 动窗口的。 3.多文档界面应用 子框架 资源2 视图类2 文档类2 文档模板2 子框架 资源1 视图类1 文档类1 文档模板1 主 框 架 其它文档模板 返回 CDocManager 应用程序类 CDocManager* m_pDocManager 文档/视图结构可以充分发挥应用程序框架和MFC 的优势,是MFC应用程序的核心,但使用它也要付 出运行效率和代码增大的代价。 文档/视图结构对应用程序来说并不是必不可少 的,有两种常见的非文档/视图结构应用。 4. 非文档/视图结构应用 常见非文档/视图结构应用: (1).基于对话框的应用,它包含一个CWinApp对 象和一个模态对话框,对话框负责数据的存储 和显示 。关系图 (2).SDI或MDI应用,都可以不包含文档对象 ,SDI包含一个CWinApp对象,一个框架窗口 对象和一个从CWnd派生的CChildView视图对 象,视图对象负责数据的显示,MDI应用还包 括一个子框架窗口。 对话框类 作为应用程序主窗口 负责保存和显示数据 应用程序类 返回 Dialog-based Application 主框架,应用程序主窗口 CChildView视图类 负责保存和显示数据 应用程序类 SDI Application, None Doc/View 返回 子框架, 视图框架窗口 CChildView 视图类 应用程序类 子框架, 视图框架窗口 CChildView 视图类 主框架,应用程序主框架窗口 MDI Application, None Doc/View 返回 图3.2 MFC应用程序开发过程 类向导 集成开发环境 应用程序向导 资源编辑器 Create .def .cpp .h .dsw .dsp .ico.rc.bmp 源文件资源文件 编译.objBuild资源编译.res 应用程序 5. MFC应用程序创建 6.最简单的MFC应用程序示例 对于一个MFC应用程序来说,只有CWinApp的派生对 象是必不可少的,其它类均可视情况进行取舍。 下例是一个最简单的MFC应用程序。 例:显示一个消息框。 (1).创建工程,工程类型选择Win32 Application,工程名 为Ex3_0; (2).创建C+源文件,文件名Ex3_0.cpp,内容如下: #include class CEx3_0App: public CWinApp /CWinApp派生类 public: virtual BOOL InitInstance() MessageBox(NULL,”SimplistMFC Application.”, ”Ex3_0”,MB_OK); return TRUE; ; CEx3_0App theApp; /全局变量,代表应用程序本身 CWinApp:InitInstance()虚函数完成应用程序的初始化工作,派生的 应用程序类都要重载此函数进行初始化,如完成主框架窗口的构造 ,窗口定义显示等工作。 (3).设置使用MFC。 选择Project|Settings菜单项,选择General 页面,在Microsoft Foundation Classes组合框中选择 Use MFC in a shared DLL。 (4).编译生成并运行此工程,结果显示一个消息框,如下 图: 图3.3 最简单MFC应用示例 3.2.MFC 程序设计 MFC应用程序的执行过程(参见图3.4): 1.构造全局对象CWinApp派生类对象; 2.运行由应用程序框架提供的WinMain函数; 图3.4 MFC应用程序的执行过程 3.在WinMain中,通过afxGetApp()获得全局对象的指针 pApp,调用全局函数AfxWinInit() ,为CWinApp的成员 变量m_hInstance, m_hPrevInstance, m_lpCmdLine, m_nCmdShow赋初值; 然后调用pApp-InitApplication() ,这是CWinApp的 虚函数,一般不需要改写; 调用 pApp-InitInstance() ,每个程序都必需改写这 个函数,进行应用程序初始化; 4.在InitInstance()函数中,先用new构造一个 CFrameWnd派生类对象,其构造函数又调用Create() ,创建主窗口,MFC依此自动为应用程序注册窗口类 ; 调用ShowWindow()显示窗口,调用UpdateWindow(), 发出WM_PAINT消息; 5.回到WinMain中,调用pApp-Run,进入消息循环,通过 API函数GetMessage()获得消息,TranslateMessage()处 理消息,DispatchMessage()派送消息到 CWnd:DefWindowProc() ,DefWindowProc()按照消息 映射表的定义将消息分发到各相应消息处理函数; 如消息队列为空,则Run调用CWinApp:OnIdle()进行空闲处 理,重载OnIdle()可以去处理后台程序(低优先级); 6.若用户选择菜单File/Close,则程序收到WM_COLSE消息, 调用:DestroyWindow()发出WM_DESTROY消息,然后调 PostQuitMessage() ,发出WM_QUIT消息,此时Run会结 束其内部消息循环,调用ExitInstance() ; 7.最后,返回WinMain() ,执行WinTerm() ,结束程序运行 。 几点解释: (1).每个MFC应用都有stdafx.h头文件,由应用程序向导自 动生成; (2).每个MFC应用都应包含头文件afxwin.h,其内部又包 含了其他头文件。 (3).每一个MFC应用程序都包含唯一的CWinApp派生类 对象,代表应用程序本身。 (4).MFC应用程序中看不到WinMain()入口函数,它被 封装在应用程序框架里,运行时自动调用; 3.2.2.MFC消息映射 消息映射(Message Map)机制: 消息映射机制规定每个要响应消息的类定义自 己的消息映射表,将消息与处理消息的函数 联系在一起;当事件发生产生消息时,在程 序中各个类的消息映射表中查找,当找到消 息处理函数时,便将消息送至对应的消息处 理函数进行处理。每个从CCmdTarget所派生 的类都可以接收消息,都可以定义自己的消 息映射表Message Map。 消息映射表: 1.消息 消息是Windows用来通知MFC应用程序事件发生的 主要方式,应用程序的行为取决于对消息的响 应方式。 MFC把消息分为三大类: (1).标准Windows消息(WM_XXX), (2).命令消息(WM_COMMAND), (3).控件通知消息。 2.消息映射 消息映射将消息与应用程序提供的处理该消息 的成员函数联系在一起,一组消息映射构成 消息映射表。 消息映射表由BEGIN_MESSAGE_MAP和 END_MESSAGE_MAP 这一对宏作开始和结束, 中间是若干消息映射入口 每一个入口由特定的消息宏ON_XXX组成,将一 个消息与与之对应的处理函数联系在一起。 定义和使用消息映射表的步骤: 在头文件的类声明中添加 DECLARE_MESSAGE_MAP宏声明消息映射;例如 在类的定义文件(.cpp)定义消息映射表,方法是 在 文件的开始处添加BEIGN_MESSAGE_MAP和 END_MESSAGE_MAP 这一对宏,在它们之间放置 消息映射宏,定义并初始化消息映射表,在消息与处 理消息的函数之间建立联系;例如 在类的定义文件(.cpp)中添加消息处理函数。例如 消息宏: (1).对标准Windows消息的响应 消息宏ON_WM_XXX定义对标准Windows消息WM_XXX 的响应,所有派生自CWnd的类均可响应这类消息,系统默认 的响应函数为OnXxx,对应关系见下面的表3.3: 宏名消息默认处理函数 ON_WM_CHARWM_CHAROnChar ON_WM_ CLOSEWM_ CLOSEOnClose ON_WM_CREATEWM_ CREATEOnCreate ON_WM_LBUTTONDOWNWM_ LBUTTONDOWNOnLButtonDown ON_WM_LBUTTONUPWM_ LBUTTONUPOnLButtonUp ON_ WM_MOUSEMOVEWM_ MOUSEMOVEOnMouseMove 由于有系统默认的消息和处理函数,在消息映射表中只写宏名,如: ON_WM_CREATE() (2).对命令消息的的响应 。 ON_COMMAND宏定义对命令消息的响应,格式为 ON_COMMAND(命令ID,响应函数) 举例如下: ON_COMMAND ( IDM_ABOUT, OnAbout ) /表示IDM_ABOUT消息由OnAbout()响应 ON_COMMAND ( IDM_FILENEW, OnFileNew) ON_COMMAND ( IDM_FILEOPEN, OnFileOpen) 所有由用户定义的命令消息也由ON_COMMAND定义 消息映射关系。 (3).对控件消息的响应 控件消息由按钮(BN_)、编辑框(EN_)、组合框 (CBN_)、列表框(LBN_)等产生,在消息名前加上 ON_即构成宏名, 举例如下: ON_BN_CLICKED (按钮ID,响应函数) ON_CBN_DBCLK (组合框ID,响应函数) ON_EN_SETFOCUS (组合框ID,响应函数) ON_LBN_DBCLK (列表框ID,响应函数) 分别表示选择各个控件后,产生的消息由其后面定义 的函数进行处理。 3.消息处理 消息一般由应用程序中对象的成员函数来响应。当某个事件 发生后,系统向应用程序消息队列放入一个消息, CWinApp对象取得消息并按照消息映射表的定义将消息派 送到某个类的相应的消息处理函数进行处理。 使用ClassWizard(见第五章菜单中View菜单介绍)定义消息 映射关系,添加消息处理函数,系统会自动生成函数原型 和函数框架,开发人员只要添加函数体代码,可以避免一 些常见错误的产生。 程序中类响应windows消息的优先顺序: 取决于消息传递的顺序。 对于一般的Windows消息,由产生这些消息的对象响应, 如窗口的创建WM_CREATE,窗口的移动WM_MOVE,由产生 消息的窗口类响应,如果找不到相应的处理函数,则将 消息传递到其父类,一般情况都有缺省的响应函数; 对于命令消息WM_COMMAND,可由拥有菜单资源的所有类来 处理,传递的顺序是视图类、文档类、文档模板类、框 架类、应用程序类,即这些类处理命令消息的优先顺序 。 详见第2章。 视图类的定义文件(.cpp)中必须有消息映射定义: BEIGN_MESSAGE_MAP(CMyView,CView) /消息映射表定义 ON_WM_LBUTTONDOWN() /函数名为OnLButtonDown /其它消息映射入口 END_MESSAGE_MAP() 以及对应的消息响应函数定义: void CMyView:OnLButtonDown(UINT nFlags, CPoint point) /处理消息的操作代码,程序中具体实现 返回 将CMyView的基 类CView也包含进 去,当在派生类中 没找到处理函数时 ,允许在基类中继 续查找。 注 例如,当用户在视图窗口中按下鼠标左键时,Windows发送 WM_LBUTTONDOWN消息到应用程序,假设视图类需要响应这些 消息,在类的头文件(.h)中有函数声明和消息映射表的声明 : Class CMyView: public CView afx_msg void OnLButtonDown(UINT nFlags,CPoint point); /函数原型声明 DECLARE_MESSAGE_MAP() /消息映射表声明 返回 afx_msg标识消息映射函数 ,所有由ClassWizard生成的 消息处理函数原型说明前都有 这一标识。 注 3.2.3.文档/视图结构 1.文档类 在基于文档/视图结构的应用程序中, CDocument的派生对象负责读入、保存和管理 应用程序的数据。每个文档类可能与多个视图 类关联,而每个视图包含一个指向与其相关的 文档的指针。 文档类允许向其中增加数据成员,应用程 序的数据可以是任何类型的,或者是任何自定 义的数据结构,如结构体,类或链表等。 3.2.3.文档/视图结构 文档类的常用成员函数(带的表示是可重定义函数) 成员函数说明 GetFirstViewPosition返回一个第一个视图的位置值 GetNextView返回指向相关视图队列中下一个视图的指 针 GetPathName取得文档的文件名和路径,若文档未命名 则返回空串 GetTitle取得文档的标题,若文档未命名则返回空 串 IsModified若文档包含未保存数据,则返回非0,否则 返回0 SetModifiedFlag设置或清除文档的修改标志 表3.4 成员函数说明 UpdateAllViews文档对应多个视图时,更新所有视图,它是通 过调用每个视图类的OnUpdate函数来更新所有 与本文档关联的视图 OnNewDocument当创建一个新文档时由应用程序框架调用。重 定义这个函数实现在新文档创建之前初始化文 档对象,如为指针申请内存空间 OnOpenDocument当从磁盘读入文档时由应用程序框架调用。重 定义这个函数实现在新文档读入之前初始化文 档的其它非序列化数据成员 DeleteContents由应用程序框架调用,以删除文档内容。重定 义这个函数在文档关闭之前释放文档所占用的 内存和资源 Serialize由应用程序框架调用对文档进行序列化,重定 义这个函数实现特定文档的序列化,以保存或 读入文档数据 2.视图类 视图类对象代表了应用程序的窗口客户区,是文 档信息的一个显示窗口(视口),它同时也是用 户与程序之间信息交互的桥梁,用户对数据的 编辑和修改需要通过键盘或鼠标进行,这些消 息都由视图类接受后再反映到文档类。 视图类的派生关系: CWnd CView CCtrlView CListView CEditView CRichEditView CTreeView CScrollView CFormView CDaoRecordView CDaoRecordView 图3.5 CView类提供了向视图或打印机进行输出的基本框 架,决定了视图的基本特性,派生的视图类可以重 载基类的函数,或增加新的函数以决定特定视图的 特性。 CView的派生类可以多种方式显示文档类的信息,每 个视图类根据显示的方式各自定义其显示代码。 MFC提供了一系列这样的类,如 CTreeView 树型视图 CListView 列表型视图 CFormView 显示基于对话框模板的视图 CScrollView 带滚动条的视图。 1)视图类实现特定视图的特性的虚函数 GetDocument返回指向相关联联文档对对象的指针针 OnDraw支持打印、打印预览预览 和在屏幕上显显示, 由OnPaint(重画),OnPrint(打印)调调 用 OnInitialUpdate当视图视图 第一次与文档关联时联时 被调调用, 重定义这义这 个函数对对重新读读入或新创创 建文档的视图进视图进 行初始化 OnUpdate当文档内容发发生变变化,视图视图 需要更新 时时被调调用,更新整个视图视图 。重定义义 这这个函数可以实现实现 只更新无效区域 表3.5 CEx3_1Doc* CEx3_1Doc* pDocpDoc = = GetDocumentGetDocument();(); 通过GetDocument获得与视图关联的文档类指针,通过指针 pDoc访问文档类的数据成员和函数成员,在视图(窗口 )中显示文档对象,当用户通过视图改变文档数据时, 可设置自动更新文档内容。 文档/视图结构已经把应用程序所需要的数据处理与显示( 虚函数)的框架构造好,程序设计人员只需要将具体应用 的数据添加到文档类,并根据数据类型在视图类的虚函 数OnDraw()中完成数据的显示。 2) 视图类的成员函数访问与其关联的文档类的方式 3.文档模板类 CDocTemplate类将框架、视图、文档对象及应用 程 序的资源捆绑在一起。应用程序每打开一个文件, 至少创建一个文档对象、一个视图对象和一个框架 窗口,而文档模板对象负责管理所有这些对象,并 将各种相关资源与之联系在一起。 在大多数情况下,程序不需要对这个类进行修改。 对于SDI应用,使用CSingleDocTemplate文档模板。 对于MDI应用,使用CMultiDocTemplate文档模板。MDI允许 有多个文档模板,将不同文档-视图类联系在一起,实现不 同文档视图显示关系。 4.应用程序创建过程 n使用AppWzard,根据实际需要,选择创建合适的 应用程序框架(是否使用文档/视图结构,使用SDI或 MDI等) n在文档类中添加程序所处理的数据,作为文档类数 据成员; n在视图类中取得文档数据,以合适的方式在窗口中 显示出来 5.应用实例 例3_1:创建一个包含文档/视图结构单文档 界面应用的实例,为文档类添加一个字符 串数据,在视图窗口显示出来。 步骤如下: (1).在File菜单中选择New,如图3.,在 Project页面选择MFC AppWizard(exe),在 Project name中输入Ex3_1,并选择合适的 路径按OK按钮。 (2).在AppWizard Step 1中,如图3., 选择Single Document单 选按钮,并选 中Document/ View architechure Support复选框, 表示使用文档/视图结 构,按Finish按钮。显示New Project Information信息框,显示新创建的工程 的有关信息按OK按钮,这样工程创建完 毕。 图3. New Project对话框 图3. AppWizard Step1 在VC集成开发环境中看到,新工程生成了五个类, 如图3.在class view页面上可看到这些类。 CAboutDlg 派生自CDialog,一个About对话框。 CEx3_1App 派生自CWinApp,其全局对象theApp 代表应用程序本身。 CEx3_1Doc 派生自CDocument,文档类。 CEx3_1View 派生自CView,视图类。 CMainFrame 派生自 CFrameWnd,程序框架类。 文档、视图及应用程序类名都以工程名开 头,后接对应的类型名,这有助于在程 序中有多个文档视图类时区分主视图与 其它视图,区分主文档与其它文档类。 应用程序向导AppWizard为每个类生成了一 个头文件和一个.cpp文件,还自动生成 了stdafx.h和stdafx.cpp,图3., AppWizard还生成了缺省的用户界面资源 文件,在Resource view页面显示。 图3. ClassView 图3. FileView (3).为文档类增加数据成员。在编辑窗口打 开文档类的头文件Ex3_1Doc.h,手工添加 一个字符数组成员m_StrName;或在 Workspace的ClassView页面,右击 CEx3_1Doc类,在弹出式菜单中选择Add Member Variables,在对话框中输入变量 类型和名称。 在文档类构造函数中对新增加的变量进行初 始化。 (4).显示字符串.在CEx3_1View的OnDraw() 函数显示字符串。 图3.10 例3.1第一步主界面 3.3.用户界面资源的应用 资源是windows应用程序的一种特殊数据,包括菜单、加速键 、光标、位图、图标、对话框、字符串、 工具栏、状态栏 等,资源一般放在exe或DLL文件中。 当windows将程序装入内存时,一般不将资源同时装入,而是 当需要某个资源时才将相应资源装入。 资源定义在资源脚本(resource scirpt)文件中。 以.rc为 文件扩展名,文件名与工程名相同。 资源脚本文件中定义了各种资源的相关数据,Windows通过使 用不同的资源标识符前缀来区分不同资源类型(如表3.所 示),这样做虽然不是必须的,但遵循这样的规则 有利 于提高程序的通用性和可读性。 表3. 资源类型及其标示 资源标识前缀 IDM_ ID_ IDI_ IDB_ IDD_ IDR_ IDC_ IDS_ 资源类型 菜单项ID 菜单命令ID 图标ID 位图ID 对话框ID 菜单栏、工具栏、加速键 控件ID 字符串 返回 Visual C+ 6.0中提供了资源编辑器,对资源 进行可视化编辑,并自动生成资源脚本文件 ;脚本文件可用文本编辑器进行编辑,但其 可读性较差,容易出错,一般情况下尽量不 要进行编辑。 用户定义的资源标识符号常量定义在 resource.h文件中。 3.3.用户界面资源的应用 3.3.1.菜单 分类: 顶层菜单 : 一般位于应用程序主窗口或顶层窗口 弹出式菜单: 选择某个菜单项后弹出的子菜单 1.菜单的编辑 如果是AppWizard产生的程序,系统已为框架创 建了一个标准的主菜单,包括文件、编辑、视图 、窗口帮助等标准菜单,定义了各菜单项的ID及 相应的命令处理函数。在Resource View页面,打 开工程资源,选择Menu,然后双击主菜单资源 IDR_MAINFRAME标示,可打开菜单编辑器。 添加新的菜单资源 选择Insert Resource菜单项,在Insert Resource对话框 中,选择Menu资源类型,单击New按钮,缺省新菜单名为 IDR_MENU1。 a) 增加一个顶层菜单 在菜单属性对话框中,选中Pop-up选项,可以定义一 个顶层菜单,在Caption编辑框中输入菜单名,菜单名即显 示在菜单上。若在菜单名的某个字符前加一个 /可以向数组中增加ID以增加状态栏上显示栏。 3.3.3 状态栏 图3.16 例3.1主界面 3.4.对话框的应用 3.4.1 对话框的工作方式、种类和创建方法 1. 对话框在应用程序中的工作方式 对话框是一个读入或写出数据的图形界面对象,由集 成开发环境中的对话框模板提供,可以向模板添加各种控 件(如按钮,编辑框,单选复选按钮等),构成程序的对话 框资源; 应用程序要使用对话框还需定义一个CDialog派生类 的对话框类与资源相连接,并在这个对话框类中定义一些 成员变量与对话框中的控件相对应,提供对话框控件的缺 省数据值; 程序运行时需要用到对话框时依据对话框资源 激活对话框,接收用户输入后通过成员函数更新文 档类数据成员,如图3.17示。 图3.17 对话框与文档的数据交换 构造对话 框并更新 文档数据 数据 交换 对话框模板 controls public: data members 文档类: application datas 对话框 类对象 2. 对话框的种类 Windows有两种对话框,模态对话框和非模态对话框 ,构造两种对话框的大多数工作都相同,只是两 者的显示和数据处理有些不同。 模态对话框(Modal Dialog Boxes)工作时使其父类窗口无效 ,直到对话框结束。也就是说,该对话框打开后, 程序等待 用户输入,在关闭对话框后才执行其它任务。 非模态对话框( Modeless Dialog Boxes)在打开期间,允许 用户切换到程序其它部分,不一定要关闭对话框。WinWord 中的Find and Replace对话框是一个典型的非模态对话框。 3. 对话框的创建与编辑 a)对话框的创建 选择Insert|Resource.,在Insert Resource对话框中选择Dialog类型,按New按钮 ,打开对话框编辑器,缺省情况下,对话框模板 提供了OK和Cancel两个按钮,同时打开了对话框 工具栏和控件工具栏,如下图。 图3.18 对话框模板及编辑工具 在对话框模板内右击鼠标,在弹出的菜单中选择 Properties,打开Dialog Property对话框。 图3.19 对话框属性对话框 b)控件属性 将控件工具栏中的任一种控件拖至对话框模板中, 在控件上右击鼠标,选择Properties打开控件属 性对话框,如图3.20。 各种控件属性对话框基本相似,在ID框中输入标识 控件的唯一ID值,在Caption中输入控件上显示的 字符(Edit控件没有这一属性),Visible表示该控 件在对话框创建时是否显示,Group用来控制控件 分组,Disabled使控件不可用,Tab stop表示是 否用Tab键选择控件。 图3.20 控件属性设置对话框 c)控制Tab顺序 当打开对话框编辑器后,集成开发环境的菜单上 多了一个Layout菜单,其中主要是对话框工具 栏上显示的一些命令,其中有一个命令Tab Order,定义当用户用Tab键移动输入焦点时各 控件接受焦点的顺序。如图3.21所示。 d)分组控制 VC提供了根据控件功能将控件进行分组的工 具,使用户更易于理解对话框的结构。在分组框 中使用最多的是单选按钮(radio buttons),一 组单选按钮允许用户在组内多个相互排他的选项 内选择一项。 图3.21 设置Tab Order e)组合框Combo Box 将组合框拖至对话框中后,按向下箭头,显示运行 时下拉组合框的大小,调整到合适大小。组合框 的属性对话框比其它控件多一个Data页面,用于 输入组合框中的数据项,每一行是一项,输完一 项按Ctrl+Enter键换行。 f)列表框List Box 在对话框编辑器中只能设置列表框大小、位置和ID, 数据的初始化需要通过编程实现。一般在拥有列表框 控件的对话框的OnInitDialog函数中,调用 CListBox:AddString(无序)或 CListBox:InsertString(有序)插入字符串。 g)测试对话框 当所有控件都布置好并定义属性后 ,可以选择对话框工具栏上的测试按钮 ,测试对话框工作情况,必要的话做适 当调整。 3.4.2 将对话框与程序连结 1.对话框类及数据成员的定义 a)创建对话框类 对话框资源建立好后,在对话框中右击鼠标 ,选择ClassWizard菜单项,会出现提示框,说 明新建的对话框资源是新资源,是否需要建立 一个新类或选择一个已存在的类。 若选择新类 ,出现图3.23示的New class对话框 。 选定后,在WorkSpace中可看到新增加的类,自动生 成的“StudentDlg.h“头文件和StudentDlg.cpp源文件。 图3.23 新建类对话框 b)增加数据成员 要使对话框能与程序 通讯,还需给对 话框类增加数据 成员,以保存各 控件的初始值, 并从控件读取数 据。 与控件对应的数据成 员可以是变量或 控件类型,如表 3.9所示。 分类变量成员控件成员 用途 用于控件初始化或 保存控件值,成 员变量可以是任 何数据类型,如 编辑框的值可以 是整型或字符串 ,复选框的值是 BOOL类型 控件成员变量是相应控 件类的对象,可以 调用控件类的成员 函数,如列表框, 定义一个CListBox 类型变量,可以通 过控件使用类的成 员函数以初始化列 表框 说明一个控件可以定义其中一种也可定义两种 表3.9 对话框与控件对应的变量或控件数据成员 在ClassWizard的Member Variables页面,选择对话框 类,在Control IDs中列出了对话框中所有控件ID, 如图3.24,选择某个ID,按Add Variable按钮,弹 出Add Member Variable对话框,可输入成员名,在 Category中选择值(value)变量或控件(controls)类 型,在Variable type列表框中,若是Value类,选择 变量数据类型,若是Controls,选择控件类,按OK, 成员添加成功。 设计不同的菜单命令响应函数,可以用对话框成员变量更新文档数 据;也可以用文档数据为对话框数据成员赋值,再显示对话框 图3.24 为对话框添加数据成员 2.对话框的显示 模态对话框 调用其DoModal()函数显示, 按OK或Cancel按钮关闭对话框 非模态对话框 调用Create()函数创建并显示对话框 用DestroyWindow关闭对话框。 3.为控件添加或修改消息响应函数 打开ClassWizard,在Message Map页面,可 以为控件添加响应函数。如图3.26。 图3.26 为控件添加响应函数 图3.27 例3.1 新主界面 3.5.基于对话框的应用程序设计 AppWizard提供了基于对话框(Dialog based)的应 用程序框架,程序可以简单到只有CWinApp派生类 和一个对话框类,对话框就是程序框架,负责数 据输入输出和存储,以及消息处理;对话框可以 有最小化按钮,甚至可以连接一个菜单。 基于对话框的应用程序结构简单,只要正确选 择控件及定义成员变量,设计正确的算法。 适合开发数据不多,功能简单的程序。 3.6.文本和图形输出 Windows设备描述表DC(device contexts),是对各种不 同设备的抽象,应用程序只要向DC输出,由DC负责处理不同 设备的差异。 DC是一个数据结构,描述了图形设备接口GDI进行输出 所需要的信息,包括颜色,填充方式,画笔宽度等。 在Windows中,DC允许应用程序使用输出设备,DC在应 用程序、设备驱动程序、与输出设备之间建立联系, 并提供绘图信息。 在MFC中,CDC类封装了设备描述表DC,该类的核心是 m_hDC,代表一个指向窗口DC的句柄。 1.CDC类及其派生类 CDC类派生自CObject,它具有CObject类的共同特性,如 可以动态创建,可进行序列化操作。 CDC派生类类说说明 CClientDC代表窗口客户户区 CPaintDC代表客户户区的无效区域(需要重画的区域) ,如被对话对话 框遮挡挡的部分 CWindowsDC 窗口区(包括客户户区和非客户户区) CMetafileDC面向备备忘文件的DC,为为重绘图记录绘图记录 一 系列绘图绘图 命令 (a).设置颜色 windows使用一个32位无符号整型值来表示图形和文本的颜 色,其数据类型为COLORREF,它包含4个字节,第一字节 未使用,不要改变其值;后面三个字节分别表示红、绿、 蓝三种基本色的成分,每一种颜色用一个0-255之间的数 字表示。 COLORREF unusedBlue GreenRed 设备描述表最常见的使用是在视图类的OnDraw函数中进 行图形和文本输出 2.CDC类的使用 宏RGB定义颜色值 宏 RGB 定义一个颜色的三种基本色成分,返回 COLORREF值 GetRValue 返回一个COLORREF中红色分量 GetGValue 返回一个COLORREF中绿色分量 GetBValue 返回一个COLORREF中蓝色分量 例: COLORREF color = RGB(125,125,125); CBrush brush(color); TRACE(“ The Red component of the brush is %dn”, GetRValue(color); CDC的像素操作函数SetPixel()和GetPixel(), 使图形设置精确到像素 (b).像素操作 void CExView:OnDraw (CDC *pDC) pDC-SetPixel( CPoint (100,100), RGB(255,0,0); typedef struct tagPOINT LONG x; LONG y; POINT; CPoint是MFC中表示点的类,派生自POINT结构,封装了对CPoint 和POINT进行操作的函数,主要是一些运算符函数。 (c).绘制直线及其它图形 CDC用于图形操作的成员函数 MoveTo 从当前点移至参数点 LineTo 从当前点画直线至参数点 Polyline 用CPoint对象的数组作参数, 将数组中各点依次连直线, Rectangle 画长方形 Ellipse 以长方形为界,画一个椭圆 Polygon 以数组中点为顶点,画一个 多边形 (d).文本输出 文本输出包含两部分工作,分别用两组函数实现。 设置文本特性 如字体,颜色,对齐方式等输出文本 SetTextColor GetTextColor 控制输输出文本的颜颜色 SetBkMode GetBkMode 控制文本是否透明显显示,如果是不透明方式 ,文本周围围用背景色填充 SetBkColor GetBkColor 控制文本背景颜颜色,当文本是不透明显显示 时时才填充背景 SetTextAlign GetTextAlign 控制对齐对齐 方式 TextOut用当前选选定的字体、颜颜色和对齐对齐 方式,在 参数指定位置显显示字符串 DrawText在一个指定矩形区域内显显示格式化字符串 3.使用GDI对象 GDI对象类CGdiObject派生CObject,是画笔、画刷、字体、 位图等GDI对象的基类,其派生类封装了各种绘图工具。 GDI对对象用途默认值认值 Cpen画笔类类,画直线线、曲线线和各种图图形边边框 ,可改变颜变颜 色,线线型,线宽线宽 黑实线实线 ,宽宽一个 像素 CBrush画刷类类,填充各种图图形的内部,可改变变 颜颜色和填充图图案 白色画刷 CFont字体类类,改变变字体的属性系统统字体 CBitmap位图类图类 ,嵌入或操作位图图无 CRgn区域类类,操作由椭圆椭圆 或矩形组组合的各种 区域,常与CDC的剪切函数配合使用 无 CPalette调调色板类类,封装了Windows调调色板,允 许创许创 建调调色板对对象,修改其属性 无 a)GDI对象的构造 调用GDI类的构造函数产生一个GDI对象 CPen pen1(PS_SOLID,0,RGB(0,255,0); 或: CPen pen1; pen1.CreatePen(PS_SOLID,0,RGB(255,0,0); b)CDC与GDI对象 应用程序本身不需要构造GDI对象,程序中构造一个CDC 对象后,系统为其提供了默认的属性和默认的GDI对象, 但CDC封装了对GDI操作的成员函数,可以修改相关属性 ,如SetTextColor();也可选择自定义的GDI对象。 Windows预定义了标准GDI对象,供系统和程序使用,称 为备用GDI对象,可为多个程序同时使用。备用对象包括 最常用的字体、画笔、画刷等,用函数 CDC: SelectStockObject选择备用对象,并返回原值。 CPen pen1; /自定义画笔 pen1.CreatePen(PS_SOLID,0,RGB(255,0,0); CPen *poldPen = pDC-SelectObject( /选择新画笔,返回并保存原值CBrush *poldBrush = pDC- SelectStockObject (NULL_BRUSH); /选择备用空画刷 CRect rect1(0,0,400,400); /定义矩形 pDC-Rectangle( /画出空心矩形 pDC-SelectObject(poldBrush); /恢复原值 表3.15备用GDI对象 GDI对象预定义值 字体ANSI_FIXED_FONT ANSI_VAR_FONT DEVICE_DEFAULT_FONT OEM_FIXED_FONT SY

温馨提示

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

评论

0/150

提交评论