vc入门必备--基础知识_第1页
vc入门必备--基础知识_第2页
vc入门必备--基础知识_第3页
vc入门必备--基础知识_第4页
vc入门必备--基础知识_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

VC入门必备基础知识(一)首先我们要了解以下概念应用程序APPLICATION,他就是由指令INSTRUCTION组成的可以运行的文件。进程PROCESS,有时和应用程序的意思一样,但在通常的情况下,进程是指一个正在运行的应用程序,正因为这样,进程由以下部分组成1、一个可以执行的程序2、位于内存MEMORY中的私有地址空间3、系统资源SYSTEMRESOURCE,例如文件FILE,管道PIPE,通讯端口COMMUNICATIONSPORT,信号SEMAPHORE4、至少还要有1个线程THREAD,线程是最基本的执行单位。因为多个进程是可以同时存在时,所以WINDOWS操作系统OPERATINGSYSTEM必须给进程提供保护,以防止他们冲突。物理内存PHYSICALMEMORY,即你的计算机的实际内存,例如我现在用的电脑的内存是128M,物理内存的容量是达不到程序的要求的,于是就产生了虚拟内存VIRTUALMEMORY。虚拟内存VIRTUALMEMORY,不是真正的内存,它通过映射MAP的方法,使可用的虚拟地址VIRTUALADDRESS达到4G2的32次方,每个应用程序可以被分配2G的虚拟地址,剩下的2G留给操作系统自己用。在WINDOWSNT中,应用程序可以有3G的虚拟地址。简单的说,虚拟内存的实现方法和过程是1、当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配了2G的虚拟地址(不是内存,只是地址);2、虚拟内存管理器VIRTUALMEMORYMANAGER将应用程序的代码CODE映射到那个应用程序的虚拟地址中的某个位置,并把当前所需要的代码读取到物理地址中。注意,虚拟地址和应用程序代码在物理内存中的位置是没有关的;3、如果你有使用动态链接库DYNAMICLINKLIBRARY,即DLL的话,DLL也被映射到进程的虚拟地址空间,在有需要的时候才被读入物理内存;4、其他项目(例如数据,堆栈等)的空间是从物理内存分配的,并被映射到虚拟地址空间中;5、应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置。如果大家看不明白上面的步骤也不要紧(似乎超出了入门篇的范围),但大家要明白以下两点1、应用程序是不会直接访问物理地址的;2、虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问;使用虚拟内存的好处是简化了内存的管理,并可以弥补物理内存的不足;可以防止在多任务MULTITASKING环境下的各个应用程序之间的冲突。线程THREAD,是最基本的执行单位,CPU时间就是分配给每个线程的。每个进程一开始时只有一个线程,但每个线程都可以产生出其他线程,前者叫做父线程PARENTTHREAD,后者叫做子线程CHILDTHREAD。每个执行的线程都有自己的虚拟输入队列VIRTUALINPUTQUEUE,用来处理来自硬件、处理器PROCESSOR或操作系统的消息MESSAGE。这些队列都是异步的,也就是说,当处理器发送一个消息给另外一个线程的队列时,发送函数不用等待其他线程处理该消息就可返回,而接收消息的线程可以等到该线程准备好时再访问并处理接收到的消息。多线程MULTITHREAD,如果一个进程中有多个线程同时存在,就叫做多线程了。多任务MULTITASKING,即多个程序看起来好像是在同时执行,其实并不是同时的,只不过因为时间太短,人类感觉不出来而已。其原理是操作系统分配给每个线程一个非常短大约百分之秒的时间片,每个线程轮流切换执行,这个过程叫做场境转换CONTEXTSWITCHING。场境转换CONTEXTSWITCHING,是指1、运行一个线程直到该线程的时间片用完,或者这个线程必须等待其他的资源;2、保存这个线程的场境;3、取出其他线程的场境;4、只要有线程在等待执行,就会不停的重复以上过程。RAWINPUTTHREADRIT,是指用来接收所有由键盘和鼠标产生的事件EVENT的线程,它是一个特殊的系统线程,每当RIT接收到处理器发出的硬件HARDWARE事件,它就把那些事件放到相应线程的虚拟输入队列中。因此,应用程序的线程通常是不用等待它的硬件事件的。事件驱动EVENTDRIVEN编程,WINDOWSBASED的应用程序运行后,就会一直等待,直到有用户发布命令(例如按一个按钮或选中一个菜单)之类的事件发生,这就叫做事件驱动编程EVENTDRIVENPROGRAMMING。它同DOS下的应用程序的最大区别就是DOS下的应用程序是通过命令行加参数的方法来控制应用程序的执行,而WINDOWSBASED的应用程序是通过图形用户界面GUI来控制应用程序的执行。用户所产生的事件,在程序里就会转化为消息,不同的事件产生不同的消息,从而可以产生不同的响应。终于讲完这一节了,大家看得明白吗如果不明白的话,那就一字一句的从头到尾再看一遍吧。如果还不明白,那就请跳过这一节吧,我在后面的章节中还会逐步解释这些概念的。在本章的最后一节我将会举一个具体的程序来说明WINDOWSBASED应用程序的结构和组成元素。以下是本节出现的专业名词应用程序APPLICATION指令INSTRUCTION进程PROCESS内存MEMORY系统资源SYSTEMRESOURCE文件FILE管道PIPE通讯端口COMMUNICATIONSPORT信号SEMAPHORE线程THREAD物理内存PHYSICALMEMORY虚拟内存VIRTUALMEMORY映射MAP虚拟地址VIRTUALADDRESS虚拟内存管理器VIRTUALMEMORYMANAGER代码CODE动态链接库DYNAMICLINKLIBRARY,即DLL数据DATA堆栈STACK多任务MULTITASKING父线程PARENTTHREAD子线程CHILDTHREAD多线程MULTITHREAD场境转换CONTEXTSWITCHING虚拟输入队列VIRTUALINPUTQUEUE处理器PROCESSOR操作系统OPERATINGSYSTEM消息MESSAGE队列QUEUERAWINPUTTHREADRIT事件EVENT硬件HARDWARE事件驱动EVENTDRIVEN事件驱动编程EVENTDRIVENPROGRAMMING图形用户界面GUIVC入门必备基础知识(二)WINDOWS下的程序的结构和组成元素WINDOWS下的程序的基本组成元素是代码,用户界面资源USERINTERFACERESOURCE和动态链接的库模块LIBRARYMODULE。代码,是应用程序的主要内容,WINDOWS下的应用程序必须要有两个函数1、WINMAIN,它为操作系统提供了进入点ENTRYPOINT,是所有WINDOWSBASED应用程序都必须要有的函数。它也用来创建初始WINDOW和启动MESSAGE检索;2、WINDOWPROCEDURE,它用于处理所有从操作系统发送到WINDOW的MESSAGE,每一个WINDOW都有一个相关联的WINDOWPROCEDURE。WINDOWPROCEDURE用来决定WINDOW的CLIENTAREA(即客户窗口,例如NOTEPAD中用来写字的空白部分)显示什么以及如何响应用户的输入。WINDOWPROCEDURE处理MESSAGE时,既可以用专门添加的代码来处理MESSAGE,也可以直接把MESSAGE传递给默认的WINDOWPROCEDUREDEFWINDOWPROC。一个WINDOWSBASED应用程序可以包含多个不同名的WINDOWPROCEDURE。用户界面资源,菜单MENU,对话框DIALOGBOX等图形用户界面的元素,就叫做资源。它们被当成模板TEMPLATE储存在相应的可执行文件或DLL文件的只读READONLY区域,当有需要时,WINDOWS就调用这个资源区域并动态创建所需要的GUI元素。主要有以下几种资源ACCELERATOR快捷键表,储存快捷键和相应的命令BITMAP位图,一种图形格式DIABLOBOX,包含对话框的控件CONTROL,布局和属性的细节ICON图标,一种特殊的位图MENU菜单,包含菜单及其选项的文本和布局STRINGTABLE字符串表,储存字符串及其IDTOOLBAR工具栏,包含工具栏的布局和按钮的位图VERSION版本,储存程序的状态信息,例如程序名,作者,版权,版本号等CURSOR光标,包含用于绘制光标的特殊的位图库模块,主要是指在运行时可以被动态链接的二进制文件,即DLL。默认的WINDOWPROCEDUREDEFWINDOWPROC,是WINDOWS系统提供的一个函数,用于处理某些通用的WIN32BASED应用程序的MESSAGES(例如最大化、最小话窗口,显示目录等)。如果DEFWINDOWPROC不能处理该MESSAGE,那么它就被忽略。当一个应用程序被启动时,将会按顺序发生下列事件(上一节也提到过这个问题)1、操作系统创建一个新进程和一个起始线程;2、应用程序的代码被载入内存;3、DLL也被载入内存(如果有的话);4、从物理内存分配其他项目(例如数据,堆栈等)的空间,并被映射到虚拟地址空间中;5、应用程序开始执行。在WINDOWSBASED应用程序中,WINDOWS是应用程序和用户之间传递信息的主要方法。WINDOWSBASED的应用程序为了接收从系统队列传来的MESSAGE,是通过以下方法实现的1、当WINDOWSBASED的应用程序启动后,操作系统和这个应用程序就通过进入点(WINMAIN函数)联系起来。2、应用程序创建一个或多个WINDOWS,每个WINDOW都包含有一个WINDOWPROCEDURE函数,用来决定WINDOW显示什么以及WINDOW如何响应用户的输入。3、有专门的代码将MESSAGE队列中的MESSAGE循环检索出来,并传递给相应的WINDOWPROCEDURE,而不是直接传给WINDOW。这样就可以使应用程序在MESSAGE被送到WINDOW之前预先处理它。到了下一节,我们将会用一个简单的源程序说明以上元素和步骤。以下是本节新出现的专业名词用户界面资源USERINTERFACERESOURCE库模块LIBRARYMODULE进入点ENTRYPOINT客户窗口CLIENTAREA(例如NOTEPAD中用来写字的空白部分)菜单MENU对话框DIALOGBOX模板TEMPLATE只读READONLY控件CONTROL快捷键表ACCELERATOR位图BITMAP图标ICON字符串表STRINGTABLE工具栏TOOLBAR版本VERSION光标CURSOR动态链接DYNAMICLINKING源程序示例本节列出了一个简单的源程序,来说明上两节的内容。请大家结合上两节的内容来看看下面的源程序,不需要完全看懂,只用理解大概的框架和流程就行了,注意黑体字部分。源程序如下/摘自HTTP/MSDNMICROSOFTCOM/LIBRARY/PARTBOOK/WIN98DH/THEWINMAINPROCEDUREHTM/包含头文件WINDOWSHINCLUDE/预先声明MESSAGEHANDLER,可以叫做任何名字,这里是MYWINDOWPROCEDURELRESULTCALLBACKMYWINDOWPROCEDUREHWND,UINT,WPARAM,LPARAM/以下是所有WINDOWS程序都需要的WINMAIN函数/WINMAIN主要用来实现三个功能/1注册WINDOWCLASS;/2在内存中创建WINDOW并初始化WINDOW的属性;/3创建一个MESSAGELOOP来检查MESSAGEQUEUE中有没有该WINDOW的MESSAGE。INTWINAPIWINMAINHINSTANCEHINSTANCE,HINSTANCEHPREVINSTANCE,LPSTRLPSZCMDLINE,INTNCMDSHOWSTATICCHARSZAPPNAME“WINHELLO”/定义一个字符串HWNDHWND/定义一个WINDOWHANDLE变量MSGMSG/定义一个MESSAGE结构的变量,用来储存MESSAGE的信息WNDCLASSWC/定义一个WINDOWCLASS数据结构,用来储存WINDOWCLASS的属性/下面这段代码用来定义WINDOW的属性,例如MESSAGEHANDLER的地址、窗口背景、光标和图标等WCSTYLECS_HREDRAW|CS_VREDRAW/设置STYLE当窗口改变大小时就重新绘制窗口WCLPFNWNDPROCWNDPROCMYWINDOWPROCEDURE/设定WINDOWPROCEDUREWCCBCLSEXTRA0/用来储存CLASSSTRUCTURE后的额外的数据,这里不需要WCCBWNDEXTRA0/用来储存WINDOWINSTANCE后的额外的数据,这里不需要WCHINSTANCEHINSTANCE/WINDOWPROCEDURE所在的INSTANCEWCHICONLOADICONNULL,IDI_APPLICATION/CLASS的图标WCHCURSORLOADCURSORNULL,IDC_ARROW/CLASS的光标WCHBRBACKGROUNDHBRUSHCOLOR_WINDOW1/背景刷WCLPSZMENUNAMENULL/菜单资源的名字,这里没有WCLPSZCLASSNAMESZAPPNAME/应用程序的名字/注册WINDOW,通过调用API函数REGISTERCLASS来实现/注册WINDOWCLASS的一个目的就是将WINDOW和WINDOWPROCEDURE关联起来REGISTERCLASS/注册WINDOWCLASS后,WINMAIN就调用CREATEWINDOW函数来创建应用程序的WINDOWHWNDCREATEWINDOWSZAPPNAME,/已注册的CLASS名字“HELLO,WORLDWINDOWS_98STYLE”,/WINDOW名字WS_OVERLAPPEDWINDOW,/WINDOW风格CW_USEDEFAULT,/WINDOW起点的X坐标CW_USEDEFAULT,/WINDOW起点的Y坐标CW_USEDEFAULT,/WINDOW的宽度CW_USEDEFAULT,/WINDOW的高度HWND_DESKTOP,/父窗口的HANDLENULL,/菜单的HANDLEHINSTANCE,/应用程序INSTANCE的HANDLENULL/WINDOWCREATION数据的指针/以下两条语句用来显示WINDOWSHOWWINDOWHWND,NCMDSHOWUPDATEWINDOWHWND/用WHILE循环语句来检索并发送MESSAGES/从MESSAGEQUEUE中检索MESSAGE,并将它放到变量MSG中。/当收到”WM_QUIT”这个MESSAGE时,GETMESSAGE函数就返回0,循环结束。而且WINMAIN函数也结束,程序终止。WHILEGETMESSAGE/将VIRTUALKEYMESSAGES转化为CHARACTERMESSAGESDISPATCHMESSAGE/将MESSAGE发送到WINDOWPROCEDURERETURNMSGWPARAM/MYWINDOWPROCEDURE函数处理WM_PAINT和WM_DESTROY这两个MESSAGE,然后必须调用DEFWINDOWPROC去处理其他MESSAGELRESULTCALLBACKMYWINDOWPROCEDUREHWNDHWND,UINTMESSAGE,WPARAMWPARAM,LPARAMLPARAMPAINTSTRUCTPS/定义一个PAINTSTRUCT结构的变量,用来储存绘制WINDOW的CLIENTAREA的信息HDCHDC/定义一个HDC变量LPCTSTRTEXT”WELCOME”/定义一个LPCTSTR类型的字符串指针/用SWITCH语句来处理WM_PAINT和WM_DESTROY这两个MESSAGESWITCHMESSAGECASEWM_PAINT/下面5条语句是用来在屏幕上输出文字的,我们在后面的章节会详细讨论这个问题的,这里就不多说了HDCBEGINPAINTHWND,RECTRECTGETCLIENTRECTHWND,TEXTOUTHDC,RECTRIGHTRECTLEFT/2,RECTBOTTOMRECTTOP/2,TEXT,STRLENTEXTENDPAINTHWND,RETURN0/处理退出消息CASEWM_DESTROYPOSTQUITMESSAGE0RETURN0/调用默认的WINDOWPROCEDURE,使所有MESSAGE都可以被处理RETURNDEFWINDOWPROCHWND,MESSAGE,WPARAM,LPARAM运行上面程序的步骤1、选菜单FILENEWPROJECTSWIN32APPLICATION2、在PROJECTNAME中输入VCHACK_01_002_003(其它名字也行)3、其他地方就保留默认值就行了,然后按”OK”4、选中”ANEMPTYPROJECT”,然后按”FINISH”5、再按次”OK”6、按TOOLBAR上的按钮”NEWTEXTFILE”新建一个空白文件7、将以上源程序复制到那个空白文件中,然后按TOOLBAR上的按钮”SAVE”来储存文件,文件名为VCHACK_01_002_003CPP8、按左下角的”FILEVIEW”,然后按”VCHACK_01_002_003FILES”旁边的”号展开这个目录9、在”SOURCEFILES”上按鼠标右键,选”ADDFILESTOFOLDER”10、选中VCHACK_01_002_003CPP这个文件,然后按”OK”11、选”BUILD”菜单中的”BUILDVCHACK_01_002_003EXE”12、选”BUILD”菜单中的”EXECUTEVCHACK_01_002_003EXE”来运行这个程序以下是本节新出现的专业名词类CLASS窗口类WINDOWCLASS数据结构DATASTRUCTURE消息处理器MESSAGEHANDLER实例INSTANCE句柄HANDLE工程PROJECTVC入门必备基础知识(三)MFC简介微软基础类库MICROSOFFOUNDATIONCLASSLIBRARY和VISUALC提供了一个创建各种各样应用程序的环境,并简化了其中部分工作。MFCLIBRARY是CLASS的集合,大约有250个CLASS,在很大程度上扩展了C语言;MFCLIBRARY也是一个应用程序框架APPLICATIONFRAMEWORK,它定义了应用程序的结构(当然你也可以用源程序一行一行地写出自己的应用程序结构,不过这样比较麻烦),并可以处理应用程序的一些常规任务。如果你想用MFC进行程序开发,首先你必须熟悉MFC所包含的CLASS以及各个CLASS之间的关系。MFCCLASS是有层次的MFC的层次图请看HTTP/MSDNMICROSOFTCOM/LIBRARY/DEVPRODS/VS6/VISUALC/VCMFC/_MFC_HIERARCHY_CHARTHTM,请大家务必要看,最好把它保存下来,以便日后查找,有些CLASS可以直接使用,而有些CLASS是作为其他CLASS的基类BASSCLASS一般不直接使用。为了学习的方便,一般将MFCCLASS划分为以下几个种类COBJECTDERIVEDCLASSESAPPLICATIONARCHITECTURECLASSESUSERINTERFACECLASSESGENERALPURPOSECLASSESACTIVEXCLASSESDATABASECLASSESINTERNETCLASSESGLOBALAFXFUNCTIONS以上划分的种类之间决不是相互独立的,大多数的MFCCLASSES是直接或间接从COBJECTCLASS派生的,COBJECTCLASS是MFCLIBRARY中最基本的CLASS。下一节我将会分别对以上几个种类的CLASSES做一个简单的介绍,然后我还会分别用1至2章来详细介绍上面的几种CLASSES。这一节的内容比较少,请大家仔细看看MFC的层次图。MFC的命名规则是CLASS名以C开头,其他地方顾名思义。以下是本节新出现的专业名词微软基础类库MICROSOFFOUNDATIONCLASSLIBRARY微软基础类MICROSOFFOUNDATIONCLASS即MFC应用程序框架APPLICATIONFRAMEWORK基类BASSCLASSMFC的层次、分类和作用心情随笔本节有很多专业名词,其实这些单词从字面上并不难理解,例如”DOCUMENT”,中文是”文本”的意思,但假如把”DOCUMENTCLASS”直接翻译成”文本类”的话,可能会把很多人搞混淆了,我觉得”文本类”比”DOCUMENTCLASS”更难理解,正因为如此,所以我决定不把那些容易搞混淆的专业名词直译成中文了。我非常反感市面上的一些电脑书完全直译国外作品,可能是由于翻译者的电脑水平不行,把一些专业名词凭空想象,例如有的把”SERIALIZATION”翻译成”序列化”,有的又翻译成”串行化”,完全脱离了原意。本节将简要介绍MFC所包含的主要几种CLASS,大家最好要记住MFC的分类和各个CLASS的作用(特别是COBJECT派生的COBJECTDERIVEDCLASSES,应用程序结构APPLICATIONARCHITECTURECLASSES,用户界面USERINTERFACECLASSES这三种,一定要记住),这是后面章节的基础。大家现在无需知道各个CLASS的使用方法,因为我会在后面详细说明的。注以下内容有部分摘自MSDN,其实我也记不住那么多CLASS,一般是有需要才去查帮助文件的。一、COBJECT派生的COBJECTDERIVEDCLASSESCOBJECT是MFC大多数CLASS的基类,它主要提供了一些基本功能,主要包括SERIALIZATION,指把对象OBJECT从存储媒体(例如磁盘上的文件)中读出或写入的过程;RUNTIMECLASS信息,指从COBJECT派生的对象包含有在运行时可以访问的信息;诊断输出,指COBJECT提供了一些输出函数,这些函数可以输出程序执行过程中的一些信息,可以帮助你调试程序。从COBJECT派生的类为MFC应用程序提供了基本的结构和功能,重要的有以下几种类别基类描述COMMANDTARGETSCCMDTARGET用于处理用户请求APPLICATIONSCWINAPP代表应用程序的核心DOCUMENTSCDOCUMENT包含应用程序的数据集WINDOWSCWND主要用于图形用户界面GUI的对象,可以处理常见的WINDOWSMESSAGESFRAMESCFRAMEWND用于应用程序的主要WINDOW框架VIEWSCVIEW用于显示数据并于DOCUMENT对象交互此外,COBJECTDERIVEDCLASS还包括用于菜单、文件服务、图形等方面的CLASS。MFC也包含了一些不是从COBECT派生的类,这些类相对来说可以节省开销,主要分为以下几种1、用于常规编程的实用类,例如CSTRING,CTIME,CTIMESPAN,CREC,CPOINT,CSIZE;2、MFC结构的支持类,例如CARCHIVE,CDUMPCONTEXT,CRUNTIMECLASS,CFILESTATUE,CMEMORYSTATE3、用户定义指针的集合类,例如CTYPEDPOINTERARRAY二、应用程序结构APPLICATIONARCHITECTURECLASSES应用程序结构CLASS代表应用程序的基本结构元素,主要包括CWINAPP,CDOCUMENT,CCMDTARGET和CWINTHREAD。当应用程序开始运行时,这些CLASS是最先被初始化的,它们都有很重要的作用。1、CWINAPP,代表应用程序自己,所有的MFC应用程序都从CWINAPP派生一个CLASS。根据应用程序框架FRAMEWORK的种类,应用程序的对象OBJECT要完成以下工作1初始化INITIALIZE应用程序2建立DOCUMENTTEMPLATE结构3循环检索MESSAGEQUEUE中的MESSAGE并派送这些MESSAGE到相应的地方4当应用程序退出时要进行”清理”工作2、CDOCUMENT,它是使用DOCUMENT/VIEW结构的应用程序中的DOCUMENT的基类。这里的DOCUMENT代表程序中的数据,是一个抽象概念,我们在开发程序时必须考虑数据如何储存到DOCUMENT中。3、CCMDTARGET,它是MFC的MESSAGE映射的基础CLASS,从CCMDTARGET派生的类可以成为COMMANDMESSAGES的目标。COMMANDMESSAGES是指由用户选择菜单或按钮等行为产生的MESSAGES。4、CWINTHREAD,它的成员函数可以使MFC应用程序创建和管理线程。三、用户界面USERINTERFACECLASSES用户界面CLASSES主要包含WINDOWSBASED应用程序的一些可视性元素,例如窗口、菜单、对话框、控件CONTROL等,它还封装ENCAPSULATE了WINDOWSDEVICECONTEXT对象和GRAPHICSDEVICEINTERFACEGDI对象。用户界面CLASS包括CWND,CVIEW,CGDIOBJECT和MENU这几个主要CLASSCWND,它是所有MFCWINDOWS的基类,它定义了WINDOW的基本功能和WINDOW对大部分MESSAGE的默认响应。CWND可以直接用来派生其他CLASS,但通常情况下,CLASS是从CWND派生的CLASS派生的,从CWND派生的CLASS主要有CFRAMEWND,主要用于单文档界面SINGLEDOCUMENTINTERFACE,例如写字板之类的程序,一次只能打开一个WINDOW;CCONTROLBAR,是工具栏,状态栏等控件的基类;CDIALOG,提供对话框的功能;CBUTTON,CLISTBOX,CSCROLLBAR等,主要用于按钮,列表框,滚屏栏等控件。CVIEW,是DOCUMENT/VIEW(一种应用程序的结构,下节再讲)应用程序的视图的基类;CGIDOBJECT,它包含一些用于显示输出的对象(例如PEN,BRUSH,FONT等),使MFC应用程序可以创建和使用这些对象。GDI最大的好处就是提供了设备无关性DEVICEINDEPENDENT,使到开发人员无需考虑不同设备的问题。CMENU,主要用于提供菜单界面,通过CMENU,应用程序可以在运行时动态改变菜单的内容。四、常规用途GENERALPURPOSECLASSESGENERALPURPOSECLASSES包括各种各样的数据类型,常用的有CFILE,用于文件的输入/输出CSTRING,用于管理字符串变量CEXCEPTION,用于处理EXCEPTIONCBYTEARRAY,CINTARRAY,CSTRINGARRAY,CSTRINGLIST,COBLIST,用于数据结构,例如数组和列表CPOINT,CSIZE,CRECT,CTIME,CTIMESPAN,杂项五、ACTIVEXCLASSESACTIVEXCLASSES可以简化ACTIVEX的编程和ACTIVEXAPI的访问,ACTIVEX的主要作用和功能是创建ACTIVEX控件和ACTIVEX控件容器通过自动化AUTOMATION,是一个程序控制另一个程序创建包含有多种数据类型(例如文字、图片、声音等)的文档,既复合文档创建可以嵌入复合文档的OLEOBJECT使用拖放DRAGANDDROP方式可以在两个应用程序之间复制数据ACTIVEXCLASS的分类如下ACTIVEXCONTROLCLASSES包括COLECONTROLMODULE,COLECONTROL,CCONNECTIONPOINT,CPICTUREHOLDER,CFONTHOLDER,COLEPROPERTYPAGE,CPROPEXCHANGE,CMONIKERFILE,CASYNCMONIKERFILE,CDATAPATHPROPERTY,CCACHEDDATAPATHPROPERTY,COLECMDUI,COLESAFEARRAYACTIVEDOCUMENTCLASSES包括CDOCOBJECTSERVER,CDOCOBJECTSERVERITEMACTIVEXRELATEDCLASSES包括COLEOBJECTFACTORY,COLEMESSAGEFILTER,COLESTREAMFILE,CRECTTRACKERAUTOMATIONCLASSES包括COLEDISPATCHDRIVER,COLEDISPATCHEXCEPTIONCONTAINERCLASSES包括COLEDOCUMENT,COLELINKINGDOC,CDOCITEM,COLECLIENTITEMOLESERVERCLASSES包括COLESERVERDOCOLEDRAGANDDROPANDDATATRANSFERCLASSES包括COLEDROPSOURCE,COLEDATASOURCE,COLEDROPTARGET,COLEDATAOBJECTOLECOMMONDIALOGCLASSES包括COLEDIALOG,COLEINSERTDIALOG,COLEPASTESPECIALDIALOG,COLELINKSDIALOG,COLECHANGEICONDIALOG,COLECONVERTDIALOG,COLEPROPERTIESDIALOG,COLEUPDATEDIALOG,COLECHANGESOURCEDIALOG,COLEBUSYDIALOG创建ACTIVEX比较难,我会在”提高篇”中详细讨论的。六、数据库DATABASECLASSES数据库编程是非常枯燥的,但我们不得不承认数据库非常有用,连接数据库然后访问数据是常用的数据库编程方法。MFC提供了一些类,这些类可以通过开放式数据库连结OPENDATABASECONNECTIVITY,即ODBC和数据访问对象DATAACCESSOBJECT,即DAO来操作数据库。DATABASECLASSES主要包括CDATABASE,CDAODATABASE,CRECORDSET,CDAORECORDSET。CDATABASE或CDAODATABASE的OBJECT代表一个和数据源DATASOURCE的连接,通过这个OBJECT就可以操作数据源了。这里的数据源是指数据库中的数据的实例INSTANCE。CRECORDSET或DAORECORDSET的OBJECT代表从数据源中选中的数据的集合,叫做RECORDSET。CRECORDSET和DAORECORDSET的OBJECT有两种形式DYNASETS,动态的,假如数据库被更新,RECORDSET也同步被更新;SNAPSHOT,静态的,它只反映了在RECORDSET被调用时的状态,不会随着数据库的更新而更新。CDAORECORDSET还可以直接代表数据库的表TABLE。七、INTERNETCLASSESINTERNETCLASSES不但可以用于INTERNET,还可以用于INTRANET企业内部网。MFC包括WININETAPIS提供客户端的CLASS和INTERNETSERVERAPI即ISAPI,提供服务器端的CLASS。客户端的CLASS主要有以下几个CINTERNETSESSION,创建并初始化一个或多个同步的INTERNETSESSION会话,它有3个主要函数GETHTTPCONNECTION,GETFTPCONNECTION和GETGOPHERCONNECTION这3个函数的作用大家可以顾名思义。CHTTPCONNECTION,管理应用程序对HTTP服务器的连接。CFTPCONNECTION,管理应用程序的FTP连接,它包含了一些用于搜索远程目录和文件的函数。CGOPHERCONNECTION,管理应用程序的GOPHER连接,它也包含了一些用于搜索不同类型文件的函数。CFILEFIND,它是CFTPFILEFIND和CGOPHERFILEFIND的基类,提供了搜索和定位的功能,并可返回文件的信息,它们都还支持通配符查询。服务器端的CLASS主要有以下几个CHTTPSERVER,可用于创建和管理一个服务器扩展SERVEREXTENSIONDLL,也叫做INTERNET服务器应用程序INTERNETSERVERAPPLICATION,即ISA。ISA一般用来扩展一个INTERNET服务器的能力。CHTTPSERVERCONTEXT,被CHTTPSERVER用来封装单个客户端请求的实例INSTANCE。CHTTPFILTER,这个CLASS可以用来创建一个具有过滤客户数据功能的DLL。CHTTPFILTERCONTEXT,被CHTTPFILTER用来封装单个客户通知NOTIFICATION的实例INSTANCE。CHTMLSTREAM,封装HTML数据缓冲区BUFFER,该BUFFER是被CHTTPSERVER用来应答客户的。八、全局AFX函数GLOBALAFXFUNCTIONSGLOBALAFXFUNCTIONS不属于任何CLASS,它们以AFX开头,可以在应用程序的绝大多数地方被直接调用(这点和CLASS的成员函数有很大不同)。常用的全局AFX函数有AFXABORT,无条件中断应用程序AFXMESSAGEBOX,显示一个消息框AFXGETAPP,返回一个指向PROJECT的CWINAPPOBJECT的指针AFXGETAPPNAME,返回应用程序的名字,类型为一个指向字符串的指针AFXGETMAINWND,返回指向主框架窗口MAINFRAMEWINDOW的指针AFXGETINSTANCEHANDLE,返回当前应用程序的实例INSTANCE的句柄HANDLE,即HINSTANCE以下是本节新出现的专业名词派生DERIVE连续化SERIALIZATION对象OBJECT集合类COLLECTIONCLASSES框架FRAME框架FRAMEWORK重载OVERRIDE初始化INITIALIZEDOCUMENTCOMMANDMESSAGES封装ENCAPSULATE控件CONTROL设备环境DEVICECONTEXT图形设备接口GRAPHICSDEVICEINTERFACEGDI单文档界面SINGLEDOCUMENTINTERFACE设备无关性DEVICEINDEPENDENT异常或例外EXCEPTIONACTIVEX控件ACTIVEXCONTROLACTIVEX控件容器ACTIVEXCONTROLCONTAINER自动化AUTOMATION拖放DRAGANDDROP数据源DATASOURCE实例INSTANCE企业内部网INTRANET客户端CLIENSIDE服务器端SERVERSIDE会话SESSION服务器扩展SERVEREXTENSIONINTERNET服务器应用程序INTERNETSERVERAPPLICATION,即ISA通知NOTIFICATION缓冲区BUFFER主框架窗口MAINFRAMEWINDOW实例INSTANCE句柄HANDLEVC入门必备基础知识(四)DOCUMENT,VIEW和APPLICATIONFRAMEWORK在MFC中,DOCUMENT,VIEW和APPLICATIONFRAMEWORK是3个非常重要的概念。顾名思义,APPLICATIONFRAMEWORK就是应用程序框架,你可以用这个框架来建立自己的WINDOWS程序,可以节省不少时间。你也可以不用框架而用手工一行一行的写出源代码,这样做的话工作量就太大了。如果你用APPLICATIONFRAMEWORK的话,框架就会自动产生一些源程序代码和标准的用户界面,你需要做的工作就是提供剩余的代码,完成特定的任务。另外,用MFC编程还要掌握一种重要的结构,即DOCUMENT/VIEW结构。在这里,DOCUMENT是指用户正在使用的数据,它是一个DATAOBJECT;VIEW是指用户所见到的DOCUMENT的视图,它是一个WINDOWOBJECT。例如在EXCEL中,同一数据可以制成不同的报表图(例如饼状图,条形图),而且当数据改变时,报表图也随之改变。使用DOCUMENT/VIEW结构可以利用APPLICATIONFRAME以及MFC的很多好处。而不使用DOCUMENT/VIEW结构,对于某些简单的程序可以提高性能,并可减少程序的大小。总的来说,DOCUMENT/VIEW结构就是通过CDOCUMENT和CVIEW来为DOCUMENT和VIEW提供框架。MFC中的应用程序主要可以分成两类,即SDI单文档界面,例如记事本和MDI多文本界面,例如WORD。SDI应用程序一次只能打开一个文档框架窗口,而MDI应用程序在一个主框架窗口中可以有多个子窗口,这些子窗口可以包含不同类型的文档。MDI比较复杂,我会在提高篇中再详细讨论这个问题的,在入门篇中我们只讨论SDI。在SDI应用程序中,主要有以下OBJECT结合上一节的内容有助于理解1、DOCUMENT从CDOCUMENT派生,代表应用程序的数据;2、VIEW从CVIEW派生,代表应用程序数据的”外貌”,用户通过VIEW来察看和操作DOCUMENT;3、FRAMEWINDOW从CFRAMEWND派生,提供了用来显示VIEW的文档框架窗口DOCUMENTFRAMEWINDOW。在SDI中,DOCUMENTFRAMEWINDOW也就是应用程序的主框架窗口MAINFRAMEWINDOW,VIEW就是显示在FRAMEWINDOW里面的;4、DOCUMENTTEMPLATE在SDI中是从CSINGLEDOCTEMPLATE派生的,CSINGLEDOCTEMPLATE又是从CDOCTEMPLATE派生的,主要用于创建和管理某种类型的DOCUMENT,每个DOCUMENTTEMPLATE创建和管理一个DOCUMENT;5、APPLICATION从CWINAPP派生,控制上面的4种OBJECT,并指定应用程序的行为,例如初始化等。APPLICATIONOBJECT也用来响应用户的行为(例如由用户产生的COMMANDMESSAGE)。在MFC应用程序中,并不是需要以上所有的OBJECT,以上那些OBJECT是可以按照不同的规律来组合使用的。例如在非DOCUMENT/VIEW结构的程序中,有以下两种情况1、一个CWINAPPOBJECT和一个对话框(要MODAL的,即类似文件打开那种对话框),在这种应用程序中,对话框用来显示和储存数据;2、一个CWINAPPOBJECT、一个MAINFRAMEWINDOWCFRAMEWND和一个VIEW,在这种应用程序中,VIEW用来定位数据储存和显示的地方。注意在非DOCUMENT/VIEW结构的程序中,一般是以重载CWINAPPINITINSTANCE函数开始的,重载CWINAPPINITINSTANCE函数的目的就是创建对话框或窗口。操作系统、应用程序和应用程序组件之间的通讯是通过不同种类的MESSAGE来实现的。例如,当创建一个应用程序的实例时,操作系统会发送一系列的MESSAGE给应用程序,应用程序就会响应相应的MESSAGE来初始化自己。键盘和鼠标也会使操作系统产生MESSAGE并把这些MESSAGE发送给相应的应用程序。用户界面组件(例如按钮)也会产生MESSAGE并将MESSAGE发送给他们的父窗口。最重要的两种MESSAGE是WINDOWMESSAGE和COMMANDMESSAGE。MFC通过CWND和CWND的派生类例如CVIEW,CFRAMEWND等来提供对WINDOWMESSAGE的支持,通过从CCMDTARGET派生的类来提供对COMMANDMESSAGE的支持。APPLICATIONFRAMEWORK会把MESSAGE和处理该MESSAGE的函数联系起来,这样MFC就可以把MESSAGE映射到处理该MESSAGE的函数。每个WINDOWSMESSAGE都有一个预先定义的宏MACRO,包括一个隐含的ID和处理函数的名字;而每个COMMANDMESSAGE的MACRO包括一个指定的ID和处理函数的名字。请看下面的源程序BEGIN_MESSAGE_MAPCMYVIEW,CVIEW/这是一个MACRO,标志MESSAGE映射的开始,注意参数为MESSAGE映射的CLASS这里是CMYVIEW及其基类这里是CVIEW的名字。这样的话,假如在CMYVIEW中找不到该MESSAGE的处理函数,FRAMEWORK还会在CVIEW中继续寻找该MESSAGE的处理函数。ON_WM_CREATE/这是一个处理WINDOWMESSAGE的宏,不需要MESSAGE的ID和它的处理函数的名字作为参数(因为这两个参数是隐含的),在这里,ON_WM_CREAT所处理的MESSAGE是WM_CREATE,该MESSAGE的处理函数是ONCREATE。大家分析一下宏ON_WM_CREATE,MESSAGEWM_CREATE和MESSAGE的处理函数ONCREATE这三者之间的命名规则。ON_COMMANDID_APPLY_SEQUENCE,ONAPPLYSEQUENCE/这是一个处理COMMANDMESSAGE的宏,需要MESSAGE的IDID_APPLY_SEQUENCE和处理该MESSAGE的函数的名字ONAPPLYSEQUENCE这两个参数END_MESSAGE_MAP/这是结束MESSAGE映射的宏你可以用VISUAL自带CLASSWIZARD或者WIZARDBAR这两个工具来添加MESSAGE映射,也可以用手工的方法来添加MESSAGE映射,我会在后面的章节中详细讨论MESSAGE的问题的。以下是本节新出现的专业名词应用程序框架APPLICATIONFRAMEWORK单文档界面SINGLEDOCUMNETINTERFACE,即SDI多文档界面MULTIPLEDOCUMNETINTERFACE,即MDI文档框架窗口DOCUMENTFRAMEWINDOW主框架窗口MAINFRAMEWINDOW宏MACRO用APPWIZARD来创建第一个应用程序几个小提示1、在使用VISUALC时,大家千万不要忽略了鼠标右键的功能,它会根据不同的情况来给出不同的快捷菜单,十分方便;2、如果你在源程序发现了不明白的地方(例如函数,MACRO,关键字等),你就把光标停留在他们上面,然后按”F1键就可以直接跳到相关的帮助文件了;3、你可以根据自己的需要来定制界面,VISUALC会”记住”你所做的改变的;4、把鼠标停留在函数,MACRO,关键字等地方或者双击它们,也会有些小作用,大家自己体会吧。VISUALC提供了很多向导来帮助你完成各种各样的程序,以后在需要使用向导时,我会详细介绍向导的使用方法的。现在我就举个例子,来说明APPWIZARD的使用方法。步骤如下1、运行VISUALC,选择”FILE”菜单中的”NEW”命令,会出现一个”NEW”对话框;2、在”NEW”对话框中选中”PROJECT”,然后选”MFCAPPWIZARDEXE”

温馨提示

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

评论

0/150

提交评论