MFC程序设计一个优秀的编程工具往往匹配一个功能强大的类库,类库封装了大量Windows编程需要使用的函数和数据结构。与VisualC++捆绑在一起的MFC(MicrosoftFoundationClass)微软基础类就是这样一个由Microsoft公司设计的类库。MFC概述类库是一个可以在应用程序中使用的相互关联的C++类的集合。MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。虽然程序在功能上千差万别,但从本质上看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人员不必从头设计一个Windows应用程序。MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。MFC微软基础类利用WindowsAPI开发程序的用户有这样的体会,即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识,需要手工编写冗长的代码。由于程序的出错率是随着代码长度的增加呈几何级数增长的,而且当程序长度逐渐膨胀时,调试程序会变得越来越困难。因此,传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验。因为VisualC++捆绑了微软的基础类MFC,所以编程时我们就可以利用类的可重用性和可扩充性,大大降低Windows应用程序设计的难度和工作量。采用MFC编程的优点:使用标准化的程序代码结构,有利于程序员之间的交流。VisualC++为MFC提供了大量的工具支持,提高了编程效率。如利用MFCAppWizard创建MFC应用程序框架,利用ClassWizard方便地对Windows消息进行管理。MFC应用程序的效率较高,只比传统的WindowsC程序低5%左右。并且,在MFC应用程序中还允许混合使用传统的WindowsAPI函数。其它优势:完全支持Windows所有的函数、控件、消息、菜单及对话框;具有良好的稳定性和可移植性,更符合微软的风格等。采用MFC方式编程提高了Windows应用程序的开发效率,但由于MFC应用程序结构的复杂性和透明性,要想完全掌握MFC应用程序的内部机制需要付出很大的努力。认识MFC只是一个过程、一个手段,最终目的是为了良好并熟练地运用MFC。Windows编程机制Windows是一个多进程的图形窗口操作系统,Windows应用程序与DOS应用程序有很大的区别。DOS应用程序采用顺序执行过程,而Windows是一个基于事件的消息(Message)驱动系统。Windows应用程序是按照“事件→消息→处理”非顺序的机制运行。当有某个事件(如单击鼠标、键盘输入和执行菜单命令等)发生时,Windows会根据具体的事件产生对应的消息,并发送到指定应用程序的消息队列;应用程序从消息队列中取出消息,并根据不同的消息进行不同的处理。事件和消息所谓消息就是用于描述某个事件发生的信息,而事件是对于Windows的某种操作。事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。消息驱动是Windows应用程序的核心,所有的外部响应(如键盘、鼠标和计时器等)都被Windows先拦截,转换成消息后再发送到应用程序中的目标对象,应用程序根据消息的具体内容进行处理。消息不仅可由Windows发出,它也可由应用程序本身或其它程序产生。Windows为每一个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列。几种常见的系统消息鼠标输入WM_MOUSEMOVE鼠标移动WM_LBUTTONDOWN鼠标左键按下WM_LBUTTONUP鼠标左键释放键盘输入WM_KEYDOWN键按下WM_KEYUP键释放WM_CHAR字符键入重画消息WM_PAINT重画窗口用户区鼠标消息处理CWnd的鼠标消息响应函数afx_msgvoidOnLButtonDown(UINTflg,CPointpt);afx_msgvoidOnMouseMove(UINTflg,CPointpt);……•flg虚拟键标志;pt鼠标的屏幕坐标鼠标的消息入口ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()……鼠标消息以外其他消息的处理也类似。键盘输入处理CWnd的键盘输入消息响应函数•afx_msgOnKeyDown(UINTch,UINTrep,UINTflg);•afx_msgOnChar(...);•afx_msgOnKeyUp(...);•……•ch字符的ASCII值,rep重复次数,flg虚拟键键盘输入消息入口•ON_WM_KEYDOWN()•ON_WM_CHAR()•ON_WM_KEYUP()MFC对象的使用定义方法:1.定义MFC派生类、定义其属性和成员函数构造方法:1.构造MFC类对象或其派生类对象2.或调用其Create函数,创建Windows对象通信方法:1.调用MFC对象的成员函数2.响应来自其他对象的消息传递3.向其他对象发送消息发送资源编辑资源文件(就是以应用程序名和扩展名是.rc的文件)很大程度上决定了应用程序的用户界面。在VC++中资源文件包括以下内容:资源种类对话框模板DIALOG菜单模板MENU图标ICON光标CURSOR位图BITMAP加速键表ACCELERATORS字符串表STRINGTABLE工具条模板TOOLBAR以上信息都在.rc文件中包含,同时.rc文件还包含了以下语句:#includeafxres.h#includeafxres.rc它们的作用是把适合于所有应用程序的一些通用MFC库资源包含进来。VC的资源编辑器新建•Insert--Resouce--选择资源修改•直接双点指定资源的图标编辑•不同资源采用不同编辑器程序识别方法•资源标识符(整数)菜单模板的编辑结构描述•菜单菜单标识符MENU•子菜单项POPUP“字体(&F)”•菜单项MENUITEM“宋体\tCtrl-S”标识符指定菜单标识符IDR_MAINMENU选择菜单项•双点进入属性编辑•编写显示文本等属性•指定菜单项标识符ID_FONT_SONGTI对话框模板的编辑编辑窗•显示对话框和控制框工具条编辑•指定对话框标识符和属性•选择控制框,拖入对话框•双点控制框,进入属性编辑•编辑属性,指定控制框标识符对话框编程支持SDK的支持(API):•使用特殊的窗口函数(指定对话框模板)•系统提供窗口类MFC的支持:voidCMainWnd::OnHelpAbout(){CDialogCAboutdlog(IDD_MYDIALOG,this);//创建对话框对象CAboutdlog.DoModal();//启动对话}对话框的消息响应定义CDialog派生类CMyDialog•各种消息响应函数•OnInitDialog对话框初始化•OnOK确认按钮•OnCancel取消按钮获得控制框对象(界面元素)•CDialog::GetDlgItem(控制框标识符)•在ClassWizard中设定窗口的分类用户界面元素的容器•各种对话框(CDialog派生类)•各种视窗(CView派生类)•产生窗口状态变化消息用户界面的基本元素•各种控制框(CControl的派生类)•向上级窗口发送通知消息控制框的使用六种主要的控制框按钮框(包括单选钮、复选钮、分组框)静态框(文本显示)编辑框(单行、多行编辑)列表框(单选、复选)滚动条框(水平、垂直)组合框(可编辑、不可编辑)MFC支持CButtonCStaticCEditCListBoxCScrollBarCComboBox两种使用方法作为子窗口•控制框对象作为上级窗口类的成员变量动态生成•在OnCreate中调用该对象的Create、指定风格与属性作为对话框元素•在对话框模板中定义控制框、描述其风格与属性自动生成•随对话框生成数据传输的控制(Dialog类)DoModalOnInitDialogOnOKUpdateDataDoDataExchage自动调用程序中直接调用CDialog类与对话过程函数调用CDialog类是CWnd类的继承类,所以他继承了CWnd的基本功能,如移动窗口、改变窗口大小、关闭窗口。CDialog类通过对话框的一些特定的特性扩展了基本功能。这些特性包括生成和现实对话框的功能、遍历对话框的控件、设置和恢复默认按钮等。CDialog类的四个基本函数(1)OnInitDialog函数是虚函数,响应WM_INITDIALOG消息(在Create()函数或DoModal函数调用期间系统发送此消息)。原型:DvirtualBOOLCDialog::OnInitDialog()(2)DoModal()函数用于激活模式对话框,完成后返回对话框结果。VirtualintCDialog::DoModal()(3)OnOK()函数也是虚函数,用户单击OK按钮时调用,如果对话框存在数据交换和验证,将默认实现验证对话框数据,并更新相应变量。(无模式对话框只有重载该函数并调用DestroyWindows()函数才能实现OK按钮功呢。)(4)OnCancel函数用户调用Cancel按钮或ESC键时调用。模式对话框将自动终止。DoModal()函数返回IDCANCEL。同理无模式对话框也要重载。文档视图设计文档视图结构文档视图结构是在VC中使用MFC开发基于文档的应用程序的基本框架。在这个框架中,数据的维护及显示分别由两个不同但又彼此紧密相关的类——文档类和视图类负责。MFC文档/视图结构数据处理工作分工:分为数据的管理和显示文档用于管理和维护数据视图用来显示和编辑数据MFC通过其文档类和视图类提供了大量有关数据处理的方法。什么是文档?文档的概念在MFC应用程序中的适用范围很广,一般说来,文档是能够被逻辑地组合的一系列数据,包括文本、图形、图象和表格数据。一个文档代表了用户存储或打开的一个文件单位。文档的主要作用是把对数据的处理从对用户界面的处理中分离出来,集中处理数据,同时提供了一个与其它类交互的接口。什么是视图?视图是文档在屏幕上的一个映像,它就像一个观景器,用户通过视图看到文档,也是通过视图来改变文档,视图充当了文档与用户之间的媒介物。应用程序通过视图向用户显示文档中的数据,并把用户的输入解释为对文档的操作。一个视图总是与一个文档对象相关联,用户通过与文档相关联的视图与文档进行交互。当用户打开一个文档时,应用程序就会创建一个与之相关联的视图。视图和文档的功能:视图负责显示和编辑文档数据,但不负责存储。用户对数据的编辑需要依靠窗口上的鼠标与键盘操作才得以完成,这些消息都是由视图类接收后进行处理或通知文档类,如收到窗口刷新消息时调用视图类的成员函数OnDraw()显示文档内容。视图还可在打印机上输出。文档负责数据的读写操作,数据通常被保存在文档类的成员变量中,文档类通过一个称为序列化的成员函数将成员变量的数据保存到磁盘文件中。MFC应用程序为数据的序列化提供了默认支持。文档、视图、框架窗口之间的关系一个视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档对外显示的窗口,但它并不能完全独立,它必须依存在一个框架窗口内。一个视图只能拥有一个文档,但一个文档可以同时拥有多个视图。视图是文档在屏幕上的一个映像,它就像一个观景器文档/视图结构的优点:把数据处理类从用户界面处理类中分离出来,使得每一个类都能集中地执行一项工作。把Windows程序通常要做的工作分成若干定义好的类,这样有助于应用程序的模块化,程序也易于扩展,编程时只需修改所涉及的类。虽然文档/视图结构牵涉到许多类,其中的也关系比较复杂,但MFCAppWizard向导建立的MFC应用程序框架已经把程序的主要结构完成了,模块间的消息传递以及各函数的功能都