MFC编程讲座[1].ppt
MFC程序设计 一一个个优优秀秀的的编编程程工工具具往往往往匹匹配配一一个个功功能能 强强 大大 的的 类类 库库,类类 库库 封封 装装 了了 大大 量量Windows编编程程需需要要使使用用的的函函数数和和数数据据结结构构。与与 Visual C+捆捆 绑绑 在在 一一 起起 的的MFC(Microsoft Foundation Class)微微 软软 基基 础础 类类 就就 是是 这这 样样 一一 个个 由由Microsoft公司设计的类库。公司设计的类库。MFC概述概述n n 类类库库是是一一个个可可以以在在应应用用程程序序中中使使用用的的相相互互关关联联的的C+类类的的集集合合。MFC作作为为一一个个Windows编编程程类类库库,它它包包含含了了200多多个个类类,封封装装了了Windows的的大大部部分分编编程程对对象象以及与它们有关的操作。以及与它们有关的操作。n n n n 虽虽虽虽然然然然程程程程序序序序在在在在功功功功能能能能上上上上千千千千差差差差万万万万别别别别,但但但但从从从从本本本本质质质质上上上上看看看看,都都都都可可可可以以以以分分分分为为为为用用用用户户户户界界界界面面面面设设设设计计计计、文文文文件件件件操操操操作作作作、数数数数据据据据库库库库访访访访问问问问及及及及多多多多媒媒媒媒体体体体使使使使用用用用等等等等几几几几部部部部分分分分,这这这这些些些些都都都都可可可可以以以以通通通通过过过过一一一一些些些些类类类类来来来来实实实实现现现现。MFCMFC提提提提供供供供了了了了一一一一个个个个标标标标准准准准化化化化的的的的程程程程序序序序结结结结构构构构,使使使使开开开开发发发发人人人人员员员员不不不不必必必必从从从从头头头头设设设设计计计计一一一一个个个个WindowsWindows应应应应用用用用程程程程序。序。序。序。n n MFCMFC实实实实际际际际上上上上是是是是一一一一个个个个庞庞庞庞大大大大的的的的文文文文件件件件库库库库,它它它它由由由由几几几几百个执行文件和源代码文件(如百个执行文件和源代码文件(如百个执行文件和源代码文件(如百个执行文件和源代码文件(如HH文件)组成。文件)组成。文件)组成。文件)组成。MFC微软基础类微软基础类 利利利利用用用用Windows Windows APIAPI开开开开发发发发程程程程序序序序的的的的用用用用户户户户有有有有这这这这样样样样的的的的体体体体会会会会,即即即即使使使使开开开开发发发发一一一一个个个个简简简简单单单单的的的的WindowsWindows应应应应用用用用程程程程序序序序也也也也需需需需要要要要对对对对WindowsWindows的的的的编编编编程程程程原原原原理理理理有有有有很很很很深深深深刻刻刻刻的的的的认认认认识识识识,需需需需要要要要手手手手工工工工编编编编写写写写冗冗冗冗长长长长的的的的代代代代码码码码。由由由由于于于于程程程程序序序序的的的的出出出出错错错错率率率率是是是是随随随随着着着着代代代代码码码码长长长长度度度度的的的的增增增增加加加加呈呈呈呈几几几几何何何何级级级级数数数数增增增增长长长长的的的的,而而而而且且且且当当当当程程程程序序序序长长长长度度度度逐逐逐逐渐渐渐渐膨膨膨膨胀胀胀胀时时时时,调调调调试试试试程程程程序序序序会会会会变变变变得得得得越越越越来来来来越越越越困困困困难难难难。因因因因此此此此,传传传传统统统统的的的的WindowsWindows应应应应用用用用程程程程序序序序设设设设计需要程序员有极大的耐心和丰富的编程经验。计需要程序员有极大的耐心和丰富的编程经验。计需要程序员有极大的耐心和丰富的编程经验。计需要程序员有极大的耐心和丰富的编程经验。因因因因为为为为Visual Visual C+C+捆捆捆捆绑绑绑绑了了了了微微微微软软软软的的的的基基基基础础础础类类类类MFCMFC,所所所所以以以以编编编编程程程程时时时时我我我我们们们们就就就就可可可可以以以以利利利利用用用用类类类类的的的的可可可可重重重重用用用用性性性性和和和和可可可可扩扩扩扩充充充充性性性性,大大大大大大大大降降降降低低低低WindowsWindows应应应应用用用用程程程程序序序序设设设设计计计计的的的的难难难难度和工作量。度和工作量。度和工作量。度和工作量。采用采用MFC编程的优点:编程的优点:n n 使使用用标标准准化化的的程程序序代代码码结结构构,有有利利于于程序员之间的交流。程序员之间的交流。n n Visual C+为为MFC提提供供了了大大量量的的工工具具支支持持,提提高高了了编编程程效效率率。如如利利用用MFC AppWizard创创建建MFC应应用用程程序序框框架架,利利用用ClassWizard方方便便地地对对Windows消消息进行管理。息进行管理。n n MFC应应用用程程序序的的效效率率较较高高,只只比比传传统统的的Windows C程程序序低低5%左左右右。并并且且,在在MFC应应用用程程序序中中还还允允许许混混合合使使用用传传统统的的Windows API函数。函数。n n 其其它它优优势势:完完全全支支持持Windows所所有有的的函函数数、控控件件、消消息息、菜菜单单及及对对话话框框;具具有有良良好好的的稳稳定定性性和和可可移移植植性性,更更符符合合微微软软的风格等。的风格等。采采用用MFC方方式式编编程程提提高高了了Windows应应用用程程序序的的开开发发效效率率,但但由由于于MFC应应用用程程序序结结构构的的复复杂杂性性和和透透明明性性,要要想想完完全全掌掌握握MFC应应用用程程序序的的内内部部机机制制需需要要付付出出很很大大的的努力。努力。认认识识MFC只只是是一一个个过过程程、一一个个手手段段,最终目的是为了良好并熟练地运用最终目的是为了良好并熟练地运用MFC。Windows编程机制编程机制n n Windows是是一一个个多多进进程程的的图图形形窗窗口口操操作作系系统统,Windows应应用用程程序序与与DOS应应用用程程序序有有很很大大的的区区别别。DOS应应用用程程序序采采用用顺顺序序执执行行过过程程,而而Windows是是一一个个基基于于事件的消息(事件的消息(Message)驱动系统。驱动系统。n n Windows应应用用程程序序是是按按照照“事事件件消消息息处处理理”非非顺顺序序的的机机制制运运行行。当当有有某某个个事事件件(如如单单击击鼠鼠标标、键键盘盘输输入入和和执执行行菜菜单单命命令令等等)发发生生时时,Windows会会根根据据具具体体的的事事件件产产生生对对应应的的消消息息,并并发发送送到到指指定定应应用用程程序序的的消消息息队队列列;应应用用程程序序从从消消息息队队列列中中取取出出消消息息,并并根根据据不不同同的的消消息息进进行行不不同的处理。同的处理。事件和事件和消息消息n n 所所谓谓消消息息就就是是用用于于描描述述某某个个事事件件发发生生的的信信息息,而而事事件件是是对对于于Windows的的某某种种操作。操作。n n 事事件件和和消消息息密密切切相相关关,事事件件是是因因,消消息息是是果果,事事件件产产生生消消息息,消消息息对对应应事事件件。所谓消息的响应,其实质就是事件的响应。所谓消息的响应,其实质就是事件的响应。n n n n 消消息息驱驱动动是是Windows应应用用程程序序的的核核心心,所所有有的的外外部部响响应应(如如键键盘盘、鼠鼠标标和和计计时时器器等等)都都被被Windows先先拦拦截截,转转换换成成消消息息后后再再发发送送到到应应用用程程序序中中的的目目标标对对象象,应用程序根据消息的具体内容进行处理。应用程序根据消息的具体内容进行处理。n n 消消息息不不仅仅可可由由Windows发发出出,它它也也可可 由由 应应 用用 程程 序序 本本 身身 或或 其其 它它 程程 序序 产产 生生。Windows为为每每一一个个应应用用程程序序都都维维护护一一个个或或多多个个消消息息队队列列,发发送送到到每每个个程程序序窗窗口口的的消息都排成一个队列。消息都排成一个队列。几种常见的系统消息几种常见的系统消息n n鼠标输入鼠标输入鼠标输入鼠标输入WM_MOUSEMOVEWM_MOUSEMOVE鼠标移动鼠标移动鼠标移动鼠标移动WM_LBUTTONDOWNWM_LBUTTONDOWN鼠标左键按下鼠标左键按下鼠标左键按下鼠标左键按下WM_LBUTTONUPWM_LBUTTONUP鼠标左键释放鼠标左键释放鼠标左键释放鼠标左键释放n n键盘输入键盘输入WM_KEYDOWN WM_KEYDOWN 键按下键按下键按下键按下WM_KEYUPWM_KEYUP键释放键释放键释放键释放WM_CHAR WM_CHAR 字符键入字符键入字符键入字符键入n n重画消息重画消息WM_PAINT WM_PAINT 重画窗口用户区重画窗口用户区重画窗口用户区重画窗口用户区鼠标消息处理鼠标消息处理n nCWndCWnd 的鼠标消息响应函数的鼠标消息响应函数的鼠标消息响应函数的鼠标消息响应函数afx_msgafx_msg void void OnLButtonDownOnLButtonDown(UINT(UINT flgflg,CPointCPoint pt);pt);afx_msgafx_msg void void OnMouseMoveOnMouseMove(UINT(UINT flgflg,CPointCPoint pt);pt);flgflg 虚拟键标志;虚拟键标志;虚拟键标志;虚拟键标志;pt pt 鼠标的屏幕坐标鼠标的屏幕坐标鼠标的屏幕坐标鼠标的屏幕坐标 n n鼠标的消息入口鼠标的消息入口鼠标的消息入口鼠标的消息入口ON_WM_LBUTTONDOWN()ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_MOUSEMOVE()n n鼠标消息以外其他消息的处理也类似。鼠标消息以外其他消息的处理也类似。键盘输入处理键盘输入处理n nCWndCWnd 的键盘输入消息响应函数的键盘输入消息响应函数的键盘输入消息响应函数的键盘输入消息响应函数afx_msgafx_msg OnKeyDownOnKeyDown(UINT(UINT chch,UINT rep,UINT,UINT rep,UINT flgflg ););afx_msgafx_msg OnCharOnChar(.);(.);afx_msgafx_msg OnKeyUpOnKeyUp(.);(.);chch 字符的字符的字符的字符的ASCIIASCII值,值,值,值,rep rep 重复次数,重复次数,重复次数,重复次数,flgflg 虚拟键虚拟键虚拟键虚拟键n n键盘输入消息入口键盘输入消息入口键盘输入消息入口键盘输入消息入口ON_WM_KEYDOWN()ON_WM_KEYDOWN()ON_WM_CHAR()ON_WM_CHAR()ON_WM_KEYUP()ON_WM_KEYUP()MFC 对象的使用对象的使用n n定义方法:定义方法:定义方法:定义方法:1.1.定义定义定义定义 MFC MFC 派生类、定义其属性和成员函数派生类、定义其属性和成员函数派生类、定义其属性和成员函数派生类、定义其属性和成员函数n n构造方法:构造方法:构造方法:构造方法:1.1.构造构造构造构造 MFC MFC 类对象或其派生类对象类对象或其派生类对象类对象或其派生类对象类对象或其派生类对象2.2.或调用其或调用其或调用其或调用其 Create Create 函数,创建函数,创建函数,创建函数,创建 Windows Windows 对象对象对象对象n n通信方法:通信方法:通信方法:通信方法:1.1.调用调用调用调用 MFC MFC 对象的成员函数对象的成员函数对象的成员函数对象的成员函数2.2.响应来自其他对象的消息传递响应来自其他对象的消息传递响应来自其他对象的消息传递响应来自其他对象的消息传递3.3.向其他对象发送消息发送向其他对象发送消息发送向其他对象发送消息发送向其他对象发送消息发送资源编辑资源编辑n n资源文件(就是以应用程序名和扩展名是.rc的文件)很大程度上决定了应用程序的用户界面。在VC+中资源文件包括以下内容:资源种类资源种类对话框模板对话框模板对话框模板对话框模板DIALOGDIALOG菜单模板菜单模板菜单模板菜单模板MENUMENU图标图标图标图标ICONICON光标光标光标光标CURSORCURSOR位图位图位图位图BITMAPBITMAP加速键表加速键表加速键表加速键表ACCELERATORSACCELERATORS字符串表字符串表字符串表字符串表STRINGTABLESTRINGTABLE工具条模板工具条模板工具条模板工具条模板TOOLBARTOOLBARn n以上信息都在.rc文件中包含,同时.rc文件还包含了以下语句:n n#include afxres.hn n#include afxres.rcn n它们的作用是把适合于所有应用程序的一些通用MFC库资源包含进来。VC 的资源编辑器的资源编辑器n n新建新建Insert -Insert -ResouceResouce -选择资源选择资源选择资源选择资源n n修改修改直接双点指定资源的图标直接双点指定资源的图标直接双点指定资源的图标直接双点指定资源的图标n n编辑编辑不同资源采用不同编辑器不同资源采用不同编辑器不同资源采用不同编辑器不同资源采用不同编辑器n n程序识别方法程序识别方法资源标识符(整数)资源标识符(整数)资源标识符(整数)资源标识符(整数)菜单模板的编辑菜单模板的编辑n n结构描述结构描述结构描述结构描述菜单菜单菜单菜单菜单标识符菜单标识符菜单标识符菜单标识符 MENUMENU子菜单项子菜单项子菜单项子菜单项POPUP “POPUP “字体字体字体字体(&F)”(&F)”菜单项菜单项菜单项菜单项MENUITEM “MENUITEM “宋体宋体宋体宋体 tCtrltCtrl-S”-S”标识标识标识标识符符符符n n指定指定指定指定菜单标识符菜单标识符菜单标识符菜单标识符IDR_MAINMENUIDR_MAINMENUn n选择菜单项选择菜单项选择菜单项选择菜单项双点进入属性编辑双点进入属性编辑双点进入属性编辑双点进入属性编辑编写显示文本等属性编写显示文本等属性编写显示文本等属性编写显示文本等属性指定指定指定指定菜单项标识符菜单项标识符菜单项标识符菜单项标识符ID_FONT_SONGTIID_FONT_SONGTI对话框模板的编辑对话框模板的编辑n n编辑窗编辑窗显示对话框和控制框工具条显示对话框和控制框工具条n n编辑编辑指定指定对话框标识符对话框标识符和属性和属性选择控制框,拖入对话框选择控制框,拖入对话框双点控制框,进入属性编辑双点控制框,进入属性编辑编辑属性,指定编辑属性,指定控制框标识符控制框标识符对话框对话框编程支持编程支持n nSDK 的支持的支持(API):使用特殊的窗口函数(指定对话框模板)使用特殊的窗口函数(指定对话框模板)系统提供窗口类系统提供窗口类n nMFC 的支持:的支持:void CMainWnd:OnHelpAbout()CDialog CAboutdlog(IDD_MYDIALOG,this);/创建对话框对象创建对话框对象CAboutdlog.DoModal();/启动对话启动对话对话框的消息响应对话框的消息响应n n定义定义 CDialog 派生类派生类 CMyDialog各种消息响应函数各种消息响应函数OnInitDialog对话框初始化对话框初始化OnOK确认按钮确认按钮OnCancel取消按钮取消按钮n n获得控制框对象(界面元素)获得控制框对象(界面元素)CDialog:GetDlgItem(控制框标识控制框标识符符)在在 ClassWizard 中设定中设定窗口的分类窗口的分类n n用户界面元素的容器用户界面元素的容器各种对话框(各种对话框(CDialog 派生类)派生类)各种视窗(各种视窗(CView 派生类派生类)产生窗口状态变化消息产生窗口状态变化消息n n用户界面的基本元素用户界面的基本元素各种控制框(各种控制框(CControl 的派生类)的派生类)向上级窗口发送通知消息向上级窗口发送通知消息控制框的使用控制框的使用n n六种主要的控制框六种主要的控制框按钮框(包括单选钮、复选钮、按钮框(包括单选钮、复选钮、分组框)分组框)静态框(文本显示)静态框(文本显示)编辑框(单行、多行编辑)编辑框(单行、多行编辑)列表框(单选、复选)列表框(单选、复选)滚动条框(水平、垂直)滚动条框(水平、垂直)组合框(可编辑、不可编辑)组合框(可编辑、不可编辑)n nMFC MFC 支持支持支持支持CButtonCButtonCStaticCStaticCEditCEditCListBoxCListBoxCScrollBarCScrollBarCComboBoCComboBox x两种使用方法两种使用方法n n作为子窗口作为子窗口作为子窗口作为子窗口控制框对象作为上控制框对象作为上控制框对象作为上控制框对象作为上级窗口级窗口级窗口级窗口类的成员变类的成员变类的成员变类的成员变量量量量n n动态生成动态生成动态生成动态生成在在在在 OnCreateOnCreate 中中中中调用该对象的调用该对象的调用该对象的调用该对象的 CreateCreate、指定风格、指定风格、指定风格、指定风格与属性与属性与属性与属性n n作为对话框元素作为对话框元素作为对话框元素作为对话框元素在对话框模板中定在对话框模板中定在对话框模板中定在对话框模板中定义控制框、描述其义控制框、描述其义控制框、描述其义控制框、描述其风格与属性风格与属性风格与属性风格与属性n n自动生成自动生成自动生成自动生成随对话框生成随对话框生成随对话框生成随对话框生成数据传输的控制数据传输的控制(Dialog类)类)DoModalOnInitDialogOnOKUpdateDataDoDataExchage自动调用自动调用程序中直接调用程序中直接调用CDialog类与对话过程函数调用n nCDialog类是CWnd类的继承类,所以他继承了CWnd的基本功能,如移动窗口、改变窗口大小、关闭窗口。CDialog类通过对话框的一些特定的特性扩展了基本功能。这些特性包括生成和现实对话框的功能、遍历对话框的控件、设置和恢复默认按钮等。CDialog类的四个基本函数n n()OnInitDialog函数n n是虚函数,响应WM_INITDIALOG消息(在Create()函数或DoModal函数调用期间系统发送此消息)。n n原型:Dvirtual BOOL CDialog:OnInitDialog()n n()DoModal()函数n n用于激活模式对话框,完成后返回对话框结果。Virtual int CDialog:DoModal()n n()OnOK()函数也是虚函数,用户单击按钮时调用,如果对话框存在数据交换和验证,将默认实现验证对话框数据,并更新相应变量。(无模式对话框只有重载该函数并调用DestroyWindows()函数才能实现按钮功呢。)(4)OnCancel函数用户调用Cancel按钮或键时调用。n n模式对话框将自动终止。DoModal()函数返回IDCANCEL。同理无模式对话框也要重载。文档视图设计n n文档视图结构n n 文档视图结构是在VC中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的类文档类和视图类负责。MFC文档文档/视图结构视图结构数据处理数据处理工作分工:工作分工:n n 分为数据的管理和显示n n 文档文档用于管理和维护数据n n 视图视图用来显示和编辑数据 MFC通过其文档类和视图类提供了大量有关数据处理的方法。什么是文档?什么是文档?文文文文档档档档的的概概念念在在MFCMFC应应用用程程序序中中的的适适用用范范围围很很广广,一一般般说说来来,文文文文档档档档是是能能够够被被逻逻辑辑地地组组合合的的一一系系列数据,包括文本、图形、图象和表格数据。列数据,包括文本、图形、图象和表格数据。一一个个文文文文档档档档代代表表了了用用户户存存储储或或打打开开的的一一个个文文件件单单位位。文文档档的的主主要要作作用用是是把把对对数数据据的的处处理理从从对对用用户户界界面面的的处处理理中中分分离离出出来来,集集中中处处理理数数据据,同同时时提供了一个与其它类交互的接口。提供了一个与其它类交互的接口。什么是视图?什么是视图?视视视视图图图图是是文文文文档档档档在在屏屏幕幕上上的的一一个个映映像像,它它就就像像一一个个观观景景器器,用用户户通通过过视视图图看看到到文文档档,也也是是通通过过视视图图来来改改变变文文档档,视视图图充当了文档与用户之间的媒介物。充当了文档与用户之间的媒介物。应应用用程程序序通通过过视视视视图图图图向向用用户户显显示示文文档档中中的的数数据据,并并把把用用户的输入解释为对文档的操作。户的输入解释为对文档的操作。一一个个视视视视图图图图总总是是与与一一个个文文档档对对象象相相关关联联,用用户户通通过过与与文文档档相相关关联联的的视视图图与与文文档档进进行行交交互互。当当用用户户打打开开一一个个文文档档时时,应用程序就会创建一个与之相关联的视图。应用程序就会创建一个与之相关联的视图。视图和文档的功能:视图和文档的功能:n n视视视视图图图图负负责责显显示示和和编编辑辑文文档档数数据据,但但不不负负责责存存储储。用用户户对对数数据据的的编编辑辑需需要要依依靠靠窗窗口口上上的的鼠鼠标标与与键键盘盘操操作作才才得得以以完完成成,这这些些消消息息都都是是由由视视图图类类接接收收后后进进行行处处理理或或通通知知文文档档类类,如如收收到到窗窗口口刷刷新新消消息息时时调用视图类的成员函数调用视图类的成员函数OnDrawOnDraw()()显示文档内容。显示文档内容。n n视图视图视图视图还可在打印机上输出。还可在打印机上输出。n n文文文文档档档档负负责责数数据据的的读读写写操操作作,数数据据通通常常被被保保存存在在文文档档类类的的成成员员变变量量中中,文文档档类类通通过过一一个个称称为为序序列列化化的的成成员员函函数数将将成成员员变变量量的的数数据据保保存存到到磁磁盘盘文文件件中中。MFCMFC应用程序为数据的序列化提供了默认支持。应用程序为数据的序列化提供了默认支持。文档、视图、框架窗口之间的关系文档、视图、框架窗口之间的关系n一个视图视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档文档对外显示的窗口,但它并不能完全独立,它必须依存在一个框架窗口框架窗口内。n一个视图只能拥有一个文档,但一个文档可以同时拥有多个视图。视图是文档在屏幕上的一个映像,它就像一个观景器文档文档/视图结构的优点:视图结构的优点:n n把把数数据据处处理理类类从从用用户户界界面面处处理理类类中中分分离离出出来来,使使得得每每一一个个类都能集中地执行一项工作。类都能集中地执行一项工作。n n把把WindowsWindows程程序序通通常常要要做做的的工工作作分分成成若若干干定定义义好好的的类类,这这样样有有助助于于应应用用程程序序的的模模块块化化,程程序序也也易易于于扩扩展展,编编程程时时只需修改所涉及的类。只需修改所涉及的类。n n虽虽然然文文档档/视视图图结结构构牵牵涉涉到到许许多多类类,其其中中的的也也关关系系比比较较复复杂杂,但但MFC MFC AppWizardAppWizard向向导导建建立立的的MFCMFC应应用用程程序序框框架架已已经经把把程程序序的的主主要要结结构构完完成成了了,模模块块间间的的消消息息传传递递以以及及各各函函数的功能都已确定。数的功能都已确定。n nMFCMFC应应用用程程序序框框架架起起到到了了穿穿针针引引线线的的作作用用,按按照照消消息息处处理理函函数数功功能能的的不不同同,将将不不同同消消息息的的响响应应分分别别分分布布在在文文档档类类和和视图类中。视图类中。文档和视图类常用的成员函数文档和视图类常用的成员函数1 1视图类的成员函数视图类的成员函数GetDocumentGetDocument()()一一个个视视图图对对象象只只有有一一个个与与之之相相关关联联的的文文档档对对象象。在在MFCMFC应应用用程程序序中中,视视图图对对象象通通过过调调用用成成员员函函 数数 函函 数数 GetDocumentGetDocument()()得得 到到 当当 前前 文文 档档。GetDocumentGetDocument()()是是视视图图类类的的成成员员函函数数,调调用用它它可可以以返返回回与与视视图图相相关关联联的的文文档档对对象象的的指指针针,利利用用这这个个指指针针可可以以访访问文档类及其派生类的公有成员。问文档类及其派生类的公有成员。2CDocument类的成员函数UpdateAllViews()一一个个文文档档对对象象可可以以有有多多个个与与之之相相关关联联的的视视图图对对象象,当当一一个个文文档档的的数数据据通通过过某某个个视视图图被被修修改改后后,与与它它关关联联的的每每一一个个视视图图都都必必须须反反映映出出这这些些修修改改。因因此此,视视图图在在需需要要时时必必须须进进行行重重绘绘,即即当当文文档档数数据据发发生生改改变变时时,必必须须通通知知到到所所有有相相关关联联的的视视图图对对象象,以以便更新所显示的数据。便更新所显示的数据。3视图类的成员函数OnUpdate()n n当程序调用当程序调用CDocument:UpdateAllViewsCDocument:UpdateAllViews()()函函数时,实际上是调用了所有相关视图的数时,实际上是调用了所有相关视图的OnUpdateOnUpdate()()函数,以更新相关的视图。需要时,可以直接函数,以更新相关的视图。需要时,可以直接在视图派生类的成员函数中调用该函数刷新当前在视图派生类的成员函数中调用该函数刷新当前视图。视图。在OnUpdate()中通过调用函数CWnd:Invalidate()刷新整个客户区,我们也可以在自己的CWnd派生类中直接调用函数Invalidate()。:刷新视图时默认的函数调用过程:刷新视图时默认的函数调用过程:CDocument:UpdateAllViewsCDocument:UpdateAllViews()()CView:OnUpdateCView:OnUpdate()()CWnd:InvalidateCWnd:Invalidate()()OnPaintOnPaint()()OnDrawOnDraw()()多文档多文档n nMFCMFC基基于于文文档档/视视图图结结构构的的应应用用程程序序分分为为单单文文档档和和多多文文档档两两种种类类型型,一一个个多多多多文文文文档档档档应应用用程程序序有有一一个个主主窗窗口口,但但在在主主窗窗口口中中可可以以同同时时打打开开多多个个子子窗窗口口,每一个子窗口对应一个不同的文档。每一个子窗口对应一个不同的文档。n n利利用用MFC MFC AppWizardexeAppWizardexe 向向导导可可以以很很方方便便地地建建立立 一一 个个 多多 文文 档档 应应 用用 程程 序序,只只 需需 在在 MFC MFC AppWizardAppWizard向向导导第第1 1步步选选择择Multiple Multiple documentsdocuments程序类型。程序类型。n nSDISDI和和MDIMDI使使用用不不同同框框架架窗窗口口。SDISDI的的框框架架窗窗口口是是唯唯一一的的主主框框架架窗窗口口,窗窗口口类类是是CMainFrameCMainFrame,由由CFrameWndCFrameWnd派生而来。派生而来。n nMDIMDI的的框框架架窗窗口口分分为为主主框框架架窗窗口口和和子子框框架架窗窗口口,区区别别于于SDISDI,MDIMDI的的主主框框架架窗窗口口不不包包含含视视图图,分分别别由由每每个个子子框框架架窗窗口口包包含含一一个个视视图图。MDIMDI的的主主框框架架窗窗口口类类不不与与某某个个打打开开的的文文档档相相关关联联,而而只只与与子子框架窗口相关联。框架窗口相关联。n nMDIMDI主主框框架架窗窗口口类类CMainFrameCMainFrame由由CMDIFrameWndCMDIFrameWnd派派生生而而来来,而而MDIMDI子子框框架架窗窗口口类类CChildFrameCChildFrame由由CMDIChildWndCMDIChildWnd派生而来。派生而来。图形图形设备接口(GDI)n n设备环境类设备环境类CDCCDC:n nCDCCDC是设备环境类的基类直接由是设备环境类的基类直接由CObjectCObject派派生。是生。是GDIGDI的关键元素,它代表了物理设备。每的关键元素,它代表了物理设备。每一个一个C+C+设备环境对象都有相对应设备环境对象都有相对应WindowsWindows设设备环境,并通过一个备环境,并通过一个3232位类型的位类型的HDCHDC句柄来标识。句柄来标识。CDCCDC类的虚拟性使我们可以很容易的做到编写同类的虚拟性使我们可以很容易的做到编写同时适用于多种设备的代码。例如时适用于多种设备的代码。例如OnDrawOnDraw函数的函数的pDCpDC-TextOut(0,0,Hello);-TextOut(0,0,Hello);既可以适用于显既可以适用于显示器、还可以适用于打印预览和打印,只需要在示器、还可以适用于打印预览和打印,只需要在CView:OnDrawCView:OnDraw函数的函数的pDCpDC参数指向不同的对参数指向不同的对象类。象类。n nCpaintDCCpaintDC是在窗口的是在窗口的OnPaintOnPaint成员函数中使用的成员函数中使用的一种显示上下文。在构造函数中自动调用一种显示上下文。在构造函数中自动调用BeginPaintBeginPaint,析构过程自动调用,析构过程自动调用EndPaintEndPaintn nCClientDCCClientDC和和CWindowDCCWindowDC是显示设备环境类,是显示设备环境类,都是由都是由CDCCDC派生而来,区别在于派生而来,区别在于CClientDCCClientDC是窗是窗口的客户区不包括边框、标题栏和菜单栏,(口的客户区不包括边框、标题栏和菜单栏,(0 0,0 0)指客户区域的左上角。)指客户区域的左上角。CWindowDCCWindowDC的(的(0 0,0 0)指整个屏幕的左上角,这意味着我们可以在显)指整个屏幕的左上角,这意味着我们可以在显示器的任意地方绘图,包括窗口边框、标题栏和示器的任意地方绘图,包括窗口边框、标题栏和菜单栏等等。菜单栏等等。CWindowDCCWindowDC一般应用在框架窗口,一般应用在框架窗口,而不是视图窗口。而不是视图窗口。n nCMetaFileDCCMetaFileDC代表代表WindowsWindows图元文件的设备上图元文件的设备上下文。一个下文。一个windowswindows图元文件包括一系列的图形图元文件包括一系列的图形设备接口命令,可以通过重放这些命令创建图形。设备接口命令,可以通过重放这些命令创建图形。向向CMetaFileDCCMetaFileDC对象进行的各种绘制操作可以被对象进行的各种绘制操作可以被记录到一个图元文件。记录到一个图元文件。n n CDC对象被创建后一定要在合适的时候将它删除掉,如果忘记了删除设备环境对象则会造成内存丢失。如何做才能避免出现这个问题呢,我们应该在堆栈中构造对象。n n看例子看例子n n/*/*n n/void/void CMyView:OnLButtonDown(UINTCMyView:OnLButtonDown(UINT nFlags,CPointnFlags,CPoint point)point)n n n nCRectCRect rectrect;n nCClientDCCClientDC dc(thisdc(this);/);/在堆栈中构造设备环境在堆栈中构造设备环境对象,用一个窗口指针对象,用一个窗口指针thisthis作参数。作参数。n ndc.GetClipBox(rectdc.GetClipBox(rect);/);/GetClipBoxGetClipBox函数是一个函数是一个虚函数,作用是可以获得选定区域的尺寸虚函数,作用是可以获得选定区域的尺寸n n n n/析构函数在函数返回时自动调用,也就完成对析构函数在函数返回时自动调用,也就完成对设备环境对象的删除。设备环境对象的删除。n n另一种写法:另一种写法:n nvoid void CMyView:OnLButtonDown(UINTCMyView:OnLButtonDown(UINT nFlags,CPointnFlags,CPoint point)point)n n n nCRectCRect rectrect;n nCDC*CDC*pDCpDC=GetDCGetDC();/();/通过调用通过调用CWndCWnd的的GetDCGetDC()()函数获得设备环境指针函数获得设备环境指针n npDCpDC-GetClipBox(rectGetClipBox(rect);/);/可以获得选定区域可以获得选定区域的尺寸的尺寸n nReleaseDC(pDCReleaseDC(pDC);/);/一定不能忘记,释放设备一定不能忘记,释放设备环境。环境。GDI对象是通过CGdiObject派生类的C+对象来表示的n nCBrushCBrush是一个是一个GDIGDI的派生类,它在的派生类,它在MFCMFC中的层次中的层次结构是这样的:结构是这样的:CObjectCObject派生派生CGdiObjectCGdiObject派生派生CBrushCBrush,明白了吧。,明白了吧。CGdiObjectCGdiObject是所有是所有GDIGDI对对象的抽象基类。下面列出的是象的抽象基类。下面列出的是GDIGDI派生类的列表:派生类的列表:n nCBitmapCBitmap:位图是一种位矩阵,每一个显示象素:位图是一种位矩阵,每一个显示象素都对应于其中的一个或多个位,可以用来表示图都对应于其中的一个或多个位,可以用来表示图象,也可以用来创建刷子象,也可以用来创建刷子n nCBrushCBrush:刷子定义了一种位图形式的象素,可以:刷子定义了一种位图形式的象素,可以用来对区域内部填充颜色。用来对区域内部填充颜色。n nCFontCFont:字体是一种具有某种风格和尺寸的所有:字体是一种具有某种风格和尺寸的所有字符的完整集合,常常被作为资源,其中一些依字符的完整集合,常常被作为资源,其中一些依赖某种设备。赖某种设备。n nCPaletteCPalette:调色板是一种颜色映射接口,它允许:调色板是一种颜色映射接口,它允许应用程序在不影响其他应用程序的前提下,可以应用程序在不影响其他应用程序的前提下,可以充分利用输出设备的颜色描绘能力。充分利用输出设备的颜色描绘能力。n nCPenCPen:笔是一种用来画线及绘制有形边框的工具,:笔是一种用来画线及绘制有形边框的工具,可以指定它的颜色及宽度,并可以指定画虚线、可以指定它的颜色及宽度,并可以指定画虚线、点线还是实线。点线还是实线。n nCRgnCRgn:区域是由多边形、椭圆二者组合形成的一:区域是由多边形、椭圆二者组合形成的一种范围,可以用来进行填充、裁剪、鼠标点中测种范围,可以用来进行填充、裁剪、鼠标点中测试等等。试等等。n nCGdiObjectCGdiObject类很眼生,看过很多代码就没有看到类很眼生,看过