




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、visual c+ 基本原理faq问:阅读以下文章需要具备哪些知识?答:只要会开机就行了,如果大家有c+和面向对象(object-oriented)的基础知识,会有事半功倍的效果。问:必须具备哪些软件?答:windows 98, windows nt, windows 2000中的任意一种,另外再加上visual c+ 5.0或6.0。由于我没有测试过windows 95和visual c+ 5.0以下的版本,所以不知道他们可不可用。问:为什么用visual c+?答:因为vc功能强而多。基本概念心情随笔:其实这一章是最枯燥的,概念又多,本来我不想写这一章的,但为了照顾初学者,我觉得还是有必要
2、讲一 下。由于这一章是属于”入门篇”的,所以大家只需要了解以下内容就行了,不需要深入研究其原理,到了”高级篇”时,我们还会重新仔细分析其原理的,希望大 家不会被这一章的内容吓跑,有问题就去本站的留言本留言吧。首先我们要了解以下概念:应用程序(application),他就是由指令(instruction)组成的可以运行的文件。进程(process),有时和应用程序的意思一样,但在通常的情况下,进程是指一个正在运行的应用程序,正因为这样,进程由以下部分组成:1、一个可以执行的程序2、位于内存(memory)中的私有地址空间3、系统资源(system resource),例如文件(file), 管
3、道(pipe), 通讯端口(communications port), 信号(semaphore)4、至少还要有1个线程(thread), 线程是最基本的执行单位。因为多个进程是可以同时存在时,所以windows操作系统(operating system)必须给进程提供保护,以防止他们冲突。物理内存(physical memory),即你的计算机的实际内存,例如我现在用的电脑的内存是128m,物理内存的容量是达不到程序的要求的,于是就产生了虚拟内存(virtual memory)。虚拟内存(virtual memory), 不是真正的内存,它通过映射(map)的方法,使可用的虚拟地址(virt
4、ual address)达到4g(2的32次方),每个应用程序可以被分配2g的虚拟地址,剩下的2g留给操作系统自己用。在windows nt中,应用程序可以有3g的虚拟地址。简单的说,虚拟内存的实现方法和过程是:1、当一个应用程序被启动时,操作系统就创建一个新进程, 并给每个进程分配了2g的虚拟地址(不是内存,只是地址);2、虚拟内存管理器(virtual memory manager)将应用程序的代码(code)映射到那个应用程序的虚拟地址中的某个位置,并把当前所需要的代码读取到物理地址中。注意,虚拟地址和应用程序代码在物理内存中的位置是没有关的;3、如果你有使用动态链接库(dynamic-
5、link library,即dll)的话,dll也被映射到进程的虚拟地址空间,在有需要的时候才被读入物理内存;4、其他项目(例如数据,堆栈等)的空间是从物理内存分配的,并被映射到虚拟地址空间中;5、应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置。如果大家看不明白上面的步骤也不要紧(似乎超出了入门篇的范围),但大家要明白以下两点:1、应用程序是不会直接访问物理地址的;2、虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问;使用虚拟内存的好处是:简化了内存的管理,并可以弥补物理内存的不足;可以防止在多任务(multitasking)环境
6、下的各个应用程序之间的冲突。线程(thread),是最基本的执行单位,cpu时间就是分配给每个线程的。每个进程一开始时只有一个线 程,但每个线程都可以产生出其他线程,前者叫做父线程(parent thread),后者叫做子线程(child thread)。每个执行的线程都有自己的虚拟输入队列(virtual input queue),用来处理来自硬件、处理器(processor)或操作系统的消息(message)。这些队列都是异步的,也就是说,当处理器发送一个消 息给另外一个线程的队列时,发送函数不用等待其他线程处理该消息就可返回,而接收消息的线程可以等到该线程准备好时再访问并处理接收到的消息
7、。多线程(multithread),如果一个进程中有多个线程同时存在,就叫做多线程了。多任务(multitasking),即多个程序看起来好像是在同时执行,其实并不是同时的,只不过因为时间太短,人类感觉不出来而已。其原理是操作系统分配给每个线程一个非常短(大约百分之秒)的时间片,每个线程轮流切换执行,这个过程叫做场境转换(context switching)。场境转换(context switching),是指:1、运行一个线程直到该线程的时间片用完,或者这个线程必须等待其他的资源;2、保存这个线程的场境;3、取出其他线程的场境;4、只要有线程在等待执行,就会不停的重复以上过程。raw inp
8、ut thread(rit), 是指用来接收所有由键盘和鼠标产生的事件(event)的线程,它是一个特殊的系统线程,每当rit接收到处理器发出的硬件(hardware)事件,它 就把那些事件放到相应线程的虚拟输入队列中。因此,应用程序的线程通常是不用等待它的硬件事件的。事件驱动(event-driven)编程,windows-based的应用程序运行后,就会一直等待,直 到有用户发布命令(例如:按一个按钮或选中一个菜单)之类的事件发生,这就叫做事件驱动编程(event-driven programming)。它同dos下的应用程序的最大区别就是:dos下的应用程序是通过命令行加参数的方法来控制
9、应用程序的执行,而windows -based的应用程序是通过图形用户界面(gui)来控制应用程序的执行。用户所产生的事件,在程序里就会转化为消息,不同的事件产生不同的消息,从而 可以产生不同的响应。终于讲完这一节了,大家看得明白吗?如果不明白的话,那就一字一句的从头到尾再看一遍吧。如果还不明白,那就请跳过这一节吧,我在后面的章节中还会逐步解释这些概念的。在本章的最后一节我将会举一个具体的程序来说明windows-based应用程序的结构和组成元素。以下是本节出现的专业名词应用程序 = application指令 = instruction进程 = process内存 = memory系统资源
10、 = system resource文件 = file管道 = pipe通讯端口 = communications port信号 = semaphore线程 = thread物理内存 = physical memory虚拟内存 = virtual memory映射 = map虚拟地址 = virtual address虚拟内存管理器 = virtual memory manager代码 = code动态链接库 = dynamic-link library,即dll数据 = data堆栈 = stack多任务 = multitasking父线程 = parent thread子线程 = chil
11、d thread多线程 = multithread场境转换 = context switching虚拟输入队列 = virtual input queue处理器 = processor操作系统 = operating system消息 = message队列 = queueraw input thread = rit事件 = event硬件 = hardware事件驱动 = event-driven事件驱动编程 = event-driven programming图形用户界面 = guiwindows下的程序的结构和组成元素windows下的程序的基本组成元素是代码, 用户界面资源(user
12、interface resource)和动态链接的库模块(library module)。代码,是应用程序的主要内容,windows下的应用程序必须要有两个函数:1、winmain,它为操作系统提供了进入点(entry point),是所有windows-based应用程序都必须要有的函数。它也用来创建初始window和启动message检索;2、window procedure,它用于处理所有从操作系统发送到window的message,每一个window都有一个相关联的window procedure。window procedure用来决定window的client area(即客户窗口
13、,例如notepad中用来写字的空白部分)显示什么以及如何响应用户的输入。window procedure处理message时,既可以用专门添加的代码来处理message,也可以直接把message传递给默认的window proceduredefwindowproc。一个windows-based应用程序可以包含多个不同名的window procedure。 用户界面资源,菜单(menu),对话框(dialog box)等图形用户界面的元素,就叫做资源。它们被当成模板(template)储存在相应的可执行文件或dll文件的只读(read-only)区域,当有需要时,windows就调用这个资
14、源区域并动态创建所需要的gui元素。主要有以下几种资源:accelerator(快捷键表), 储存快捷键和相应的命令bitmap(位图),一种图形格式diablo box,包含对话框的控件(control), 布局和属性的细节icon(图标),一种特殊的位图menu(菜单),包含菜单及其选项的文本和布局string table(字符串表),储存字符串及其idtoolbar(工具栏),包含工具栏的布局和按钮的位图version(版本),储存程序的状态信息,例如程序名,作者,版权,版本号等cursor(光标),包含用于绘制光标的特殊的位图库模块,主要是指在运行时可以被动态链接的二进制文件,即dll
15、。默认的window proceduredefwindowproc,是windows系统提供的一个函数,用于处理某些通用的win32-based应用程序的 messages(例如最大化、最小话窗口,显示目录等)。如果defwindowproc不能处理该message,那么它就被忽略。当一个应用程序被启动时,将会按顺序发生下列事件(上一节也提到过这个问题)1、操作系统创建一个新进程和一个起始线程;2、应用程序的代码被载入内存;3、dll也被载入内存(如果有的话);4、从物理内存分配其他项目(例如数据,堆栈等)的空间,并被映射到虚拟地址空间中;5、应用程序开始执行。在windows-based应用
16、程序中,windows是应用程序和用户之间传递信息的主要方法。windows-based的应用程序为了接收从系统队列传来的message,是通过以下方法实现的:1、当windows-based的应用程序启动后,操作系统和这个应用程序就通过进入点(winmain函数)联系起来。2、应用程序创建一个或多个windows,每个window都包含有一个window procedure函数,用来决定window显示什么以及window如何响应用户的输入。3、有专门的代码将message队列中的message循环检索出来,并传递给相应的window procedure,而不是直接传给window。这样就可
17、以使应用程序在message被送到window之前预先处理它。到了下一节,我们将会用一个简单的源程序说明以上元素和步骤。以下是本节新出现的专业名词用户界面资源 = user interface resource库模块 = library module进入点 = entry point客户窗口 = client area(例如notepad中用来写字的空白部分) 菜单 = menu对话框 = dialog box模板 = template只读 = read-only控件 = control快捷键表 = accelerator位图 = bitmap图标 = icon字符串表 = string ta
18、ble工具栏 = toolbar版本 = version光标 = cursor动态链接 = dynamic linking源程序示例本节列出了一个简单的源程序,来说明上两节的内容。请大家结合上两节的内容来看看下面的源程序,不需要完全看懂,只用理解大概的框架和流程就行了,注意黑体字部分。源程序如下: / 摘自/library/partbook/win98dh/thewinmainprocedure.htm/ 包含头文件windows.h#include / 预先声明message handler,可以叫做任何名字,这里是mywindowproced
19、urelresult callback mywindowprocedure(hwnd,uint,wparam,lparam);/ 以下是所有windows程序都需要的winmain函数/ winmain主要用来实现三个功能:/ 1. 注册window class;/ 2. 在内存中创建window并初始化window的属性;/ 3. 创建一个message loop来检查message queue中有没有该window的m winapi winmain(hinstance hinstance, hinstance hprevinstance,lpstr lpszcmdlin
20、e,int ncmdshow)static char szappname = “winhello”; / 定义一个字符串hwnd hwnd; / 定义一个window handle变量msg msg; / 定义一个message结构的变量,用来储存message的信息wndclass wc; / 定义一个window class数据结构,用来储存window class的属性/下面这段代码用来定义window的属性,例如message handler的地址、窗口背景、光标和图标等wc.style=cs_hredraw|cs_vredraw; / 设置style: 当窗口改变大小时就重新绘制窗口
21、wc.lpfnwndproc=(wndproc)mywindowprocedure; / 设定window procedurewc.cbclsextra=0; / 用来储存class structure后的额外的数据,这里不需要wc.cbwndextra=0; / 用来储存window instance后的额外的数据,这里不需要wc.hinstance=hinstance; / window procedure所在的instancewc.hicon=loadicon(null,idi_application); / class的图标wc.hcursor=loadcursor(null,idc_
22、arrow); / class的光标wc.hbrbackground=(hbrush)(color_window+1); / 背景刷wc.lpszmenuname=null; / 菜单资源的名字,这里没有wc.lpszclassname=szappname; / 应用程序的名字/ 注册window,通过调用api函数registerclass来实现/ 注册window class的一个目的就是将window和window procedure关联起来registerclass(&wc);/ 注册window class后,winmain就调用createwindow函数来创建应用程序的windo
23、whwnd=createwindow(szappname, / 已注册的class名字“hello, world windows_98 style”, / window名字ws_overlappedwindow, / window风格cw_usedefault, / window起点的x坐标cw_usedefault, / window起点的y坐标cw_usedefault, / window的宽度cw_usedefault, / window的高度hwnd_desktop, / 父窗口的handlenull, / 菜单的handlehinstance, / 应用程序instance的hand
24、lenull / window-creation数据的指针);/ 以下两条语句用来显示windowshowwindow(hwnd,ncmdshow);updatewindow(hwnd);/ 用while循环语句来检索并发送messages/ 从message queue中检索message,并将它放到变量msg中。/ 当收到”wm_quit”这个message时,getmessage函数就返回0,循环结束。而且winmain函数也结束,程序终止。 while(getmessage(&msg,null,0,0) translatemessage(&msg); / 将virtual-key me
25、ssages转化为character messagesdispatchmessage(&msg); / 将message发送到window procedurereturn msg.wparam;/ mywindowprocedure函数处理wm_paint和wm_destroy这两个message,然后必须调用defwindowproc去处理其他messagelresult callback mywindowprocedure(hwnd hwnd,uint message,wparam wparam,lparam lparam)paintstruct ps; / 定义一个paintstruct
26、结构的变量,用来储存绘制window的client area的信息hdc hdc; / 定义一个hdc变量lpctstr text=”welcome!”; / 定义一个lpctstr类型的字符串指针/ 用switch语句来处理wm_paint和wm_destroy这两个messageswitch(message)case wm_paint:/ 下面5条语句是用来在屏幕上输出文字的,我们在后面的章节会详细讨论这个问题的,这里就不多说了hdc=beginpaint(hwnd,&ps);rect rect;getclientrect(hwnd,&rect);textout(hdc,(rect.rig
27、ht-rect.left)/2,(rect.bottom-rect.top)/2,text,strlen(text);endpaint(hwnd,&ps);return 0;/ 处理退出消息case wm_destroy:postquitmessage(0);return 0;/ 调用默认的window procedure,使所有message都可以被处理return defwindowproc(hwnd,message,wparam,lparam);运行上面程序的步骤:1、选菜单 filenewprojectswin32 application2、在project name中输入vchack
28、_01_002_003(其它名字也行)3、其他地方就保留默认值就行了,然后按”ok”4、选中”an empty project”,然后按”finish”5、再按次”ok”6、按toolbar上的按钮”new text file”新建一个空白文件7、将以上源程序复制到那个空白文件中,然后按toolbar上的按钮”save”来储存文件,文件名为vchack_01_002_003.cpp8、按左下角的”fileview”,然后按”vchack_01_002_003 files”旁边的”+”号展开这个目录9、在”source files”上按鼠标右键,选”add files to folder”10、
29、选中vchack_01_002_003.cpp这个文件,然后按”ok”11、选”build”菜单中的”build vchack_01_002_003.exe”12、选”build”菜单中的”execute vchack_01_002_003.exe”来运行这个程序以下是本节新出现的专业名词类 = class窗口类 = window class数据结构 = data structure消息处理器 = message handler实例 = instance句柄 = handle工程 = project mfc简介微软基础类库(microsof foundation class library)和
30、visual c+提供了一个创建各种各样应用程序的环境,并简化了其中部分工作。mfc library是class的集合,大约有250个class,在很大程度上扩展了c+语言;mfc library也是一个应用程序框架(application framework),它定义了应用程序的结构(当然你也可以用源程序一行一行地写出自己的应用程序结构,不过这样比较麻烦),并可以处理应用程序的一些常规任务。如果你想用mfc进行程序开发,首先你必须熟悉mfc所包含的class以及各个class之间的关系。mfc class是有层次的(mfc的层次图请看/libr
31、ary/devprods/vs6/visualc/vcmfc/_mfc_hierarchy_chart.htm,请大家务必要看,最好把它保存下来,以便日后查找),有些class可以直接使用,而有些class是作为其他class的基类(bass class)一般不直接使用。为了学习的方便,一般将mfc class划分为以下几个种类:cobject-derived classesapplication architecture classesuser-interface classesgeneral-purpose classesactivex classesdatabase classesint
32、ernet classesglobal afx functions以上划分的种类之间决不是相互独立的,大多数的mfc classes是直接或间接从cobject class派生的,cobject class是mfc library中最基本的class。下一节我将会分别对以上几个种类的classes做一个简单的介绍,然后我还会分别用1至2章来详细介绍上面的几种classes。这一节的内容比较少,请大家仔细看看mfc的层次图。mfc的命名规则是:class名以c开头,其他地方顾名思义。以下是本节新出现的专业名词微软基础类库 = microsof foundation class library微软
33、基础类 = microsof foundation class (即mfc)应用程序框架 = application framework基类 = bass classmfc的层次、分类和作用心情随笔:本节有很多专业名词,其实这些单词从字面上并不难理解,例如”document”,中文是” 文本”的意思,但假如把”document class”直接翻译成”文本类”的话,可能会把很多人搞混淆了,我觉得”文本类”比”document class”更难理解,正因为如此,所以我决定不把那些容易搞混淆的专业名词直译成中文了。我非常反感市面上的一些电脑书完全直译国外作品,可能是由于翻 译者的电脑水平不行,把一
34、些专业名词凭空想象,例如有的把”serialization”翻译成”序列化”,有的又翻译成”串行化”,完全脱离了原意。本节将简要介绍mfc所包含的主要几种class,大家最好要记住mfc的分类和各个class的作用(特别是cobject派生的(cobject-derived) classes,应用程序结构(application architecture) classes,用户界面(user-interface) classes这三种,一定要记住),这是后面章节的基础。大家现在无需知道各个class的使用方法,因为我会在后面详细说明的。注:以下内容有部分摘自msdn,其实我也记不住那么多cla
35、ss,一般是有需要才去查帮助文件的。一、cobject派生的(cobject-derived) classescobject是mfc大多数class的基类,它主要提供了一些基本功能,主要包括:serialization,指把对象(object)从存储媒体(例如磁盘上的文件)中读出或写入的过程;run-time class信息,指从cobject派生的对象包含有在运行时可以访问的信息;诊断输出,指cobject提供了一些输出函数,这些函数可以输出程序执行过程中的一些信息,可以帮助你调试程序。从cobject派生的类为mfc应用程序提供了基本的结构和功能,重要的有以下几种:类别基类描述comman
36、d targetsccmdtarget用于处理用户请求applicationscwinapp代表应用程序的核心documentscdocument包含应用程序的数据集windowscwnd主要用于图形用户界面(gui)的对象,可以处理常见的windows messagesframescframewnd用于应用程序的主要window框架viewscview用于显示数据并于document对象交互此外,cobject-derived class还包括用于菜单、文件服务、图形等方面的class。mfc也包含了一些不是从cobect派生的类,这些类相对来说可以节省开销,主要分为以下几种:1、用于常规编
37、程的实用类,例如:cstring, ctime, ctimespan, crec, cpoint, csize;2、mfc结构的支持类,例如carchive, cdumpcontext, cruntimeclass, cfilestatue, cmemorystate3、用户定义指针的集合类,例如ctypedpointerarray二、应用程序结构(application architecture) classes应用程序结构class代表应用程序的基本结构元素,主要包括cwinapp, cdocument, ccmdtarget和cwinthread。当应用程序开始运行时,这些class是最
38、先被初始化的,它们都有很重要的作用。1、cwinapp, 代表应用程序自己,所有的mfc应用程序都从cwinapp派生一个class。根据应用程序框架(framework)的种类,应用程序的对象(object)要完成以下工作:(1) 初始化(initialize)应用程序(2) 建立document template结构(3) 循环检索message queue中的message并派送这些message到相应的地方(4) 当应用程序退出时要进行”清理”工作2、cdocument, 它是使用document/view结构的应用程序中的document的基类。这里的document代表程序中的数据
39、,是一个抽象概念,我们在开发程序时必须考虑数据如何储存到document中。3、ccmdtarget,它是mfc的message映射的基础class,从ccmdtarget派生的类可以成为command messages的目标。command messages是指由用户选择菜单或按钮等行为产生的messages。4、cwinthread,它的成员函数可以使mfc应用程序创建和管理线程。三、用户界面(user-interface) classes用户界面classes主要包含windows-based应用程序的一些可视性元素,例如:窗口、菜单、对话框、控件(control)等,它还封装(enca
40、psulate)了windows device context对象和graphics device interface(gdi)对象。用户界面class包括cwnd, cview, cgdiobject和menu这几个主要class:cwnd,它是所有mfc windows的基类,它定义了window的基本功能和window对大部分message的默认响应。cwnd可以直接用来派生其他class,但通常情况下,class是从cwnd派生的class派生的,从cwnd派生的class主要有:cframewnd,主要用于单文档界面(single document interface, 例如写字板之
41、类的程序,一次只能打开一个window);ccontrolbar,是工具栏,状态栏等控件的基类;cdialog,提供对话框的功能;cbutton, clistbox, cscrollbar等,主要用于按钮,列表框,滚屏栏等控件。cview,是document/view(一种应用程序的结构,下节再讲)应用程序的视图的基类;cgidobject,它包含一些用于显示输出的对象(例如pen, brush, font等),使mfc应用程序可以创建和使用这些对象。gdi最大的好处就是提供了设备无关性(device-independent),使到开发人员无需考虑不同设备的问题。cmenu,主要用于提供菜单界
42、面,通过cmenu,应用程序可以在运行时动态改变菜单的内容。四、常规用途(general-purpose) classesgeneral-purpose classes包括各种各样的数据类型,常用的有:cfile,用于文件的输入/输出cstring,用于管理字符串变量cexception,用于处理exceptioncbytearray, cintarray, cstringarray, cstringlist, coblist, 用于数据结构,例如数组和列表cpoint, csize, crect, ctime, ctimespan,杂项五、activex classesactivex cla
43、sses可以简化activex的编程和activex api的访问,activex的主要作用和功能是:创建activex控件和activex控件容器通过自动化(automation),是一个程序控制另一个程序创建包含有多种数据类型(例如文字、图片、声音等)的文档,既复合文档创建可以嵌入复合文档的ole object使用拖放(drag-and-drop)方式可以在两个应用程序之间复制数据activex class的分类如下:activex control classes包括colecontrolmodule, colecontrol, cconnectionpoint, cpicturehold
44、er, cfontholder, colepropertypage, cpropexchange, cmonikerfile, casyncmonikerfile, cdatapathproperty, ccacheddatapathproperty, colecmdui, colesafearrayactive document classes包括cdocobjectserver, cdocobjectserveritemactivex-related classes包括coleobjectfactory, colemessagefilter, colestreamfile, crecttr
45、ackerautomation classes包括coledispatchdriver, coledispatchexceptioncontainer classes包括coledocument, colelinkingdoc, cdocitem, coleclientitemole server classes包括coleserverdocole drag-and-drop and data transfer classes包括coledropsource, coledatasource, coledroptarget, coledataobjectole common dialog cla
46、sses包括coledialog, coleinsertdialog, colepastespecialdialog, colelinksdialog, colechangeicondialog, coleconvertdialog, colepropertiesdialog, coleupdatedialog, colechangesourcedialog, colebusydialog 创建activex比较难,我会在”提高篇”中详细讨论的。六、数据库(database) classes数据库编程是非常枯燥的,但我们不得不承认数据库非常有用,连接数据库然后访问数据是常用的数据库编程方法。m
47、fc提供了一些类,这些类可以通过开放式数据库连结(open database connectivity, 即odbc)和数据访问对象(data access object, 即dao)来操作数据库。database classes主要包括cdatabase, cdaodatabase, crecordset, cdaorecordset。cdatabase或cdaodatabase的object代表一个和数据源(data source)的连接,通过这个object就可以操作数据源了。这里的数据源是指数据库中的数据的实例(instance)。crecordset或daorecordset的obj
48、ect代表从数据源中选中的数据的集合,叫做recordset。crecordset和daorecordset的object有两种形式:dynasets, 动态的,假如数据库被更新,recordset也同步被更新;snapshot,静态的,它只反映了在recordset被调用时的状态,不会随着数据库的更新而更新。cdaorecordset还可以直接代表数据库的表(table)。七、internet classesinternet classes不但可以用于internet,还可以用于intranet(企业内部网)。mfc包括wininet apis(提供客户端的class)和internet s
49、erver api(即isapi,提供服务器端的class)。客户端的class主要有以下几个:cinternetsession, 创建并初始化一个或多个同步的internet session(会话),它有3个主要函数gethttpconnection, getftpconnection和getgopherconnection(这3个函数的作用大家可以顾名思义)。chttpconnection, 管理应用程序对http服务器的连接。cftpconnection, 管理应用程序的ftp连接,它包含了一些用于搜索远程目录和文件的函数。cgopherconnection,管理应用程序的gopher连
50、接,它也包含了一些用于搜索不同类型文件的函数。cfilefind,它是cftpfilefind和cgopherfilefind的基类,提供了搜索和定位的功能,并可返回文件的信息,它们都还支持通配符查询。服务器端的class主要有以下几个:chttpserver, 可用于创建和管理一个服务器扩展(server extension)dll,也叫做internet服务器应用程序(internet server application,即isa)。isa一般用来扩展一个internet服务器的能力。chttpservercontext, 被chttpserver用来封装单个客户端请求的实例(insta
51、nce)。chttpfilter, 这个class可以用来创建一个具有过滤客户数据功能的dll。chttpfiltercontext,被chttpfilter用来封装单个客户通知(notification)的实例(instance)。chtmlstream, 封装html数据缓冲区(buffer),该buffer是被chttpserver用来应答客户的。八、全局afx函数(global afx functions)global afx functions不属于任何class,它们以afx开头,可以在应用程序的绝大多数地方被直接调用(这点和class的成员函数有很大不同)。常用的全局afx函数有
52、:afxabort(), 无条件中断应用程序afxmessagebox(), 显示一个消息框afxgetapp(), 返回一个指向project的cwinapp object的指针afxgetappname(), 返回应用程序的名字,类型为一个指向字符串的指针afxgetmainwnd(), 返回指向主框架窗口(main frame window)的指针afxgetinstancehandle(), 返回当前应用程序的实例(instance)的句柄(handle),即hinstance以下是本节新出现的专业名词派生 = derive连续化 = serialization对象 = object集
53、合类 = collection classes框架 = frame框架 = framework 重载 = override初始化 = initializedocumentcommand messages封装 = encapsulate控件 = control设备环境 = device context图形设备接口 = graphics device interface (gdi)单文档界面 = single document interface设备无关性 = device-independent异常或例外 = exceptionactivex控件 = activex controlactivex
54、控件容器 = activex control container自动化 = automation拖放 = drag-and-drop数据源 = data source实例 = instance企业内部网 = intranet客户端 = clien-side服务器端 = server-side会话 = session服务器扩展 = server extensioninternet服务器应用程序 = internet server application,即isa通知 = notification缓冲区 = buffer主框架窗口 = main frame window实例 = instance句
55、柄 = handledocument, view和application framework在mfc中,document, view和application framework是3个非常重要的概念。顾名思义,application framework就是应用程序框架,你可以用这个框架来建立自己的windows程序,可以节省不少时间。你也可以不用框架而用手工一行一行的写出源代码,这样做的话工作量就太大了。如果你用application framework的话,框架就会自动产生一些源程序代码和标准的用户界面,你需要做的工作就是提供剩余的代码,完成特定的任务。另外,用mfc编程还要掌握一种重要的结构
56、,即document/view结构。在这里,document是指用户正在使用的数据,它是一个data object;view是指用户所见到的document的视图,它是一个window object。例如在excel中,同一数据可以制成不同的报表图(例如饼状图,条形图),而且当数据改变时,报表图也随之改变。使用document/view结构可以利用application frame以及mfc的很多好处。而不使用document/view结构,对于某些简单的程序可以提高性能,并可减少程序的大小。总的来说,document/view结构就是通过cdocument和cview来为document和v
57、iew提供框架。mfc中的应用程序主要可以分成两类,即sdi(单文档界面,例如记事本)和mdi(多文本界面,例如 word)。sdi应用程序一次只能打开一个文档框架窗口,而mdi应用程序在一个主框架窗口中可以有多个子窗口,这些子窗口可以包含不同类型的文档。 mdi比较复杂,我会在提高篇中再详细讨论这个问题的,在入门篇中我们只讨论sdi。在sdi应用程序中,主要有以下object(结合上一节的内容有助于理解):1、document:从cdocument派生,代表应用程序的数据;2、view:从cview派生,代表应用程序数据的”外貌”,用户通过view来察看和操作document;3、frame window:从cframewnd派生,提供了用来显示view的文档框架窗口(document frame window)。在sdi中,document frame window也就是应用程序的主框架窗口(main frame window),view就是显示在frame window里面的;4、document template:在sdi中是从csingledoctemplate派生的,csingledoctemplate又是从cdoctemplate派生的,主要用于创建和管理某种类型的document,每
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论