Visual C++程序设计与应用教程课后答案

更新时间:2024-04-19 00:01:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1.6 习 题

1. 填空题

(1) 项目工作区一般在集成开发环境的左侧。它展示一个项目的几个方面,它们分别是ClassView、ResourceView和FileView。

(2) 编译程序的快捷键是Ctrl+F7,链接程序的快捷键是F7,运行程序的快捷键是 Ctrl+F5。

(3) 项目工作区文件的扩展名为 .dsw 。

(4) 应用程序向导AppWizard的作用是 帮助用户一步步生成一个新的应用程序,并且自动生成应用程序所需的基本代码 。通过 ClassWizard 可以增加消息映射和成员变量。

(5) 菜单选择可以通过两种方法来进行:一种是 鼠标操作 ;另一种是键盘操作 。 (6) 编译微型条工具栏最右边按钮的功能是 Insert/Remove Breakpoint 。 (7) 快捷键或菜单及相关资源的资源符号的前缀是IDR_。

(8) 用户可以通过项目工作区窗口的ResourceView视图来查看资源。 2. 选择题

(1) 项目文件的扩展名是( )。 A. .exe B. .dsp C. .dsw D. .cpp (2) 设置断点的默认方式是( )。(第2章) A. Location B. Data C. Message D. Breakpoints (3) 用应用程序向导AppWizard创建C++源文件,应选择( )选项卡。 A. Files B. Projects C. Workspaces D. Other Documents (4) Standard工具栏中最左边按钮与( )菜单命令的功能一样 。 A. New B. New File C. New Text File D. New Workspace (5) Windows资源提供的资源编辑器不能编辑( )。 A. 菜单 B. 工具栏 C. 状态栏 D. 位图 3. 判断题

(1) 打开一个项目,只需打开对应的项目工作区文件。 ( T ) (2) 用户可以通过Tools | Customize菜单命令设置集成开发环境的工具栏。 ( T ) (3) 通过应用程序向导AppWizard建立的程序不能被立即执行。 ( F ) (4) 在同一项目中,Visual C++在内部用来标识资源的资源符号不能重复。 ( T ) (5) 在Windows环境下,资源与程序源代码紧密相关。 ( F ) 4. 简答题

(1) 什么是项目? 它是由什么组成的?

在Visual C++集成开发环境中,把实现程序设计功能的一组相互关联的C++源文件、资源文件以及支撑这些文件的类的集合称为一个项目。项目是Visual C++ IDE开发程序的基本单位,一个项目至少包含一个项目文件,项目文件的扩展名为.dsp。项目文件保存了项目中所用到的源代码文件和资源文件的信息,如文件名和路径等。同时,项目文件还保存了项目的编译设置等信息,如调试版(debug)和发布版(release)。另外,根据项目类型的不同,一个项目包含有不同的源文件、资源文件和其他类别的文件。

(2) 解释项目工作区中各个视图的功能。 ClassView用于显示项目中定义的类;ResourceView用于显示项目中所包含的资源文件;FileView 用于显示所创建的项目。

(3) WizardBar工具栏的作用是什么?

WizardBar工具栏可以对ClassView和ClassWizard中的命令进行快速访问,使类和成员函数的操作更加方便,WizardBar会自动跟踪用户程序的上下文。

(4) 简述向项目添加一个资源的方法。

用户可以通过在Insert菜单中选择Resource菜单项来创建新的资源。单击Resource菜单项,弹出Insert Resource对话框。首先在对话框的左侧选择资源类型,然后根据具体情况,单击右侧的不同按钮。若资源需要临时创建,则单击New按钮,在打开的相应资源编辑器中创建资源。若资源文件已经存在,则单击Import按钮,在Import Resource对话框中选择资源文件,然后单击Import按钮。

2.5 习 题

1.填空题

(1) MFC的全称是 Microsoft Foundation Class 。

(2) Windows是一个基于 事件 的消息驱动系统。

(3) 句柄是Windows使用的一种无重复整数,主要用来标识应用程序中的一个对象。

(4) 利用MFC AppWizard[exe]可以创建三种类型的应用程序,即 单文档、多文档和基于对话框的应用程序。

(5) 一个单文档的MFC应用程序框架一般包括5个类,它们分别是 应用程序类、框架窗口类、视图类、文档类 和文档模板类。

(6) Windows消息主要有3种类型,即 标准Windows消息、控件消息和命令消息 。 (7) MFC采用 消息映射 来处理消息。

(8) CWinApp提供4个成员函数来实现传统SDK应用程序WinMain( )函数完成的工作。 2.选择题

(1)

序是按照( )非顺序的机制运行的。

A.事件→消息→处理 B.消息→事件→处理 C.事件→处理→消息 D.以上都不对

(2) 下面( )不是MFC应用程序外观的选项。

A.Docking toolbar B.Context-sensitive Help C.ActiveX Controls D.Printing and print preview (3)

Windows应用程

对MFC类的下

列描述中,( )是错误的。

A.应用程序类CWinApp是CWinThread的子类

B.窗口类CWnd提供了MFC中所有窗口类的基本功能 C.CView是CWnd类的子类

D.CDocTemplate类是Template类的子类 (4)

MFC消息映射机制有关的宏。

A.DECLARE_MESSAGE_MAP( )宏 B.BEGIN_MESSAGE_MAP( )宏 C.DECLARE_SERIAL( )宏 D.END_MESSAGE_MAP( )宏 3.判断题

下列( )不是

(1) 窗口是Windows应用程序的基本操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。 ( t )

(2) 所有的Windows应用程序都是消息驱动的。 (t )

(3) 所有的Windows应用程序都是用MFC AppWizard[exe]向导创建的。 ( f ) (4) 使用MFC

AppWizard[exe]向导创建应用程序框架时,向导生成的文件名和类名是不可更改的。 ( f )

(5) 消息映射是将

消息处理函数与它要处理的特定消息连接起来的一种机制。 (t )

(6) 命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。 ( t )

(7) 利用MFC编程时,所有的消息与消息处理函数的添加都必须采用ClassWizard类向导来完成。 ( f )

(8) WinMain函数是所有Windows应用程序的入口。 ( t ) (9) 用快捷键F9既可设置断点,又可取消断点。 ( t )

(10)调式程序时,会同时出现Variable窗口和Watch窗口。 ( t ) 4.简答题

(1) 简述MFC应用程序的执行过程。

MFC应用程序启动时,首先创建应用程序对象theApp。这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC提供的WinMain( )主函数。在WinMain( )主函数中,首先通过调用全局函数GetApp( )来获取theApp的指针pApp,然后通过该指针调用theApp的成员函数InitInstance( )来初始化应用程序。在应用程序的初始化过程中,同时还构造了文档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。当InitInstance( )函数执行完毕后,WinMain( )函数将调用成员函数 Run( ),进入消息处

理循环,直到函数Run( )收到WM_QUIT消息。MFC首先调用CWinApp类的成员函数ExitInstance( ),然后调用静态对象的析构函数,包括CWinApp对象,最后退出应用程序,将控制权交给操作系统。

在初始化的最后,应用程序将收到WM_PAINT消息,框架会自动调用视图类的OnDraw()函数绘制程序客户区窗口。这时,应用程序的基本窗口已经生成,应用程序准备接收系统或用户的消息,以便完成用户需要的功能。如果消息队列中有消息且不是WM_QUIT消息,则将消息分发给窗口函数,以便通过MFC消息映射宏调用指定对象的消息处理函数。如果消息队列中没有消息,函数Run( )就调用函数OnIdle( )进行空闲时间的处理。

(2) 简述文档/视图与其他类对象的关系。

在MFC应用程序中,文档类和视图类是用户最常用的两个类,它们之间是密切相关的。文档/视图体系结构是MFC应用程序框架结构的基石,它定义了一种程序结构,这种结构利用文档对象保存应用程序的数据,依靠视图对象控制视图显示数据,文档与视图的关系是一对多的关系,也就是说,文档中的数据可以以不同的方式显示。MFC在类CDocument和CView中为文档和视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument和CView共同把所有的程序片段连在一起。文档/视图与其他类对象的关系如下图所示。

应用程序对象 文档模板对象 文档对象 框架窗口对象 视图对象

(3) 简述MFC消息映射机制。

MFC采用消息映射来处理消息。这种消息映射机制包括一组消息映射宏,用于把一个Windows消息和其消息处理函数联系起来。MFC应用程序框架提供了消息映射功能,所有从CCmdTarget类派生出来的类都能够拥有自己的消息映射。

(4) 消息WM_LBUTTONDOWN的消息映射宏和消息处理函数是什么?

消息WM_LBUTTONDOWN的消息映射宏是ON_WM_LBUTTONDOWN( ) ,消息处理函数是OnRButtonDown()。

(5) 如何自定义消息?如何发送自定义消息? Windows将所有的消息值分为4段:0x0000~0x03FF消息值范围段用于Windows系统消息,0x0400~0x7FFF段用于用户自定义的窗口消息,0x8000~0xBFFF段为Windows保留值,0xC000~0xFFFF段用于应用程序的字符串消息。

常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值,利用#define语句直接定义自己的消息,如下所示:

#define WM_USER WM_USER+3 ;// 自定义消息WM_USER

也可以调用窗口消息注册函数RegisterWindowMessage( )来定义一个Windows消息,由系统分配消息一个整数值。该函数原型为:

UINT RegisterWindowMessage(LPCTSTR lpString);

其中参数lpString是要定义的消息名,调用成功后将返回该消息的ID值。 发送自定义消息消息采用的函数是SendMessage( )函数。(文中未讲清楚)

3.7 习 题

1.填空题

(1) Windows引入GDI的主要目的是为了实现 设备无关性 。

(2) 与DOS字符方式下的输出文本不同,Windows是按 图形 方式输出的。

(3) 为了体现Windows的设备无关性,应用程序的输出面向一个称之为 设备环境 的虚拟逻辑设备。

(4) 在一个MFC应用程序中获得DC的方法主要有两种:一种是 接受一个参数为指向CDC对象的指针;另一种是声明一个 MFC设备环境类的对象,并使 用 this 指针为该对象赋值。

(5) Windows用 COLORREF 类型的数据存放颜色,它实际上是一个 32 位整数。它采用3个参数表示红、绿、蓝分量值,这3个值的取值范围为0~255 。

(6) 库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体 等。

(7) 可以利用CGdiObject类的成员函数CreateStockObject( ) 将GDI对象设置成指定的库存对象。

(8) 创建画笔后必须调用CDC类的成员函数SelectOject( ) 将创建的画笔选入当前设备环境。

(9) 在默认情况下输出文本时,字体颜色是 黑色 ,背景颜色是 白色 ,背景模式为 不透明模式 。

(10) 创建画笔的方法有两种,一种是 定义画笔对象时直接创建,另一种是先定义一个没有初始化的画笔对象,再调用CreatePen( )函数创建指定画笔。

2.选择题

(1) 下面( )不是MFC设备环境类CDC类的派生类。 A.GDI 类 B.CPaintDC类 C.CClientDC类 D.CWindowDC类 (2) 下面( )不是GDI对象。

A.CFont类 B.CPalette类 C.CClientDC类 D.CBitmap类 (3) 下列描述中,( )是错误的。

A.CreatePointFont( )是CFont类提供的创建函数 B.可使用SetTextAlign( )函数改变文本对齐方式

C.使用函数GetTextMetrics( )可以获得所选字体中指定字符串的宽度和高度 D.可使用DrawText( )函数在给定的矩形区域内输出文本 (4) 下列( )不是MFC CDC类中常用的文本输出函数。 A.TextOut( ) B.DrawText( ) C.ExtTextOut( ) D.ExtDrawText( ) 3.判断题

(1) CDC类是MFC设备环境类的基类。 (2) CClientDC代表整个窗口的设备环境。

( t ) ( f )

(3) CPen和CFont均是GDI对象。 (4) 深绿色RGB值为(0,128,0) (5) 删除CPen对象可调用CPen对象的DeleteObject( )函数。 (6) 创建阴影画刷函数是CreateHatchBrush( )。 (7) 默认的对齐方式是TA_LEFT| TA_BOTTOM。 (8) DDB又称GDI位图,它依赖于具体设备,只能存在于内存中。 4.简答题

( t ) ( t ) ( f ) ( t ) ( f ) ( t )

(1) GDI创建哪几种类型的图形输出?

应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本。 (2) 什么是设备环境?它的主要功能有哪些?

设备环境DC也称设备描述表或设备上下文。设备环境DC是由GDI创建、用来代表设备连接的数据结构。DC的主要功能有以下几种:

? 允许应用程序使用一个输出设备。

? 提供Windows应用程序、设备驱动和输出设备之间的连接。

? 保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜

色和背景等影响图形输出的绘图模式。

? 保存窗口剪切区域(Clipping Region),限制程序输出到输出设备中窗口覆盖的区域。 (3) 什么是GDI,它有什么功能?MFC将GDI函数封装在哪个类中?

GDI是Windows提供了一个图形设备接口的抽象接口。GDI负责管理用户绘图操作时功能的转换,其主要功能是实现设备无关性。MFC将GDI函数封装在CDC类中。

(4) 请叙述设备无关性的含义,实现设备无关性需要哪几个环节? 所谓设备无关性,是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无须考虑设备的类型,如不同种类的显示器或打印机。当然,实现设备无关性的另一个重要环节是设备驱动程序。不同设备根据其自身不同的特点(如分辨率和色彩数目)提供相应的驱动程序。下图描述了Windows应用程序的绘图过程。

图设设物 应形备备理 用设驱备动环设 程接程备 序 境 口 序

(5) MFC提供了哪几种设备环境类?它们各自有什么用途? MFC提供的设备环境类包括CDC、CPaintDC、CClientDC、CWindowDC和 CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其他MFC设备环境类都是CDC类的派生类,各个设备环境类的功能如下表所示。

设备环境类 CDC CPaintDC CClientDC

功能描述

所有设备环境类的基类,对GDI的所有绘图函数进行了封装;可用来直接访问整个显示器或非显示设备(如打印机等)的上下文

CPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行操作,还可以对非客户区进行操作

代表窗口客户区的设备环境,一般在响应非窗口消息并对客户区绘图时要用到 该类

CWindowDC CMetaFileDC

代表整个窗口的设备环境,包括客户区和非客户区;除非要自己绘制窗口边框和按钮,否则一般不用它

代表Windows图元文件的设备环境;一个Windows图元文件包括一系列的图形设备接口命令,可以通过重放这些命令来创建图形;对CMetaFileDC对象进行的各种绘制操作可以被记录到一个图元文件中

(6) 简述传统的SDK获取设备环境的方法。

传统的SDK获取设备环境的方法有两种。在WM_PAINT消息处理函数中通过调用API函数BeginPaint( )获取设备环境,在消息处理函数返回前调用API函数EndPaint( )释放设备环境。如果绘图操作不是在WM_PAINT消息处理函数中,需要通过调用API函数GetDC( )获取设备环境,调用API函数ReleaseDC( )释放设备环境。

(7) 简述创建和使用自定义画笔的步骤。 如果要在设备环境中使用自己的画笔绘图,首先需要创建一个指定风格的画笔,然后选择所创建的画笔,最后还原画笔。

(8) 简述采用MFC方法编程时,显示一个DDB位图的步骤。

采用MFC方法编程时,显示一个DDB位图需要执行以下几个步骤。

? 声明一个CBitmap类的对象,使用LoadBitmap( )函数将位图装入内存。

? 声明一个CDC类的对象,使用CreateCompatibleDC( )函数创建一个与显示设备环境

兼容的内存设备环境。

? 使用CDC::SelectObject( )函数将位图对象选入设备环境中,并保存原来设备环境的指

针。

? 利用CDC的相关输出函数输出位图。

? 使用CDC::SelectObject( )函数恢复原来设备环境。

4.6 习 题

1. 填空题

(1) 常见的菜单类型有主菜单、弹出菜单和快捷菜单3种。

(2) 在Visual C++中,每一个快捷键除了ID属性外,还有两个属性: 键 和 类型 。

(3) 基于对话框的应用程序在运行时 没有 菜单栏。 (4) 在MFC中,工具栏的功能由类 CToolBar 实现。

(5) 调用CToolBar类的成员函数CToolBar::Create( )或CreateEx( ) 创建并初始化工具栏窗口对象。

(6) 设置工具栏停靠特性,需要调用 EnableDocking( ) 函数。

(7) 状态栏实际上是一个窗口,一般分为几个 窗格 ,用来显示不同的信息。 (8) 在MFC中,状态栏的功能由 CStatusBar 类实现。

(9) 状态栏显示的内容由数组 indicators 决定,需要在状态栏中显示各窗格的 标识符、位置以及个数。

(10) CStatusBar类的成员函数 SetPaneInfo() 用来设置给定索引值的窗格ID、风格和宽度,成员函数 SetPaneText() 用来更新窗格的文本 2. 选择题

(1) 在编辑某菜单项时,若要指明该菜单项是一个弹出式子菜单,必须选择属性对话框

中的( )。

A.Separator B.Pop-up C.Inactive D.Grayed

(2) 要使鼠标箭头在按钮上暂停时能显示工具栏按钮提示,必须设置工具栏的风格为( )。

A.CBRS_TOOLTIPS B.CBRS_FLYBY C.CBRS_NOALIGN D.WS_VISIBLE

(3) MFC应用程序框架为状态栏定义的静态数组indicators放在文件( )中。 A.MainFrm.cpp B.MainFrm.h C.stdAfx.cpp D.stdAfx.h (4) 下列有关菜单的叙述中不确的是( )。

A.“&”字符的作用是使其后的字符加上下划线 B.“\\t” 转移字符表示使快捷键按右对齐显示 C.自定义菜单项ID不能与系统菜单项ID相同

D.选中菜单项属性对话框中的Separator,指明菜单项是一个水平线分隔条 3. 判断题

(1) 给菜单项定义快捷键,只需在菜单项属性设置对话框的Caption文本框中说明 即可。 ( f )

(2) 弹出快捷菜单一般出现在鼠标箭头的位置。 ( t ) (3) UPDATE_COMMAND是更新命令用户接口消息。 ( t ) (4) 工具栏停靠特性只能设置一次。 ( t ) (5) 状态栏的功能由CStatusBar类实现。 ( t ) (6) CMenu类、CToolBar类和CStatusBar类的根基类是相同的。 ( t ) 4. 简答题

(1) 简述菜单设计的主要步骤。 菜单设计一般需要经过下面两步:

? 使用菜单编辑器编辑菜单资源;

? 使用ClassWizard进行消息映射,编辑成员函数,完成菜单所要实现的功能。

(2) 为应用程序创建快捷菜单主要有哪些方法? 为应用程序创建快捷菜单主要有以下两种方法:

? 使用Component Gallery创建快捷菜单 ? 使用TrackPopupMenu( )函数创建快捷菜单

(3) 如何动态创建菜单?

动态创建菜单分为以下3个步骤。

? 利用CreateMenu( )函数创建一个空的弹出式菜单

? 调用AppendMenu( )或InsertMenu( )函数在菜单中加入菜单项 ? 调用函数SetMenu( )加载动态菜单

(4) 创建工具栏的基本步骤有哪些? 创建工具栏的基本步骤是:

? 创建工具栏资源; ? 构建一个CToolBar对象;

? 调用CToolBar::Create( )或CreateEx( )函数创建工具栏窗口; ? 调用CToolBar::LoadToolBar()载入工具栏资源。

(5) 简述MFC创建状态栏所做的工作。

首先构造一个CToolBar类的对象,然后调用CToolBar::Create( )或CreateEx( )函数创建工具栏窗口,最后调用CToolBar::LoadToolBar( )函数载入工具栏资源。

5.7 习 题

1.填空题

(1) 对话框的主要功能是输出信息和接收用户的输入。

(2) 从对话框的工作方式看,对话框可分为模态对话框和非模态对话框两种类型。 (3) 对话框主要由对话框模板资源与对话框类两部分组成。

(4) 使用DoModal()函数可以创建模式对话框,使用Create()函数可以创建非模式对 话框。

(5) 为了支持属性页对话框,MFC提供了CPropertySheet类和CPropertyPage类。 2.选择题

(1) 对话框的功能被封装在( )类中。

A. CWnd B. CDialog C. CObject D. CCmdTarget (2) ( )是非模式对话框。

A.“查找”对话框 B.“字体”对话框 C.“段落”对话框 D.“颜色”对话框 (3) 要将模式对话框在屏幕上显示需要用到函数( )。 A. Create B. DoModal C. OnOK D. 构造函数 (4) 通常将对话框的初始化工作在( )函数中进行。

A. OnOK B. OnCancel C. OnInitDialog D. DoModal (5) 使用( )通用对话框类可以打开文件。

A. CFileDialog B. CColorDialog C. CPrintDialog D. CFontDialog 3.简答题

(1) 简述创建和使用模态对话框的主要步骤。

? 使用对话框编辑器来创建包含不同控件的对话框模板资源 ? 从MFC的CDialog中派生出一个类,用来负责对话框行为。

? 利用ClassWizard把这个类和先前你产生的对话框资源连接起来。 ? 对话框的初始化。

? 创建一个对话框对象,调用CDialog::DoModal()函数打开对话框。 (2) 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?

在一个对话框资源中增加控件的操作十分方便,只需从控件工具栏中选中要增加的控件,再将此控件拖动至对话框模板中的确定位置上,松开鼠标按键即添加了一个控件。调整控件的位置和大小的操作与Word中对文本框的操作完全一样。

可以利用ClassWizard类向导的Member Variables页面为对话框类添加与对话框控件关联的成员变量。在Member Variables页面中,双击一个ID或选定ID后,单击Add Variable按钮,将弹出Add Member Variable对话框。在Member variable name框用于输入成员变量名,在Category下拉框选择成员变量的类别。

(3) 什么是DDX和DDV?编程时如何使用MFC提供的DDX功能?

DDX为对话框数据交换,它用于将成员变量与对话框控件相连接,完成数据在成员变

量和控件之间的交换。DDV为对话框数据验证,它能自动校验输入的数据是否符合设计要求。我们只需通过ClassWizard为对话框类添加与对话框控件关联的成员变量即可使用MFC提供的DDX功能。

(4) 简述创建属性页对话框的主要步骤。

? 设计对话框资源。分别为各个页创建对话框模板,每页的模板最好具有相同尺寸,

如果尺寸不统一,则框架将根据尺寸最大的页来确定属性页对话框的大小。 ? 用ClassWizard为每页创建新类,并加入与控件对应的成员变量。 ? 打开属性页对话框

6.11 习 题

1.填空题

(1) Windows系统提供的标准控件主要包括静态控件、编辑框、按钮、列表框、组合框和滚动条等。

(2) Windows标准控件的属性设置通常由General、Style及Extend Styles三个属性页构成。

(3) 当编辑框中的文本已被修改,在新的文本显示之后发送EN_CHANGE通知消息。 (4) CButton类控件包括按键按钮、单选按钮、复选框和组框等4种类型。

(5) 一组单选按钮在对话框类中只能映射一个int类型值变量,对应单选按钮在组中的序号,序号从0开始。

(6) 向列表框增加列表项使用CListBox类成员函数AddString或InsertString。 (7) 组合框是多个控件的组合,包括编辑框、列表框和按钮。

(8) —个旋转按钮控件通常是与一个相伴的控件一起使用的,这个控件称为“伙伴窗口”。该控件的Tab键次序必须小于旋转按钮。

(9) 当滑块滑动时,滑块控件将发送滚动消息来通知父窗口。垂直滑块发送WM_VSCROLL消息,水平滑块发送WM_HSCROLL消息。

(10) MFC的CProgressCtrl类封装了进度条控件的各种操作,该类的成员函数SetRange()用来设置进度条的范围。 2.简答题

(1) 在应用程序中访问控件的方法有哪些? 应用程序访问控件一般有3种方法:

? 利用对话框的数据交换功能访问控件 ? 通过控件对象来访问控件

? 利用CWnd类的一些用于管理控件的成员函数来访问控件

(2) 单选按钮控件如何成组?

将一组单选按钮放在一个组框控件中,并为同组中的第一个单选按钮设置Group属性。 (3) 组合框与列表框相比有什么不同?如何给组合框添加初始的列表项? 列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框不仅可以显示列表项供用户进行选择,而且允许用户输入新的列表项。

可以通过组合框控件属性对话框的Data选项卡添加初始的列表项。

7.7 习 题

1.填空题

(1) 在文档/视图结构中,文档是用来管理和组织数据的,视图的作用是显示和编辑文档数据。文档与视图的关系是一对多的关系。

(2) 在文档/视图应用程序中,文档模板负责创建文档/视图结构,而应用程序对象管理文档模板,可以在应用程序的InitInstance()函数中创建一个和多个文档模板。

(3) 在通常情况下,视图派生类的成员函数中通过调用GetDocument()函数得到当前文档对象的指针。

(4) 文档类的数据成员初始化和文档的清理工作分别在OnNewDocument()成员函数和DeleteContents()成员函数中完成。

(5) MFC提供了两种集合类,一种是基于模板的集合类,另一种是非模板集合类。 (6) MFC应用程序通过CDocument的protected类型成员变量m_bModified的逻辑值来判断程序员是否对文档进行过修改。程序员可以通过CDocument的SetModifiedFlag()成员函数来设置该值。

(7) MFC AppWizard在创建文档应用程序框架时已在文档类中重载了Serialize()函数,通过在该函数中添加代码可以达到实现文档序列化的目的。

(8) 调用create()成员函数创建动态分割窗口,而静态分割窗口是调用CreateStatic()成员函数创建的。 2.简答题

(1) 通过哪几个主要成员函数完成文档与视图之间的相互作用?并简述这些成员函数的功能。

文档与视图的交互是通过下面几个主要的成员函数完成的:

? 视图类CView的成员函数GetDocument()

该函数得到与之相关联的文档对象的指针,利用这个指针就可以访问文档类及其派生类的公有数据成员和成员函数。

? CDocument类的成员函数UpdateAllViews()

该函数通知与文档相关联的所有或部分试图,更新窗口内容。

? 视图类的成员函数OnUpdate()

当应用程序调用CDocument::UpdateAllViews()函数时,实际上是调用了所有相关视图的OnUpdate()函数,以更新相关的视图。需要时,可以直接在视图派生类的成员函数中调用该函数刷新当前视图。另外,在初始化视图成员函数CView::OnInitialUpdate()中也调用了OnUpdate()函数。

? CView类的OnInitialUpdate()函数

当应用程序被启动,或用户从“文件”菜单中选择了“新建”或“打开”命令时,CView的OnInitialUpdate()函数会被调用,该函数是虚函数。CView的OnInitialUpdate()函数除了调用OnUpdate()函数之外,不做其他任何事情。

也可以利用派生类的OnInitialUpdate()函数对视图对象进行初始化。 (2) 简述文档序列化与一般文件处理的区别。

一般文件处理是通过文件句柄来实现磁盘输入和输出,一个文件句柄与一个磁盘文件相关联。而文档序列化与一般文件处理最大的不同在于:在序列化中,对象本身对读和写负责。CArchive类对象并不知道也不需要知道它所读写数的内部结构,CArchive类对象为读写

CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:

Serialize()函数 CArchive类对象 CFile类对象 磁盘文件

可见序列化使得程序员可以不直接面对一个物理文件而进行文档的读写。 (3) 如何让用户定义的类支持序列化?

要让用户定义的类支持序列化,必须满足以下5个条件:

? 从CObject类派生,这样派生类就具有RTTI(Run-time type information)、Dynamic

Creation等功能。

? 类的声明部分必须有DECLARE_SERIAL宏,此宏需要1个参数:类名称。

? 类的实现部分必须有IMPLEMENT_SERIAL宏,此宏需要3个参数:一是类名称,

二是基类名称,三是版本号。

? 重新定义Serialize( )虚函数,使它能够适当地把类的成员变量写入文件中。

? 为此类加上一个默认构造函数,这是因为如果一个对象来自文件,MFC必须先动态

地创建它,而且在没有任何参数的情况下调用构造函数,然后才从文件中读取对象数据。

8.5 习 题

1.填空题

(1) MFC通过CView类提供打印功能和打印预览功能。

(2) 在打印过程中,CPrintInfo类的主要作用是在框架窗口和CView类之间传递消息。 (3) CPrintInfo类中的成员变量m_nCurPage表示当前打印/预览的页号,成员函数SetMaxPage( )设置文档的最大打印页数。

(4) 在Windows操作系统中,存在两种类型的坐标:设备坐标和逻辑坐标。

(5) 不同的映射模式将影响输出设备显示的图形尺寸因子,Windows的缺省映射模式是MM_TEXT,在该映射方式中,每一个逻辑单位对应一个设备像素。

(6) 在MFC应用程序中,通过调用CDC类的SetMapMode()函数设置映射方式。

(7) 如果要使程序支持多页打印功能,首先在打印之前设置要打印的页数,然后设置每一页视图原点的打印坐标。

(8) 一般在OnBeginPrinting()函数中设置要打印的页数,在OnPrepareDC()函数中通过调用CDC类成员函数SetViewPortOrg( )设置当前页的视图原点坐标。 2.简答题

(1) 打印和屏幕显示有何异同?

相同点:在MFC应用程序中,打印和屏幕显示最终都是通过调用视图类的OnDraw()函数来完成的。OnDraw()函数有一个指向CDC类对象指针的参数,该对象代表了接收OnDraw()函数输出的设备上下文,它可以是代表显示器的显示设备上下文,也可以是代表打印机的打印设备上下文。

不同点:当窗口显示文档内容时,视图窗口将收到WM_PAINT消息,程序框架将调用OnPaint()函数,OnPaint()函数会调用OnDraw()函数,此时传递给OnDraw()函数的设备上下文参数为显示设备上下文,OnDraw()函数的绘制结果将会输出到显示器。进行打印时,用于打印和打印预览的OnPrint()函数也会调用OnDraw()函数,而此时传递给OnDraw()函数的设备上下文参数为打印机设备上下文,OnDraw()函数的绘制结果也会输出到打印机。

(2) 如何在打印和屏幕显示时输出不同内容? 有两种方法:

? 分别在OnPaint()和OnPrint()这两个函数中完成屏幕输出和打印输出工作,而不必依

赖于OnDraw()函数。 ? OnDraw()函数中,调用pDC->IsPrinting()或设置变量来识别目前进行的输出工作并区

别对待。

(3) 打印预览和打印有何异同?

相同点:在MFC应用程序中,打印和屏幕显示最终都是通过调用视图类的OnDraw()函数来完成的。

不同点:打印预览和打印不同,它是应用程序利用屏幕来模拟打印机输出的过程。进行打印时,传递给OnDraw()函数的设备上下文参数为打印机设备上下文。而为了实现打印预览的功能,MFC类库从CDC类中派生出CPreviewDC类。在进行打印预览时,传给OnDraw()函数的是一个指向CPreviewDC对象的指针。一般CDC类中保存有两套相同的设备描述表,而CPreviewDC类则保存有两套不同的设备描述表,其中的属性设备描述表指向打印机,而输出设备描述表指向屏幕。

(4) MM_LOMETRIC映射方式有何特点?

MM_LOMETRIC映射方式将一个逻辑单位映射到0.l mm, MM_LOMETRIC坐标系统Y轴方向与默认的MM_TEXT相反。

(5) 简述添加打印页眉、页脚的程序代码的步骤。 添加打印页眉、页脚的程序代码可以分两步进行:

? 在OnPrint()函数中利用CPrintInfo*pInfo的成员变量m_rectDraw来设置打印页上打

印区域的大小。

? 在m_rectDraw范围之外打印页眉和页脚。

9.5 习 题

1.填空题

(1) Windows的库类型主要有静态链接库 和动态链接库。

(2) DLL中一般定义有导出函数和内部函数两种类型的函数,其中导出函数可以被外部程序调用。

(3) 每个DLL都含有一个入口函数DllMain(),就像我们编写的应用程序必须有main()或WinMain()函数一样。该函数的作用是初始化DLL,并在卸载时清理DLL。

(4) Visual C++ 6.0支持多种DLL,包括非MFC DLL、MFC常规DLL和MFC扩展DLL。 (5) 非MFC DLL的内部不使用MFC,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序调用。

(6) 在MFC规则DLL的内部可以使用MFC,但是它与应用程序的接口不能是MFC,而是C函数或者C++类。

(7) MFC扩展DLL的主要功能是实现从现有MFC类库中派生出可重用的类。

(8) 从MFC DLL中导出函数常用使用模块定义文件和使用关键字_declspec(dllexport)两种方法。后者不仅可以导出函数,还可以导出一个完整的类。

(9) DEF文件是一个包含EXE文件或DLL文件声明的文本文件。每个.DEF文件至少必须包含LIBRARY语句和EXPORTS 语句。

(10) 应用程序与DLL链接的方式主要有隐式链接和显式链接。

(11) 应用程序分别使用AfxLoadLibrary()和AfxFreeLibrary()函数来加载和释放MFC扩展DLL。

(12) MFC扩展DLL除了可使用关键字_declspec(dllexport) 导出类外,还可以使用宏AFX_EXT_CLASS来导出类。 2.简答题

(1) 什么是动态链接库?它和静态链接库有何区别?生成的动态链接库应放在哪些目录下才能被应用程序使用?

动态链接库是一种用来为其它可执行文件(包括EXE文件和其它DLL)提供共享的函数库。它和静态链接库的主要区别是与应用程序的链接方式不同,前者进行的是动态链接,后者进行的是静态链接。

生成的动态链接库必须位于下面4个目录之一中:

? 当前目录

? Windows的系统的目录,如Windows\\system ? Windows所在的目录,如WINNT ? 环境变量PATH中所指定的目录

(2) Visual C++支持哪几种DLL?如何选择选择DLL的类型? Visual C++支持多种DLL,包括:

? 非MFC DLL

? MFC常规DLL(MFC Regular DLL) ? MFC扩展DLL(MFC Extension DLL)

我们选择哪一种DLL的类型可以从以下几个方面来考虑:

如果DLL不需要使用MFC,那么使用非MFC DLL是一个很好的选择。如果需要创建使用了MFC的DLL,并希望MFC和非MFC应用程序都能使用所创建的DLL,那么可以选择MFC常规DLL。如果希望在DLL中实现从MFC派生的可重用的类,或者是希望在应用程序和DLL之间传递MFC的派生对象时,必须选择MFC扩展DLL。

(3) MFC常规DLL实际上包含哪两方面的含义?

MFC常规DLL实际上包含有两方面的含义。一方面它是“MFC的”,这意味着可以在这种DLL的内部使用MFC,另一方面它是“常规的”,这意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是它与应用程序的接口不能是MFC,而是C函数或者C++类。

(4) 如何从MFC DLL中导出函数?

从MFC DLL中导出函数常用的有两种方法。

第一种是使用模块定义文件(.DEF)。DEF文件常用的模块语句如下: (1) 第一个语句必须是LIBRARY语句,这个语句指出DLL的名字,链接器将这个名字放到DLL导入库(import library)中,DLL导入库包含了指向外部DLL的函数索引指针。

(2) EXPORTS 语句列出被导出函数的名字, 以及导出函数的数值(由@号与数字构成)。序数值可以省略, 编译器(Compiler)会为每个导出函数指定一个,但这样指定的值不如自己指定的明确。

(3) 使用DESCRIPTION语句描述DLL的用途,这个语句可以省略。 (4) 使用“;”开头的注释语句。

使用AppWizard创建一个MFC DLL时,AppWizard将创建一个.DEF文件的框架,并自动添加到项目中。建立DLL时,链接器使用.DEF文件来创建一个导出文件(.EXP)和一

个导入库文件(.LIB),然后使用导出文件来创建.DLL文件。

另一种方法是在定义函数时使用关键字_declspec(dllexport)。这种情况下,不需要.DEF文件。导出函数的形式为:

declspec(dllexport) <返回类型> <导出函数名>(<函数参数>); (5) 应用程序与DLL链接的方式有哪两种?它们之间有何区别?

应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。 隐式链接又称为静态加载,指的是使用DLL的应用程序先链接到编译DLL时生成的导入库LIB文件,执行应用程序的同时系统也加载所需的DLL。在应用程序退出之前,DLL一直存在于该程序运行进程的地址空间中。

显式链接又称为动态加载,使用显式链接DLL的应用程序必须在代码中动态地加载所使用的DLL,并使用指针调用DLL中的导出函数,在使用完毕后,应用程序必须卸载所使用的DLL。使用显式链接的一个非常明显的好处是,应用程序可以在运行过程中决定需要加载的DLL。

10.6 习 题

1.填空题

(1) 进程和线程都是操作系统的概念,进程是操作系统分配资源单位,线程是操作系统分配处理器的最基本单元。

(2) 可以用VC++所带的工具Spy++来观察操作系统管理的进程和线程。 (3) 每一个进程至少有一个主线程,该线程由系统创建。 (4) 一般可以使用全局变量和自定义消息进行线程间通信。 (5) 常用的同步对象有临界区、互斥、信号量和事件。

(6) 为了使用同步类,需要手动将头文件Afxmt.h加到应用程序中。 (7) 使用CSingleLock类的成员函数Lock()请求获得临界区。 (8) CEvent 类对象有人工事件和自动事件两种类型。 2.简答题

(1) 什么叫进程?什么叫线程?它们有什么区别和联系? 进程和线程都是操作系统的概念。进程是应用程序的执行实例,它是操作系统分配资源单位,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是操作系统分配处理器的最基本单元,它是进程内部的一个独立的执行单元。

进程是没有活力的,它是一个静态的概念。一个程序运行时,由系统自动创建一个进程。系统创建好进程后,实际上就启动执行了该进程的主线程,主线程以函数地址形式(一般为 main()或WinMain()函数),将程序的启动点提供给操作系统。主线程终止了,进程也就随之终止。

每一个进程至少有一个主线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源。 (2) MFC中线程有哪两种类型?它们有何区别?如何创建它们?

MFC中有两类线程,分别称之为工作者线程和用户界面线程。

创建一个工作者线程,首先需要编写一个希望与应用程序的其余部分并行运行的自定义函数,该函数称为线程函数。然后,在程序中合适的地方调用全局函数AfxBeginThread()创建线程,以启动线程函数。

创建用户界面线程,首先需要从CWinThread类派生一个新类,并重写派生类的InitInstance()、ExitInstance()及Run()等函数,然后使用AfxBeginThread()函数的另一个版本创建并启动用户界面线程。

(3) 什么是线程函数?其作用是什么?如何给线程函数传递参数? 线程函数是新线程创建后要执行的函数,新线程要实现的功能是由线程函数实现的。线程函数带有一个参数LPVOID pParam,创建线程的AfxBeginThread()全局函数的第二个参数LPVOID pParam的类型与线程函数的参数类型完全一致,该参数为启动线程时传递给线程函数的入口参数。

(4) 如何终止线程?

当一个工作者线程的线程函数执行一个返回语句或者调用AfxEndThread()成员函数时,这个工作者线程就终止。对于用户界面线程,当一个WM_QUIT消息发送到它的消息队列中,或者该线程中的一个函数调用AfxEndThread()成员函数时,该线程就被终止。

一般来说,线程只能自我终止。如果要从另一个线程来终止线程,必须在这两个线程之间设置通信方式。

(5) 如何使用自定义消息进行通信?

使用Windows消息来进行通讯,首先需要定义一个自定义消息,然后,需要时在一个线程中调用全局函数::PostMessage()向另一个线程发送自定义消息。

(6) 什么叫线程的同步?为什么需要同步?

使隶属于同一进程的各线程协调一致地工作称为线程的同步。这是因为在多线程处理时线程之间经常要同时访问一些资源,这有可能导致错误。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。

(7) MFC提供了哪些类来支持线程的同步?它们分别用在什么场合?

MFC为我们提供了几个同步类和同步辅助类来支持线程的同步,这些类及其适用场合如下表所示。

类 名

同步对象基类CSyncObject 临界区类CCriticalSection 互斥类CMutex 信号类CSemaphore 事件类CEvent

同步辅助类CSingleLock、CMultiLock

说 明

纯虚类,为Win32中的同步对象提供通用性能

当在一个时间内仅有一个线程可被允许修改数据或某些其他控制资源时使用,用于保护共享资源。

有多个应用(多个进程)同时存取相应资源时使用,用于保护共享资源。 一个应用允许同时有多个线程访问相应资源时使用,主要功能用于资源计数。

某个线程必须等待某些事件发生后才能存取相应资源时使用,以协调线程之间的动作。

用于在一个多线程程序中控制对资源的访问。当在一个时间只需等待一个同步化对象时使用CSingleLock,否则使用CMultiLock

(8) 如何使用CSemaphore类实现多线程同步?

使用CSemaphore类实现多线程同步,有两种用法。 方法一:单独使用CSemaphore对象,步骤如下:

? 定义CSemaphore类的一个全局对象(以使各个线程均能访问)

? 在访问临界区之前,调用CSemaphore类的成员Lock()获得临界区。 ? 在本线程中访问临界区中的共享资源。

? 访问临界区完毕后,使用CSemaphore的成员函数UnLock()来释放临界区。

方法二:与同步辅助类CSingleLock或CMutiLock类一起使用,步骤如下(以类CSingleLock为例):

? 定义CSemaphore类的一个全局对象,如critical_section

? 在访问临界区之前,定义CSingleLock类的一个对象,并将critical_section的地址传

送给构造函数

? 使用CSingleLock类的成员函数Lock()请求获得临界区。 ? 在本线程中访问临界区中的共享资源。

? 调用CSingleLock类的成员函数UnLock()来释放临界区。

11.6 习 题

1. 填空题

(1) MFC的ODBC类主要包括5个类,分别是CDatabase类、CRecordset类、 CRecordView类 、 CFieldExchange类 、 CDBException类 ,其中CRecordset类是用户实际使用过程中最关心的。

(2) CDatabase类的作用是建立与数据源的连接 。

(3) CRecordset类的功能是对表记录进行操作的许多功能,如添加记录、删除记录、修改记录、查询记录等,并能直接为数据源中的表映射一个CRecordset类对象,方便用户的操作。

(4) CRecordView的作用是 显示数据库记录。利用对话框数据交换机制DDX在记录集与表单视图的控件之间传输数据。

(5) 可以利用CRecordset类的成员函数AddNew() 添加一条新记录;可以利用CRecordset类的成员函数MoveFirst() 将记录指针移动到第一条记录上;可以利用CRecordset类的成员函数 Update() 完成保存记录的功能。

(6) 在CRecordset类中提供了两个公有数据成员m_strFilter和m_strSort,分别用来设置对记录的查找和排序。

(7) ADO对象模型提供了7种对象,它们分别是 连接对象 、命令对象 、记录集对象 、域对象 、参数对象 、属性对象 、错误对象。

(8) 在Visual C++中使用ADO开发数据库之前,需要用#import引入ADO,其语句格式为: #import \Files\\common files\\system\\ado\\msado15.dll\no_namespace rename(\(9) 在使用ADO开发数据库时,常用的三个智能指针为:_ConnectionPtr 、_CommandPtr和_RecordsetPtr。

(10) Connection对象的ConnectionString属性表示连接数据库的字符串,CursorLocation属性用来指定光标引擎的位置。

2.简答题

(1) Visual C++中都提供了哪些访问数据库的技术?它们有何特点?

Visual C++中都提供了ODBC、DAO、OLE DB和ADO等访问数据库的技术。 ? ODBC

ODBC是为应用程序访问关系数据库时提供的一个标准的基于SQL的统一接口。对于不同的数据库,ODBC提供了一套统一的API,使应用程序可以利用所提供的API来访问任何提供了ODBC驱动程序的数据库,而且,ODBC已经成为一种标准,目前所有的关系数据库都提供了ODBC驱动程序,这使得ODBC的应用非常广泛,基本上可用于所有的关系数据库。

由于ODBC是一种底层的访问技术,因此,ODBC API可以使客户应用程序从底层设置和控制数据库,完成一些高层数据库技术无法完成的功能。

直接使用ODBC API编写应用程序需要编制大量的代码,Visual C++6.0提供了MFC ODBC类,其中封装了ODBC API,因此,使得用MFC来创建ODBC的应用程序非常简单。

? DAO

DAO提供了一种通过程序代码创建和操作数据库的机制。DAO类似于用Access或Visual Basic编写的数据库应用程序,它使用微软公司的Jet数据库引擎形成一系列的数据访问对象:数据库对象、表和查询对象、记录集对象等,各个对象协同工作。

DAO支持以下4个数据库选项:可以打开一个Access数据库文件(*.mdb文件),直接打开一个ODBC数据源,使用Jet引擎打开一个ISAM (被索引的顺序访问方法)类型的数据源以及把外部表附属到Access数据库。

MFC DAO是微软公司提供的用于访问Microsoft Jet数据库文件(*.mdb)的强有力的数据库开发工具,它通过DAO的封装,向程序员提供了DAO丰富的操作数据库手段。

? OLE DB

OLE DB是Visual C++开发数据库应用中提供的新技术,它基于COM接口。因此,OLE DB对所有的文件系统包括关系型数据库和非关系型数据库都提供了统一的接口。这些特性使得OLE DB技术比传统的数据库访问技术更加优越。

与ODBC技术相似,OLE DB属于数据库访问技术中的底层接口。但直接使用OLE DB来设计数据库应用程序需要编写大量的代码。

? ADO

ADO技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且ADO对OLE DB的接口进行封装,定义了ADO对象,使程序开发得到简化。ADO技术属于数据库访问的高层接口。

(2) 如何注册ODBC的数据源?

下面是以Visual FoxPro 6.0数据库StudentDB.dbc为例,注册ODBC的数据源的步骤。

? 双击ODBC图标,进入ODBC数据源管理器。在这里用户可以设置ODBC数据源的

一些信息,其中的用户DSN选项卡中可以让用户定义的在本地计算机使用的数据

源名

? 单击添加按钮,弹出创建新数据源对话框,为新的数据源选择数据库驱动程序。由

于使用的是Visual FoxPro6.0数据库,所以选择Microsoft Visual FoxPro Driver,并单击“完成”按钮。

? 在ODBC Visual FoxPro Setup对话框中,为该数据源起一个简短的名称。应用程序将

使用该名称来指定用于数据库连接的ODBC数据源配置,因此建议所起的名称能反映出该数据库的用途,或者与使用该数据库的应用程序名称类似。对于该例,给该数据源命名为Student,并在下一个编辑框中输入对该数据库的说明。

? 指定数据库的位置。单击Browse按钮,出现Select Database文件选择对话框,定位

并选择StudentDB.dbc文件。

? 单击“打开”按钮完成数据库选择,在ODBC Visual FoxPro Setup对话框中单击OK

按钮,完成数据源的创建。最后,单击ODBC数据源管理器对话框中的确定按钮,退出数据源管理器。

(3) 简述用MFC ODBC进行数据库编程的基本步骤。

Visual C++创建一个MFC ODBC数据库应用程序需要以下几个步骤:

? 准备数据库

? 在系统的数据源管理器中注册数据源 ? 用AppWizard创建基本的数据库应用程序

? 向基本的数据库应用程序中添加代码,实现特定数据库功能

(4) 什么是动态记录集和快照集?它们的根本区别是什么?

动态集是与用户所做的更改保持同步的记录集,而快照集则是数据的一个静态视图。它们的根本区别是:当在一个动态集中滚动一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来,而快照集则不会。

(5) 在使用CRecordset类成员函数进行记录的编辑、添加和删除等操作时,如何使操作有效?

在编辑、添加和删除时,必须遵循一些特定步骤才能得到正确结果。 要编辑改当前记录,应该按下列步骤进行:

? 调用Edit()成员函数。

调用该函数后就进入了编辑模式,程序可以修改域数据成员。注意不要在一个空的记录集中调用Edit(),否则会产生异常。

? 设置域数据成员的新值。 ? 调用Update()完成编辑。

Update()把变化后的记录写入数据源并结束编辑模式。 要向记录集中添加新的记录,应该按下列步骤进行:

? 调用AddNew()成员函数。

调用该函数后就进入了添加模式,该函数把所有的域数据成员都设置成NULL。

? 设置域数据成员。 ? 调用Update()。

Update()把域数据成员中的内容作为新记录写入数据源,从而结束了添加。

如果记录集是快照,那么在添加一个新的记录后,需要调用Requery()函数重新查询,因为快照无法反映添加操作。

要删除记录集的当前记录,应按下面两步进行:

? 调用Delete()成员函数。

该函数会同时给记录集和数据源中当前记录加上删除标记。注意不要在一个空记录集中调用Delete()函数,否则会产生一个异常。

? 滚动到另一个记录上以跳过删除记录。

在对记录集进行更新以前,程序最好先调用CanUpdate()函数、CanAppend()函数来判断记录集是否是可以更新的,因为如果在不能更改的记录集中进行修改、添加或删除将导致异常的产生。

(6) CRecordset类的成员函数Requery()有哪两个重要用途? Requery()有两个重要用途:

? 使记录集能反映用户对数据源的改变

? 按照新的查找条件或排序方法查询记录并重新建立记录集

(7) 简述MFC的ODBC应用程序中的DDX和RFX数据交换机制。 下图显示了MFC的ODBC应用程序中的DDX和RFX数据交换机制:

记录视图 记录集 DDX m_pSet-> RFX 数据源中的表 学号 IDC_NUMBE姓名 IDC_NAME 学号 姓名 m_number m_name 域数据成员 控件 表中的字段 (8) 简述用ADO进行数据库编程的基本步骤。

用ADO进行数据库编程下列基本步骤:

? 引入ADO库 ? 初始化COM环境 ? ADO与数据库的连接 ? 操作数据库 ? 断开连接 ? 释放COM环境

12.4 习 题

1. 填空题

(1) Windows提供了3个特殊的播放声音的高级音频函数:MessageBeep()、PlaySound()和sndPlaySound(),其中MessageBeep()函数主要用来播放系统报警声音。

(2) Visual C++提供了一个用于多媒体应用程序开发的一个部件Windows Multimedia library。加入该部件后,将在应用程序中运行库winmm.lib和头文件mmsystem.h。 (3) MCI媒体控制接口是Microsoft提供的一组多媒体设备和文件的标准接口。 (4) MCI 使用MCI_PLAY命令消息使设备播放媒体文件。

(5) 在应用程序中使用MCIWnd窗口类,必须在调用MCIWnd函数所在的源文件的前面添加vfw.h的头文件。

2.简答题

(1) 简述利用高级音频函数播放声音文件的步骤。

答:利用高级音频函数播放声音文件需要下面3个步骤:

? 引用头文件。对于大多数多媒体函数的引用必须在系统中包含头文件mmsystem.h,

该文件包含了有关多媒体函数的原型、数据结构及相关常数的定义。

? 链接多媒体函数库winmm.lib。绝大多数的多媒体函数存在于独立的多媒体函数中,

因此,必须在应用程序中予以说明。

? 在应用程序中写入执行多媒体调用的代码。

(2) 简述调用PlaySound()函数播放声音文件的方法。

答:调用PlaySound()函数播出这个声音文件可使用下面3种方法。

第一种方法是直接播出声音文件,相应的代码为:

PlaySound(“c:\\\\Windows\\\\media\\Sound.wav”,NULL, SND_FILENAME|SND_ASYNC);

第二种方法是把声音文件加入到资源中,然后从资源中播放声音。Visual C++支持 WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框的文件类型选择框中选择Wave File(*.wav)文件,然后在文件选择框中选择Sound.wav,则将Sound.wav文件加入到WAVE资源中。缺省时声音资源的ID为IDR_WAVE1,则下面的调用会播出该声音:

PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetInstanceHandle(),

SND_RESOURCE|SND_ASYNC);

第三种方法是用PlaySound()函数播放系统声音,Windows启动的声音是由 SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:

PlaySound(“SystemStart”,NULL,SND_ALIAS|SND_ASYNC);

(3) 简单比较命令字符串接口mciSendString()和命令消息接口mciSendCommand()。 命令字符串接口mciSendString()具有简单易学的优点,但这种接口与C/C++的风格相距甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。命令消息接口mciSendCommand()提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。

(4) 什么是ActiveX控件?它有何特点?

答:ActiveX技术建立在微软的COM技术之上,并使用COM的接口和交互模型使ActiveX控件与其容器进行完全无缝的集成。ActiveX主要由ActiveX容器、ActiveX服务器、ActiveX控件等组成。ActiveX控件是一组封装在COM对象中的功能模块。这个COM对象是独立的,尽管它不能单独运行。ActiveX控件只能在ActiveX容器中运行,如Visual C++或Visual Basic应用程序。ActiveX控件使用.ocx为其文件扩展名,可以把它插入许多不同的程序中,并把它当作程序本身的一部分来使用。

(5) 简述在程序中添加ActiveX控件的步骤。

答:下面以向对话框应用程序中添加一个Calendar Control8.0控件为例,说明在程序中添加和使用ActiveX控件的具体步骤。

? 使用MFC AppWizard[exe]创建一个新的对话框应用程序。

? 在AppWizard的第二步保留ActiveX Controls的复选框为选中状态,应用程序标题设

为ActiveX Controls。

? 在生成了应用程序外壳之后,删除所有控件。

? 从Visual C++菜单中选择Project|Add To Project|Components and Controls,打开

Components and Controls Gallery对话框. ? 在Components and Controls Gallery对话框中,找到Registed ActiveX Controls文件夹,

显示所有已注册的AxtiveX控件。

? 选中要添加的控件,如Calendar Control8.0控件,单击Insert按钮。当提问是否要在

项目中插入该控件时,单击消息框中的OK按钮。

? 在Confirm Classes对话框中,单击OK按钮以添加所指定的C++类。

? 在Components and Controls Gallery对话框中,单击Close按钮,以完成给项目添加

控件的工作。

第一种方法是直接播出声音文件,相应的代码为:

PlaySound(“c:\\\\Windows\\\\media\\Sound.wav”,NULL, SND_FILENAME|SND_ASYNC);

第二种方法是把声音文件加入到资源中,然后从资源中播放声音。Visual C++支持 WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框的文件类型选择框中选择Wave File(*.wav)文件,然后在文件选择框中选择Sound.wav,则将Sound.wav文件加入到WAVE资源中。缺省时声音资源的ID为IDR_WAVE1,则下面的调用会播出该声音:

PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetInstanceHandle(),

SND_RESOURCE|SND_ASYNC);

第三种方法是用PlaySound()函数播放系统声音,Windows启动的声音是由 SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:

PlaySound(“SystemStart”,NULL,SND_ALIAS|SND_ASYNC);

(3) 简单比较命令字符串接口mciSendString()和命令消息接口mciSendCommand()。 命令字符串接口mciSendString()具有简单易学的优点,但这种接口与C/C++的风格相距甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。命令消息接口mciSendCommand()提供了C语言接口,它速度更快,并且更能符合C/C++程序员的需要。

(4) 什么是ActiveX控件?它有何特点?

答:ActiveX技术建立在微软的COM技术之上,并使用COM的接口和交互模型使ActiveX控件与其容器进行完全无缝的集成。ActiveX主要由ActiveX容器、ActiveX服务器、ActiveX控件等组成。ActiveX控件是一组封装在COM对象中的功能模块。这个COM对象是独立的,尽管它不能单独运行。ActiveX控件只能在ActiveX容器中运行,如Visual C++或Visual Basic应用程序。ActiveX控件使用.ocx为其文件扩展名,可以把它插入许多不同的程序中,并把它当作程序本身的一部分来使用。

(5) 简述在程序中添加ActiveX控件的步骤。

答:下面以向对话框应用程序中添加一个Calendar Control8.0控件为例,说明在程序中添加和使用ActiveX控件的具体步骤。

? 使用MFC AppWizard[exe]创建一个新的对话框应用程序。

? 在AppWizard的第二步保留ActiveX Controls的复选框为选中状态,应用程序标题设

为ActiveX Controls。

? 在生成了应用程序外壳之后,删除所有控件。

? 从Visual C++菜单中选择Project|Add To Project|Components and Controls,打开

Components and Controls Gallery对话框. ? 在Components and Controls Gallery对话框中,找到Registed ActiveX Controls文件夹,

显示所有已注册的AxtiveX控件。

? 选中要添加的控件,如Calendar Control8.0控件,单击Insert按钮。当提问是否要在

项目中插入该控件时,单击消息框中的OK按钮。

? 在Confirm Classes对话框中,单击OK按钮以添加所指定的C++类。

? 在Components and Controls Gallery对话框中,单击Close按钮,以完成给项目添加

控件的工作。

本文来源:https://www.bwwdw.com/article/07dp.html

Top