![[3]c++语言MFC(微软基础类库)【学前必看】第三课_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/17/ae8f8a5a-9735-4ca0-8144-84d415d030a9/ae8f8a5a-9735-4ca0-8144-84d415d030a91.gif)
![[3]c++语言MFC(微软基础类库)【学前必看】第三课_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/17/ae8f8a5a-9735-4ca0-8144-84d415d030a9/ae8f8a5a-9735-4ca0-8144-84d415d030a92.gif)
![[3]c++语言MFC(微软基础类库)【学前必看】第三课_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/17/ae8f8a5a-9735-4ca0-8144-84d415d030a9/ae8f8a5a-9735-4ca0-8144-84d415d030a93.gif)
![[3]c++语言MFC(微软基础类库)【学前必看】第三课_第4页](http://file3.renrendoc.com/fileroot_temp3/2021-12/17/ae8f8a5a-9735-4ca0-8144-84d415d030a9/ae8f8a5a-9735-4ca0-8144-84d415d030a94.gif)
![[3]c++语言MFC(微软基础类库)【学前必看】第三课_第5页](http://file3.renrendoc.com/fileroot_temp3/2021-12/17/ae8f8a5a-9735-4ca0-8144-84d415d030a9/ae8f8a5a-9735-4ca0-8144-84d415d030a95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MFC(微软基础类库)C/C+的图形化界面语言微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C+类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。简单介绍MFC:微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C+开发工具发布。目前最新版本为10.0(截止2011年3月),并且发
2、布了中文版。该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从CObject 直接或间接派生,只有少部分类例外。1 MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizard 自动生成框架Windows 应用程序中,MFC 的主包含文件为Afxwin.h此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。由于它的易用性,初学者常误认为VC+开发必须使用MFC,这种想法是错误的。作为Application Framework,MFC的使用只能提高
3、某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。MFC特点MFC实际上是微软提供的,用于在C+环境下编写应用程序的一个框架和引擎。VC+是Windows下开发人员使用的专业C+ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包。MFC作为与VC+血肉相连的部分(注意C+和VC+的区别:C+是一种程序设计语言,是一种大家都承认的软件编制的通用规范;而VC+只是一个编译器,或者说是一种编译器+源程序编辑器的IDE(IDE的英文全称为“Integrated Development Env
4、ironment”,即“集成开发环境”),WSPlatForm,这跟Pascal和Delphi的关系一个道理。Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系。Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言)。MFC同VC+集成的VCL一样是一个非外挂式的软件包类库,只不过MFC类是微软为VC+专配的1 。MFC是WinAPI与C+的结合。A
5、PI,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC+、Java、Delhpi。编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚
6、变成垃圾。上面说到MFC是微软对API函数的专用C+封装,这种结合一方面让用户使用微软的专业C+ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C+ & MFC编制软件时的大量内节,如应用程序实现消息的处理、设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的。最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一
7、个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建、销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。学习中最应花费时间的是消息和设备环境,对C+和MFC。MFC是微软封装了的API。什么意思呢?Windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用Windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application f
8、ramework的完美结合,它将传统的API进行了分类封装,并且为你创建了程序的一般框架。MFC是对WindowsAPI的封装,大大简化了我们的工作;学VC主要就是要学MFC,大约有100多个类,但常用的也就二三十个。应该象背4级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。MFC关键技术MFCMFC程序的初始化过程建立一个MFC窗口很容易,只用两步:一是从CWinApp派生一个应用程序类(这里是MyApp),然后
9、建立应用程序对象(theApp),就可以产生一个自己需要的窗口(即需要什么样就在InitInstance()里创建就行了)。MFC运行时类型识别(RTTI)运行时类型识别(RTTI)即是程序执行过程中知道某个对象属于某个类,我们平时用C+编程接触的RTTI一般是编译器的RTTI,即是在新版本的VC+编译器里面选用“使能RTTI”,然后载入typeinfo.h文件,就可以使用一个叫typeid()的运算子,它的地位与在C+编程中的sizeof()运算子类似的地方(包含一个头文件,然后就有一个熟悉好用的函数)。typeid()关键的地方是可以接受两个类型的参数:一个是类名称,一个是对象指针。MFC
10、动态创建动态创建就是运行时创建指定类的对象,在MFC中大量使用。如框架窗口对象、视对象,还有文档对象都需要由文档模板类对象来动态的创建。我觉得这是每个MFC的学习者很希望理解的问题。初次接触MFC的时候,很容易有这样的迷惘。MFC的几大类不用我们设计也就罢了,但最疑惑的是不用我们实例化对象。本来最直观的理解就是,我们需要框架的时候,亲手写上CFrameWnd myFrame;需要视的时候,亲自打上CView myView;但MFC不给我们这个机会,致使我们错觉窗口没有实例化就弹出来了!就象画了张电视机的电路图就可以看电视一样令人难以置信。但大伙想了一下,可能会一拍脑门,认为简单不过:MFC自动
11、帮我们完成CView myView之流的代码不就行了么!其实不然,写MFC程序的时候,我们几乎要对每个大类进行派生改写。换句话说,MFC并不知道我们打算怎样去改写这些类,当然也不打算全部为我们“静态”创建这些类了。即使静态了创建这些类也没有用,因为我们从来也不会直接利用这些类的实例干什么事情。我们只知道,想做什么事情就往各大类里塞,不管什么变量、方法照塞,塞完之后,我们似乎并未实例化对象,程序就可以运行.MFC永久保存MFC的连续存储(serialize)机制俗称串行化。“在你的程序中尽管有着各种各样的数据,serialize机制会像流水一样按顺序存储到单一的文件中,而又能按顺序地取出,变成各
12、种不同的对象数据。”不知我在说上面这一句话的时候,大家有什么反应,可能很多朋友直觉是一件很简单的事情,只是说了一个“爽”字就没有下文了。MFC消息映射消息映射与命令传递体现了MFC与SDK的不同。在SDK编程中,没有消息映射的概念,它有明确的回调函数中,通过一个switch语句去判断收到了何种消息,然后对这个消息进行处理。所以,在SDK编程中,会发送消息和在回调函数中处理消息就差不多可以写SDK程序了。在MFC中,看上去发送消息和处理消息比SDK更简单、直接,但可惜不直观。举个简单的例子,如果我们想自定义一个消息,SDK是非常简单直观的,用一条语句:SendMessage(hwnd,messa
13、ge/*一个大于或等于WM_USER的数字*/,wparam,lparam),之后就可以在回调函数中处理了。但MFC就不同了,因为你通常不直接去改写窗口的回调函数,所以只能亦步亦趋对照原来的MFC代码,把消息放到恰当的地方。这确实是一样很痛苦的劳动。MFC消息传递有了消息映射表之后,我们得讨论到问题的关键,那就是消息发生以后,其对应的响应函数如何被调用。大家知道,所有的MFC窗口,都有一个同样的窗口过程AfxWndProc()。在这里顺便要提一下的是,看过MFC源代码的朋友都知道,从AfxWndProc函数进去,会遇到一大堆曲折与迷团,因为对于这个庞大的消息映射机制,MFC要做的事情很多,如优
14、化消息,增强兼容性等,这一大量的工作,有些甚至用汇编语言来完成,对此,我们很难深究它。所以我们要省略大量代码,理性地分析它。MFC重要MFC编辑 CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar(现为CMFCToolBar)、对话框CDialog、按钮CButton等等;一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),
15、OnSaveDocument(写盘),Serialize(序列化读写)。CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应等等)。最重要的是OnDraw(重画窗口),通常用CWnd:Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。CDC设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有
16、个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。CDialog对话框CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选的DC。CPen笔,画线。CBrush刷子,填充。CFont字体,控制文字输出的字体。CBitmap位图CPalette调色板CRgn区域,指定一块区域可以用于做特殊处理。CFile文件。最重要的不外是Open(打开),Read(读入),Write(写)。CStr
17、ing字符串。封装了C中的字符数组,非常实用。CPoint点,就是(x,y)对。CRect矩形,就是(left,top,right,bottom)。CSize大小,就是(cx,cy)对(宽、高)。MFCMFC类别编辑 CAnimateCtrl 自动化通用控件 afxcmn.hCArchive afx.hCArchiveException afx.hCArray afxtempl.hCAsyncMonikerFile 在ActiveX控件中提供对异步标记的支持 afxole.hCAsyncScoket 封装Windows Sockets API,参看CSocket afxsock.hCBitma
18、p afxwin.hCBitmapButton afxext.hCBrush afxwin.hCButton 按钮控件对象 afxwin.hCByteArray afxcoll.hCCachedDataPathProperty 允许一个ActiveX控件异步传输属性数据和缓冲内存中的数据,参考CDataPathProperty afxctl.hCCheckListBox afxwin.hCClientDC afxwin.hCCmdTarget 所有能够接收和响应消息的对象的基类afxwin.hCCmdUI afxwin.hCColorDialog 颜色选择的通用对话框,提供为显示系统定义的颜色
19、列表 afxdlgs.hCComboBox 组合框对象 afxwin.hCComboBoxEx CComboBox类的派生类,用于支持在组合框控件中的图像列表 afxcmn.hCCommandLineInfo afxwin.hCCommonDialog afxdlgs.hCConnectionPoint afxdisp.hCControlBar afxext.hCCreateContext afxext.hCCriticalSection afxmt.hCCtrlView afxwin.hCDaoDatabase afxdao.hCDaoException afxdao.hCDaoFieldE
20、xchange afxdao.hCDaoQueryDef afxdao.hCDaoRecordset 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式:表类型记录集,动态集类型记录集和快照类型记录集 afxdao.hCDaoRecordView 提供表单视图,以在控件中显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView afxdao.hCDaoTableDef afxdao.hCDaoWorkspace afxdao.hCDatabase afxdb.hCDataExchange afxwin.hCDataPat
21、hProperty 实现一个ActiveX控件属性,它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 afxctl.hCDateTimeCtrl 封装新的日期/时间选取器控件 afxdtctl.hCDBException afxdb.hCDBVariant afxdb.hCDC afxwin.hCDialog 用于包含控件窗口的对话框对象 afxwin.hCDialogBar afxext.hCDocItem afxole.hCDockState afxadv.hCDocObjectServer afxdocob.hCDocObjectServerItem afxd
22、ocob.hCDocTemplate afxwin.hCDocument 用于管理程序的数据的类 afxwin.hCDragListBox Windows列表框,允许用户把其中的项拖放到不同的位置 afxcmn.hCDumpContext afx.hCDWordArray afxcoll.hCEdit 用于文本输入的子窗口控件 afxwin.hCEditView 提供Windows编缉控件的功能。因为CEditView派生于Cedit,该对象可同文件和文件模板一同使用 afxext.hCEvent afxmt.hCException afx.hCFieldExchange afxdb.hCFi
23、le afx.hCFileDialog 通用文件对话框,提供Open和Save As对话框中的功能 afxdlgs.hCFileException afx.hCFileFind afx.hCFindReplaceDialog afxdlgs.hCFont afxwin.hCFontDialog 通用字体对话框,用于显示当前已装入系统的字体列表 afxdlgs.hCFontHolder afxctl.hCFormView 包含对话框控件的窗口 afxext.hCFrameWnd SDI(单窗口界面)框架窗口 afxwin.hCFtpConnection afxinet.hCFtpFileFind
24、 afxinet.hCGdiObject afxwin.hCGopherConnection afxinet.hCGopherFile afxinet.hCGopherFileFind afxinet.hCGopherLocator afxinet.hCHeaderCtrl 标题通用控件 afxcmn.hCHotKeyCtrl 热键通用控件 afxcmn.hCHtmlStream afxisapi.hCHtmlView 实现Web Browser控件的视图类,能够访问当地或Web上的HTML文件。 afxhtml.hCHttpConnection afxinet.hCHttpFile afxi
25、net.hCHttpFilter 创建并处理超文传输协议过滤器对象,该对象用于过滤用于HTTP请求的服务器通知 afxisapi.hCHttpFilterContext afxisapi.hCHttpServer Internet Server API(ISAPI)的包装类 afxisapi.hCHttpServerContext afxisapi.hCImageList afxcmn.hCInternetConnection afxinet.hCInternetException afxinet.hCInternetFile afxinet.hCInternetSession afxinet
26、.hCIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.hCList afxtempl.hCListBox 列表框对象 afxwin.hCListCtrl 列表视通用控件 afxcmn.hClistView 简化CListCtrl的使用,添加了对文件和视图的支持 afxcview.hCLongBinary afxdb_.hCMap afxtempl.hCMapPtrToPtr afxcoll.hCMapPtrToWord afxcoll.hCMapStringToOb afxcoll.hCMapStringToPtr afxcol
27、l.hCMapStringToString afxcoll.hCMapWordToOb afxcoll.hCMapWordToPtr afxcoll.hCMDIChildWnd MDI(多文档界面)子框架窗口 afxwin.hCMDIFrameWnd afxwin.hCMemFile afx.hCMemoryException afx.hCMemoryStateCMenu afxwin.hCMetaFileDC afxext.hCMiniFrameWnd 半高的框架窗口,主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮,但其他都类似于正常的框架窗口 afxwin.hCMonikerFi
28、le afxole.hCMonthCalCtrl 月历控件,用于显示一个用户可选择日期的日历 afxdtctl.hCMultiDocTemplate afxwin.hCMultiLock afxmt.hCMutex afxmt.hCNotSupportedException afx.hCObArray afxcoll.hCObject afx.hCObList afxcoll.hCOleBusyDialog afxodlgs.hCOleChangeIconDialog afxodlgs.hCOleChangeSourceDialog afxodlgs.hCOleClientItem afxol
29、e.hCOleCmdUI afxdocob.hCOleControl afxctl.hCOleControlModule afxctl.hCOleConvertDialog afxodlgs.hCOleCurrency afxdisp.hCOleDataObject afxole.hCOleDataSource afxole.hCOleDateTime afxdisp.hCOleDateTimeSpan afxdisp.hCOleDBRecordView afxoledb.hCOleDialog afxodlgs.hCOleDispatchDriver afxdisp.hCOleDispatc
30、hException afxdisp.hCOleDocObjectItem afxole.hCOleDocument 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构,因为它们的文件必须能够包含OLE项 afxole.hCOleDropSource afxole.hCOleDropTarget afxole.hCOleException afxdisp.hCOleInsertDialog afxodlgs.hCOleIPFrameWnd afxole.hCOleLinkingDoc OLE包容器文件的基类,这些文件支持对它们所包含项的链接 afxole.hCOleL
31、inksDialog afxodlgs.hCOleMessageFilter afxole.hCOleObjectFactory afxdisp.hCOlePasteSpecialDialog afxodlgs.hCOlePropertiesDialog afxodlgs.hCOlePropertyPage afxctl.hCOleResizeBar afxole.hCOleSafeArray afxdisp.hCOleServerDoc OLE服务器文件的基类 afxole.hCOleServerItem 为OLE项提供一个服务器界面 afxole.hCOleStreamFile afxol
32、e.hCOleTemplateServer afxdisp.hCOleUpdateDialog afxodlgs.hCOleVariant afxdisp.hCPageSetupDialog afxdlgs.hCPaintDC afxwin.hCPalette afxwin.hCPen afxwin.hCPictureHolder afxctl.hCPoint atltypes.hCPrintDialog 通用打印对话框,提供Print和Print Setup对话框中的功能 afxdlgs.hCPrintInfoCProgressCtrl 通用进程指示器控件 afxcmn.hCProperty
33、Page 代表属性表单中的一页 afxdlgs.hCPropertyPageExCPropertySheet 属性表,也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 afxdlgs.hCPropertySheetExCPropExchange afxctl.hCPtrArray afxcoll.hCPtrList afxcoll.hCReBar afxext.hCReBarCtrl afxcmn.hCRecentFileList afxadv.hCRecordset 用于访问数据库表或查询的类 afxdb.hCRecordView
34、 包含对话框控件的窗口 afxdb.hCRect atltypes.hCRectTracker afxext.hCResourceException afxwin.hCRgn afxwin.hCRichEditCntrItem afxrich.hCRichEditCtrl 用户能够输入和编缉文本的窗口,提供字符和程序段格式,以及对嵌入OLE项的支持 afxcmn.hCRichEditDoc afxrich.hCRichEditView afxrich.hCRuntimeClassCScrollBar 滚动条对象 afxwin.hCScrollView 可滚动的窗口,派生于CView afxwi
35、n.hCSemaphore afxmt.hCSharedFile afxadv.hCSingleDocTemplate afxwin.hCSingleLock afxmt.hCSize atltypes.hCSliderCtrl 提供包含一个滑块和可选的刻度线的窗口 afxcmn.hCSocket Windows Socket API的包装类 afxsock.hCSocketFile afxsock.hCSpinButtonCtrl 提供箭头按钮,用户可单击它,以增加或减少某个控件中的一个值 afxcmn.hCSplitterWnd afxext.hCStatic 用于标识另一个控件或给用户提
36、供消息的简单文本框 afxwin.hCStatusBar afxext.hCStatusBarCtrl 提供一个层次窗口,通常放于父窗口的底部,用于显示关于应用程序的状态信息 afxcmn.hCStdioFile afx.hCString afx.hCStringArray afxcoll.hCStringList afxcoll.hCSyncObject afxmt.hCTabCtrl 允许应用程序在一个窗口或对话框的同一区域显示多个页面 afxcmn.hCTime afx.hCTimeSpan afx.hCToolBar afxext.hCToolBarCtrl 工具栏通用控件 afxcm
37、n.hCToolTipCtrl 提供工具提示控件的功能,它以一个小弹出窗口的样子显示,包含描述某个工具用途的一行文本 afxcmn.hCTreeCtrl 显示项的分层结构列表 afxcmn.hCTreeView 简化CTreeCtrl的用法 afxcview.hCTypedPtrArray afxtempl.hCTypedPtrList afxtempl.hCTypedPtrMap afxtempl.hCUIntArray afxcoll.hCUserException afxwin.hCView 用于显示程序数据的类 afxwin.hCWaitCursor afxwin.hCWinApp a
38、fxwin.hCWindowDC afxwin.hCWinThread 代表一个应用程序中的一个线程 afxwin.hCWnd afxwin.hCWordArray afxcoll.hMFCMFC相关编辑 有趣的是,MFC使用“Afx”作为所有的全局函数的前缀,“afx”作为全局变量的前缀。因为在MFC的早期开发阶段它叫“Application Framework Extensions”缩写为“AFX”。AFX提供了对Windows API的高度抽象,建立了全新的面向对象的AFX API,但它对于新手来说太复杂了,所以AFX小组不得不重新开始。后来他们创建了一组C+类,这就是MFC。MFC这个
39、名字被采用得太晚了以至于没来得及修改这些引用。MFC8.0和Visual Studio 2005一起发布了;MFC9.0和Visual Studio 2008一起发布。在免费的Express版本的Visual Studio 2005/2008中没有包含MFC。MFC作为一个强有力的竞争对手,为Borland的Turbo C+编译器设计OWL(Object Windows Library)在同一时间也发布了。但最后,Borland停止了对OWL的继续开发并且不久就从Microsoft那里购买了MFC头文件,动态链接库等的授权,微软没有提供完整的MFC的集成支持。之后Borland发布了VCL(V
40、isual Component Library)来替换OWL框架。MFC数据类型编辑 BOOLBoolean值(TRUE或FALSE)BSTR32-bit字符指针BYTE8-bit整数,无符号COLORREF32-bit数值,代表颜色值DWORD32-bit整数,无符号LONG32-bit整数,有符号LPARAM32-bit数值,作为窗口函数或callback的参数LPCSTR32-bit指针,指向一个常数字符串LPSTR32-bit指针,指向一个字符串LPCTSTR32-bit指针,指向一个常数字符串,此字符串可以移植到Unicode和DBCS(双字节字集)LPTSTR32-bit指针,指向
41、一个字符串,此字符串可以移植到Unicode和DBCS(双字节字集)LPVOID32-bit指针,指向一个未指定类型的数据LPRESULT32-bit数值,作为窗口函数或callback的返回值UINTUnsigned intWNDPROC32-bit指针,指向一个窗口函数WORD16-bit整数,无符号WPARAM窗口函数或callback的一个参数MFC特有类型编辑 POSITION一个数值,代表collection对象中的元素位置,常用于MFC collection classesLPCRECT32-bit指针,指向一个不变的RECT结构MFC版本更新编辑 新产品版本 MFC版本Micr
42、osoft C/C+ 7.0 MFC 1.0Visual C+ 1.0 MFC 2.0Visual C+ 1.5 MFC 2.5Visual C+ 2.0 MFC 3.0Visual C+ 2.1 MFC 3.1Visual C+ 2.2 MFC 3.2Visual C+ 4.0 MFC 4.0 (mfc40.dllincluded with Windows 95)Visual C+ 4.1 MFC 4.1Visual C+ 4.2 MFC 4.2 (mfc42.dllincluded with the Windows 98 original release)eMbedded Visual C
43、+ 3.0 MFC 4.2 (mfc42.dll)Visual C+ 5.0 MFC 4.21 (mfc42.dll)Visual C+ 6.0 MFC 6.0 (mfc42.dll)eMbedded Visual C+ 4.0 noneVisual C+ .NET 2002 MFC 7.0 (mfc70.dll)Visual C+ .NET 2003 MFC 7.1 (mfc71.dll)Visual C+ 2005 MFC 8.0 (mfc80.dll)Visual C+ 2008 MFC 9.0.21022 (mfc90.dll)Visual C+ 2008 with Feature P
44、ack MFC 9.0.30411 (mfc90.dll)Visual C+ 2010 MFC 10.0 (mfc100.dll)MFCMFC扩展DLL编辑 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C+的接口。也就是它可以导出C+类给客户端。导出的函数可以使用C+/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC2 。Visual C+使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必
45、须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是我们自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。MFC编程优势编辑 随着编程语言的推陈出新,MFC一些缺点日益突出。最重要的就是入门门槛相对其他语言要高,而且同样完成一个任务代码量相对较多。而原有的优势如运行速度快等,也因为其他编程语言的日臻完善和个人电脑的运算速度增加而显得不那么突出。MFC似乎
46、江河日下。但是MFC真的没有任何优势了吗?不是,面对底层程序,它能很轻松的与Windows API或驱动程序结合,就是在自己的代码中直接使用API函数,而API和驱动程序的资料都是以C语言为基础的,这使得VC程序员能够更轻松的使用Windows API。这样造成了一个很有意思的现象,即入门时VC程序员要付出更多的努力来学习,但是一旦掌握后,开发其他领域的程序或使用第三方软件时,如工业控制类的程序,由于底层的程序都是用C语言编写,反倒是VC程序员能够更快的掌握该领域的编程技术。而很多其他的编程语言甚至找不到相关的资料。这就说明VC(MFC)实际上是一种入门困难,但是扩展学习却很轻松的语言框架。如
47、果局限于某一领域的话VC毫无优势可言,但是如果开发一个新的领域的应用程序或者该程序涉及多个应用领域的话,可减少重复学习的频率和难度,VC(MFC)的优势会立刻显现出来。MFC相关书籍编辑 (1)侯俊杰, 深入浅出MFC(2)Ivor Horton著 李颂华 康会光 译Visual C+ 2005 入门经典(3)Charles Petzold windows程序设计3 参考资料1. MFC编写详解 李岩的博客引用日期2013-04-232. VC+ MFC DLL动态链接库编写详解 慧都控件网引用日期201
48、3-05-283. MFC Windows 程序设计(第2版)修订版 知识林2定义MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c+类库,主要封装了大部分的windows API函数,vc+是微软公司开发的c/c+的集成开发环境,所谓集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。vc也指它的内部编译器,集成开发环境必须有一个编译器内核,例如DevC+其中一个编译器内核就是gcc。 MFC除了是一个类库以外,还是一个框架,在vc+里新建一个MFC的工程,开发环
49、境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。MFCMFC和Win32编辑 MFC Object和Windows Object的关系MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C+对象,一个C+类的实例)之间的关系是
50、理解MFC的关键之一。所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C+对象,是一个C+类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows Object的C+ Object,并非指任意的C+ Object。MFC Object 和Windows Object是不一样的,但两者紧密联系。以窗口对象为例:一个MFC窗口对象是一个C+ CWnd类(或派生类)的实例,是程序直接创建的。在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。而Wind
51、ows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。MFC窗口对象和Windows窗口对象的关系如图2-1所示。其他的Windows Object和对应的MFC Object也有类似的关系。下面,对MFC Object和Windows Object作一个比较。有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但
52、具体涉及到时会指出。从数据结构上比较MFC Object是相应C+类的实例,这些类是MFC或者程序员定义的;Windows Object是Windows系统的内部结构,通过一个句柄来引用;MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。对于设备描述表CDC类,将保存两个HDC句柄。从层次上讲比较MFC Object是高层的,Windows Object是低层的;MFC Object封装了Windows Object的大部分或全部功能,MFC Object的使用者不需要直接应用Windows Object的HANDLE(句柄)使用Win32 A
53、PI,代替它的是引用相应的MFC Object的成员函数。从创建上比较MFC Object通过构造函数由程序直接创建;Windows Object由相应的SDK函数创建。MFC中,使用这些MFC Object,一般分两步:首先,创建一个MFC Object,或者在STACK中创建,或者在HEAP中创建,这时,MFC Object的句柄实例变量为空,或者说不是一个有效的句柄。然后,调用MFC Object的成员函数创建相应的Windows Object,MFC的句柄变量存储一个有效句柄。CDC(设备描述表类)的创建有所不同,在后面的2.3节会具体说明CDC及其派生类的创建和使用。当然,可以在MF
54、C Object的构造函数中创建相应的Windows对象,MFC的GDI类就是如此实现的,但从实质上讲,MFC Object的创建和Windows Object的创建是两回事。从转换上比较可以从一个MFC Object得到对应的Windows Object的句柄;一般使用MFC Object的成员函数GetSafeHandle得到对应的句柄。可以从一个已存在的Windows Object创建一个对应的MFC Object; 一般使用MFC Object的成员函数Attach或者FromHandle来创建,前者得到一个永久性对象,后者得到的可能是一个临时对象。从使用范围上比较MFC Object
55、对系统的其他进程来说是不可见、不可用的;而Windows Object一旦创建,其句柄是整个Windows系统全局的。一些句柄可以被其他进程使用。典型地,一个进程可以获得另一进程的窗口句柄,并给该窗口发送消息。对同一个进程的线程来说,只可以使用本线程创建的MFC Object,不能使用其他线程的MFC Object。从销毁上比较MFC Object随着析构函数的调用而消失;但Windows Object必须由相应的Windows系统函数销毁。设备描述表CDC类的对象有所不同,它对应的HDC句柄对象可能不是被销毁,而是被释放。当然,可以在MFC Object的析构函数中完成Windows Obj
56、ect的销毁,MFC Object的GDI类等就是如此实现的,但是,应该看到:两者的销毁是不同的。每类Windows Object都有对应的MFC Object,下面用表格的形式列出它们之间的对应关系,如表2-1所示:表2-1 MFC Object和Windows Object的对应关系描述Windows句柄MFC Object窗口HWNDCWnd and CWnd-derived classes设备上下文HDCCDC and CDC-derived classes菜单HMENUCMenu笔HPENCGdiObject类,CPen和CPen-derived classes刷子HBRUSHCGdiObject类,CBrush和CBrush-derived classes字体HFONTCGdiObject类,CFont和CFont-derived classes位图HBITMAPCGdiObject类,CBitmap和CBitmap-derived classes调色板HPALETTECGdiObject类,CPalette和CPalette-derived classes区域HRGNCGdiObject类,CRgn和CRgn-derived classes图像列表HimageLISTCimageList和CimageList-derived classes套接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 打造安全仓库文化的方法计划
- 《贵州金州能鹏矿业有限公司贵州省晴隆县老万场金矿(新建)矿产资源绿色开发利用方案(三合一)》评审意见
- 腰麻术后护理常规
- 企业网络组织与产业竞争力
- 统编版小学语文二年级下册《语文园地二》精美课件
- 航空维修工程师:飞行安全维修达人简历
- 能源行业:风能工程师个人简历
- 2025年安徽从业资格货运资格考试题库答案解析
- 2025年南宁货运从业资格证考试模拟考试答案
- 第六单元课外古诗词诵读《无题》李商隐教学设计-2024-2025学年统编版语文九年级上册标签标题
- SL176-2007《水利水电工程施工质量检验与评定规程》
- 挖掘机液压原理动作分解
- (高清版)辐射供暖供冷技术规程JGJ142-2012
- 重庆危险性较大的分部分项工程安全管理实施细则
- 三菱 PLC FX2N-4AD 4DA 模拟量模块教材(课堂PPT)
- 有机金属化学1
- JIT标准作业作业指导书
- 土壤固化土施工技术导则
- VAR模型Johansen协整检验在eviews中的具体操作步骤及结果解释
- 混凝土面板堆石坝接缝止水
- 加油站法律法规符合性评价
评论
0/150
提交评论