课后习题答案(4)

2019-08-01 23:59

CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CEditorDoc), RUNTIME_CLASS(CMainFrame),

RUNTIME_CLASS(CEditorView)); if (!pDocTemplate)

return FALSE;

AddDocTemplate(pDocTemplate);

2. 文档数据串行化的意义是什么?怎样实现它的序列化?

答:文档串行化(Serialization)是指对象的持续性,即对象可以将其当前状态,由其成员变量的值表示,写入到永久性存储体(通常是指磁盘)中。下次可以从永久性存储体中读取对象的状态,从而重建对象。这种对象的保存和恢复的过程称为串行化。对象的可持续性允许将一个复杂的对象网络保存到永久性存储体中,从而在对象从内存中删去后仍保持它们的状态。以后,可以从永久性存储器中载入对象并在内存中重载。保存和载入可持续化、串行化的数据通过CArchive对象作为中介来完成。

3. 什么是主窗口和文档窗口?

答:框架的本质是一个Windows窗口。但是在框架上可以放置菜单、工具栏、状态栏等,而视图则放在框架的客户区。MFC中看到的窗口实际上Frame和View共同作用的结果。在某一时刻,程序中只有一个活动的文档、框架和视图,即当前的文档、框架和视图。视图在文档框架窗口中显示,它是框架窗口的子窗口。对于SDI程序,文档框架窗口也就是应用程序的主框架窗口。在MDI应用程序中,文档框架窗口是显示在主框架窗口中的子窗口。 4. 文档模板的作用是什么?如何创建文档模板? 答:文档模板负责创建文档、视图和框架窗口。

MFC提供了一个文档模板类CDocTemplate支持文档模板。文档模板类是一个抽象的基类,它定义了文档模板的基本处理函数接口。由于它是一个抽象基类,因此不能直接用它来定义对象而必需用它的派生类。对一个单文档界面程序,使用CSingleDocTemplate(单文档模板类),而对于一个多文档界面程序,使用CMultipleDocTemplate。 5. 对于SDI应用程序来说,能否有多个文档类型?应如何实现?

答:需要将CSingleDocTemplate改为CMultiDocTemplate,CMainFrame也要改为从CFrameWnd改为CMDIChildWnd或其派生类。

6. 视图类的派生类有哪些?其基本使用方法有哪些? 答:CscrollView-视图需要滚动条

CFormView-视图按一个对话框模板资源来布置用户界面 CEditView-提供简单的多行文本编辑控件视图

7. 什么是文档/视图结构?它们的工作机制是什么?

答:文档视图结构将数据操作和数据显示、用户界面分离开。文档只负责数据管理,不涉及用户界面;视图只负责数据输出与用户界面的交互,可以不考虑应用程序的数据是如何组织的,甚至当文档中的数据结构发生变化时也不必改动视图的代码。

在文档视图结构里,文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元;另外它还提供了管理和维护数据的手段。文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但它不必是一个磁盘文件,文档的数据源也可以来自串行口、网络或摄像机输入信号等。文档对象负责来自所有数据源的数据的管理。 视图给用户提供了一个与文档中的数据交互的界面,它把用户的输入转化为对文档中数据的

操作。每个文档都会有一个或多个视图显示,一个文档可以有多个不同的视图。比如,在Excel电子表格中,可以将数据以表格方式显示,也可以将数据以图表方式显示。一个视图既可以输出到窗口中,也可以输出到打印机上。

8. 说明主窗口、文档窗口、视图及文档之间的相互关系。

答:主窗口提供程序的框架,负责提供给视图“驻留”,文档窗口负责程序中文档的管理,文档用于保存数据,视图用于对文档中的数据进行“表现”。 9. 简述单文档应用程序的启动过程?各类之间的如何互访?

答:首先,定义了一个全局变量theApp,它代表了整个程序的存在,然后程序开始进入入口点。AfxWinMain就是这个程序的入口点,就好像第一次看到C语言中的main函数一样。在AfxWinMain中分别调用了一些类的成员函数,仿照前面的分析方法,也可以画出一个程序执行路径图。入口点“AfxWinMain”?“AfxGetThread”?“AfxGetApp”?“AfxWinInit”? “pApp->InitApplication”? “pThread->InitInstance”? “pThread->Run”。 10. 文档、视图和窗口三者之间如何通信?各调用哪些函数实现互访?

答:文档视图结构的核心就在于文档、视图、框架之间的关联,形成了一个有机的可运作的整体。

访问对象 应用程序App 主框架窗口 访问位置 任何位置 任何位置 框架类中 视图 文档类中 文档类中 文档 文当模版类中 框架类中 主框架类中 视图类中 文档类中 文档模版 应用程序App中 访问实现 AfxGetApp; AfxGetMainWnd; AfxGetApp->m_pMainWnd; GetActiveView GetFirstViewPosition GetNextView GetDocument GetFirstDocPosition GetNextDoc; GetActiveDocument MDIGetActive GetActiveFrame GetParentFrame GetDocTemplate GetFirstDocTemplatePosition GetNextDocTemplate 子框架类(MDI中) 11. 请列举文档类中有哪些重要函数,各有什么作用?列举视图类中有哪些重要函数,各有什么作用?框架类和应用程序类各有哪些重要函数,各代表什么意义? 答:文档类的Serialize函数专门负责文件读写操作,UpdateAllViews更新与该文档有关的所有视图的方法,文档类的数据成员初始化工作是在OnNewDocument函数。视图OnDraw函数负责显示数据,GetDocument得到与之相关联的文档对象的指针,应用程序类InitInstance函数初始化创建一个和多个文档模板。框架类的OnCreate负责程序框架、菜单、工具条等资源的建立。

12. 编写一个基于单文档的简单字处理程序,该程序能够实现文件的打开和保存,字体的格式化等操作。 答:略

13. 编程程序,使用CFile来操作文件,实现创建、修改和保存功能。 答:略

14. 什么是静态分割窗口和动态分割窗口?它们有何异同?如何在文档窗口(视图)中添加动态和静态切分功能?

答:分割窗口分为两类:动态分割窗口和静态分割窗口。动态分割窗口是指:用户可以动态的分割和除去分割窗口,分割窗口会创建和删除相应的窗格。Microsoft Word就是使用动态分割窗口的例子,这是一种最常用的分割窗口。静态分割窗口是指在窗口创建时,分割窗口的窗格就已经创建好了,且窗格的数量和顺序不会改变。窗格为一个分割条所分割,用户可以拖动分割条调整相应的窗格的大小。

不论动态分割还是静态分割都会使用CSplitterWnd类,CSplitterWnd是一种特殊的框架窗口类,每个窗口都被相同的或者不同的视图所填充。CSplitterWnd类的主要函数包括下面三个: ? BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,

CCreateContext* pContext,DWORD dwStyle,UINT nID);

Create函数用来创建动态切分窗口,pParentWnd 切分窗口的父框架窗口,nMaxRows,nMaxCols是创建的最大的列数和行数,sizeMin是窗格的现实大小,pContext 大多数情况下传给父窗口,nID是字窗口的ID号。

? BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle, UINT nID);

CreateStatic用来创建切分窗口,参数含义同上。

? BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit, CcreateContext* pContext);

CreateView为静态切分的窗口的网格填充视图,在将视图于切分窗口联系在一起的时候必须先将切分窗口创建好,参数含义同上。

15. 编写一个单文档应用程序,实现单文档两视图(一个基于CView,一个基于CFormView),在基于CFormView的视图上添加两个输入框,在基于CView的视图显示输入的数据。 答:略

第八章习题 参考答案

1. 什么是动态链接库?生成的动态链接库应放在哪些目录下才能被应用程序使用?

答:动态链接库(Dynamic Linkable Library,DLL):是一种用来为其它可执行文件(包括EXE文件和其它DLL)提供共享的函数库。

可以将需要使用的DLL文件存放于以下目录中: ? 当前进程的可执行模块所在的目录 ? ? ?

当前目录

Windows系统目录:可以用GetSystemDirectory函数来检索此目录的路径

Windows目录:可以用GetWindowsDirectory函数来检索此目录的路径 ? 列在Path中的一系列目录

2. Visual C++支持哪几种DLL?在实际编程中如何选择DLL的类型?

答:Visual C++.NET支持3种DLL:非MFC DLL、规则DLL和MFC扩展DLL。

? 非MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLL。

? ?

规则DLL:和MFC扩展DLL一样,是使用MFC类库编写的。

MFC扩展DLL:与规则DLL相比,使用扩展DLL可以导出一个从MFC所继承下

来的类。

对于如何选择使用这些类型的DLL,一般遵循以下的建议:

? ?

如果DLL不使用MFC,则使用Visual C++生成非MFC的Win32 DLL。

如果DLL要使用MFC,并且要被MFC或非MFC应用程序使用,则必须生成动态链接到MFC的规则DLL或静态链接到MFC的规则DLL。

? 如果DLL仅由MFC可执行文件使用,则可以选择生成规则DLL或扩展DLL。 3. 从DLL中导出函数有哪两种方法?

答:使用模块定义(module DEFinition , DEF)文件和使用关键字_declspec(dllexprot)。

1.使用模块定义文件

操作步骤:

? 在所有函数的定义和实现部分的头部加 extern “C” ?

在定义文件(.def)中添加:函数名@该函数的序号值。 2.使用关键字_declspec(dllexport) 导出DLL 操作步骤:在所有变量和函数之前加 ? ?

extern “C” _declspec(dllexport)

当dll导入时改成“_declspec(dllimport)”

3.也可以使用模块定义文件导出类,但是需要把成员变量和成员函数分别添加到DLL的模块定义DEF文件中。

操作步骤:

? 在”class”之前加 extern “C” ? ”class”之后加 _declspec(dllexport)

4.对于MFC扩展DLL工程来说,需要使用关键字AFX_EXT_CLASS来标识需要导出的基于MFC的类。

4. 什么情况下需要加载DLL的导入库(.lib)文件,加载的方法有哪几种?

答:在应用程序生成EXE文件之前,需要把DLL对应的头文件(.h)包含到当前项目目录中,在这个头文件中给出了DLL中定义的函数原型,然后将导入库(.lib)文件加载至当前项目中。加载Dll的导入库(.lib)文件有如下3种方法:

? LIB文件直接加入到项目文件列表中

在解决方案管理器中,选中项目名,单击鼠标右键,然后在弹出的快捷菜单中依次选择“添加”→“现有项”命令,在弹出的文件对话框选择要加入DLL的LIB文件即可。

? 在程序的StdAfx.h头文件中加入下述预编译指令指定LIB文件 #pragma comment(lib,\指定的lib文件名\

? 设置项目的项目属性来加载DLL的LIB文件

依次选择“项目”→“属性”→“链接器”→“输入”选项,然后再“附加依赖项”文本框中输入DLL的导入库(.lib)文件的完整路径。

5. 简述动态加载DLL有哪些基本步骤,并出各个步骤中用到的函数。 答:为了实现动态调用DLl,应用程序必须执行以下操作:

? 用LoadLibrary函数显示地加载动态链接库,并获取模块句柄

函数原型如下:

HMODULE LoadLibrary( LPCTSTR lpFileName);

lpFileName:指定可执行模块的名称。如果调用成功,LoadLibrary函数将返回所加载的那个模块的句柄。

LoadLibrary函数不仅能够加载DLL(.dll),还可以加载可执行模块(.exe)。一般来讲,当加载可执行模块时,主要是为了访问该模块内的一些资源,例如对话框资源、位图资源或图标资源等。LoadLibrary函数的返回类型是HMODULE,和HINSTANCE类型可以通用。

? 调用GetPorcAddress函数获取应用程要调用的导出函数的指针

函数原型如下:

FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName); hModule:指定动态链接库模块的句柄,即LoadLibrary函数的返回值;

lpProcName:一个指向常量的字符指针,指定DLL导出函数的名字或函数的序号。利用MAKEINTERSOURCE函数直接使用DLL中函数出现的顺序号,这样调用DLL中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。 如果调用成功,GetProcAddress函数将返回指定导出函数的地址;否则返回NULL。由于应用程序通过指针调用DLL导出函数,因此编译器不用生成外部引用,从而不必连接到DLL的导入库中。自此,就可以如同在应用程序中使用自定义的函数一样来调用此引入函数了。

?

使用完DLL后,调用FreeLibrary函数释放动态链接库

函数原型如下:

HMODULE FreeLibrary ( LPCTSTR lpFileName); lpFileName:指定可执行模块的名称。

6. 使用两种函数导出方法,分别创建求两个数中最大数的共享MFC DLL的规则DLL,

DLLMax1,DLLMax2。 答:使用DEF文件导出DLL; 使用关键字_declspec(dllexport)导出DLL。 7. 创建一个单文档应用程序LinkDLL,为其添加两个菜单项“DLLMax1”和“DLLMax2”,

使用两种加载动态链接库的方法,分别加载DLLMax1动态链接库和DLLMax2动态链接库。 答:略

8. 创建一个MFC扩展DLL,DLLMax3实现相同的功能,在LinkDLL中加入添加一个菜

单项“DLLMax3”,调用该动态链接库。 答:略

第9章 多线程编程

1. 什么是进程?进程有哪些优先级?如何设置进程优先级?

答:进程是操作系统结构的基础,是一个正在执行的程序,计算机中正在运行的程序实例,进程是由进程控制块、程序段、数据段三部分组成。

优先级共32级,是从0到31的数值,称为基本优先级别(base priority level)。系统按照不同的优先级调度进程的运行。0-15级是普通优先级,进程的优先级可以动态变化,高优先级进程优先运行,只有高优先级进程不运行时,才调度低优先级进程运行。优先级相同的进程按照时间片轮流运行。16-31级是实时优先级,实时优先级与普通优先级的最大区别在于相同优先级进程的运行不按照时间片轮转,而是先运行的进程就先控制CPU,如果它不主动放弃控制,同级或低优先级的进程就无法运行。

在创建进程时,可以通过CreateProcess函数中的参数来设置这个进程的优先级。 2. 什么是线程?线程有哪些优先级?如何设置线程优先级?

答:线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

当一个线程被创建时,优先级默认为normal(标准)。CreateThread函数没有提供设置线程


课后习题答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:宪法知识竞赛题(正式稿不含答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: