MFC考试复习题0Word下载.docx
《MFC考试复习题0Word下载.docx》由会员分享,可在线阅读,更多相关《MFC考试复习题0Word下载.docx(48页珍藏版)》请在冰豆网上搜索。
实现与设备无关的图形操作功能。
8、API、Win系统和Win应用程序之间的相互关系
API为应用程序提供Win系统各种特殊函数及数据结构定义;
API是Win系统与Win应用程序间的标准程序接口;
Win应用程序可以利用上千个标准API函数调用系统功能。
9、一个应用程序的窗口一般包含哪些成分?
控制菜单框;
下拉菜单;
标题栏;
工作区;
窗口边界;
最大化按钮;
最小化按钮;
垂直滚动条;
水平滚动条。
10、填空:
编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。
11、填空:
在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中。
12、填空:
VisualC++支持三种DLL,它们分别是非MFC动态库、常规DLL、扩展DLL。
13、填空:
Windows程序的执行顺序取决于事件发生的顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生往往并不要求有次序之分。
14、填空:
Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。
15、一个完整的Windows应用程序通常由哪五种类型的文件组成?
(1)C语言源程序文件;
(2)头文件;
(3)模块定义文件;
(4)资源描述文件;
(5)项目文件
16、简述复选框、单选按钮、下压式按钮的用途
常用于只有两种完全相反状态的情况下;
适用于同一组属性相同的数据中选一个数据;
适用于消息的发送。
17、对话框用于处理哪两类消息?
对话框只处理两类消息,一类是创建窗口的消息,另一类是控件的消息。
在普通窗口中接受wm_create消息,而在对话框中接受wm_initdialog消息。
18、对话框分为哪几类?
它们有什么不同?
对话框分为模式对话框和非模式对话框。
模式对话框要求用户在继续执行前回答对话框,否则不能进行。
非模式对话框可以不回答对话框,继续进行。
19、使用AppWizard创建SDI和MDI界面的应用程序的过程几乎完全一样,而其主要差别在哪些方面?
在创建SDI界面的应用程序时,不生成CChildFrame类,CMainFrame类的基类为CframeWnd;
在创建MDI界面的应用程序时,CMainFrame类的基类为CMDIFrameWnd。
20、视图是如何在文档和用户之间起中介作用的?
视图可以直接或间接的访问文档类中的成员变量,它从文档类中(而不是从存储介质中)将文档中的数据取出来,然后在屏幕上显示文档的数据;
它可以接收用户的输入,并接受用户的修改。
21、命令消息与Windows消息和控件控制消息有和不同?
命令消息可以被多种对象处理,这些对象除了窗口和视图外,还可以是文档、文档模板或应用程序本身。
而Windows消息和控件通知消息就只能被窗口和视图处理。
22、文档类是如何将数据保存到磁盘文件或数据库中呢?
文档类通过串行化的过程将数据保存到磁盘文件或数据库中
23、请简述从CDocument类派生自己的文档类的典型步骤。
(1)每一个文档类型从CDocument类(当然也可以是其它CDocument类的派生类)派生一个相应的文档类。
(2)为文档类添加成员变量。
这些成员变量用来保存文档的数据,其它对象(如与文档相关联的视图)直接或间接的访问这些成员变量来读取或更新文档的数据。
(3)重载Serialize成员函数,实现文档数据的串行化。
24、简述文档、框架窗口和视图的创建过程之间的先后顺序
创建文档→创建框架窗口→创建视图
25、简述设备上下文的绘图原理
(1)绘图程序不是寻址硬件,而是调用GDI函数,这些函数引用设备环境的数据结构,Windows把该设备环境结构映射到物理设备,并发出适当的输入/输出指令。
(2)在编程过程中,不必关心硬件的具体实现,可以直接进行抽象的操作。
(3)利用GDI,只要把相关的GDI对象选入设备上下文,然后用设备上下文对象提供的有关方法就可以绘制出各种图形,当我们需要在显示器或打印机上绘图时,就需要调用GDI函数。
26、如何解决擦除问题?
在应用程序运行中,很多操作可能会破坏窗口内容,移动覆盖在窗口上的窗口或对话框、菜单拉下后又放开以及改变窗口的大小等,此时Windows都会发出WM_PAINT消息告知客户区的变动,同时发出WM_NCPAINT消息告知非客户区的变动。
通常我们要在WM_PAINT消息的响应函数OnPaint()中进行客户区的画面重画工作,而非客户区的重画工作是由系统自己完成的。
我们也可以使用Invalidate()函数、ValidateRgn()函数和ValidateRect()函数强制窗口重画。
27、简述使用画笔的主要步骤
⑴创建新的画笔类对象,可以调用CPen类的构造函数CPen:
CPen()来初始化新画笔;
也可以调用CPen类的成员函数CreatePen()来实现。
(2)保存原来的旧画笔,并将新创建的画笔对象选入设备对象中。
(3)开始实际绘图工作,调用CDC类的各种绘图函数进行绘图。
(4)恢复原来的旧画笔,同样调用SelectObject()函数来实现。
28、MFC支持哪两种线程
用户界面线程和工作者线程。
29、简述线程的创建原理
为了使用MFC创建一个线程,你所做的就是编写一个你希望的和程序的其它部分同时运行的函数,然后调用AfxBeginThread()来启动一个用以执行你的函数的线程。
只要线程的函数在运行,线程就存活着,当线程函数结束时,线程就被销毁。
30、有哪三种使多线程更安全的方法?
三种使多线程程序更安全的线程同步对象—临界区(criticalsection)、互斥对象(mutex)、信号量(semaphore)。
31、简述DLL的优点
在Windows操作系统中使用DLL有很多优点,最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件,真正实现了资源“共享”,大大缩小了应用程序的执行代码,更加有效的利用了内存;
使用DLL的另一个优点是DLL文件作为一个单独的程序模块,封装性、独立性好,在软件需要升级的时候,开发人员只需要修改相应的DLL文件就可以了,而且,当DLL中的函数改变后,只要不是参数的改变,程序代码并不需要重新编译。
这在编程时十分有用,大大提高了软件开发和维护的效率。
32、利用ODBC创建数据库应用程序的步骤
(1)建立数据源;
(2)用Appwizard创建程序框架;
(3)显示数据库信息;
33、使用画笔的主要步骤
创建新画笔,保存旧画笔,并使用新画笔取代旧画笔,最后再恢复原来的旧画笔。
34、使用画刷的主要步骤
创建新画刷,保存旧画刷,并使用新画刷取代旧画刷,最后再恢复原来的旧画刷。
35、简述两种创建自定义字体的方法
第一种是间接创建法,通过调用CFont类的函数CreateFontIndirect来实现;
第二种是直接创建法,通过调用CFont类的函数CreateFont来实现。
36、指出下面代码中哪几行代码是创建新画笔,并保存旧画笔?
哪行代码是恢复就画笔?
voidCDrawAppView:
OnDraw(CDC*pDC)
{
CDrawAppDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CPenpen(PS_SOLID,2,RGB(0,0,255));
CPen*pOldPen=pDC->
SelectObject(&
pen);
pDC->
MoveTo(20,30);
LineTo(50,60);
SelectObject(pOldPen);
}
答案:
创建新画笔和保存旧画笔的代码行为:
CPenpen(PS_SOLID,2,RGB(0,0,255));
CPen*pOldPen=pDC->
恢复旧画笔的代码行为:
pDC->
37、请指出下面的代码中哪行代码是创建新画刷?
哪行代码是保存旧画刷并选择新画刷?
哪行代码是执行绘图操作?
哪行代码是恢复就画刷?
CBrush*brush;
brush=newCBrush(RGB(255,0,0));
CBrush*pOldBrush=pDC->
SelectObject(brush);
Rectangle(20,20,60,60);
SelectObject(pOldBrush);
创建新画刷:
brush=newCBrush(RGB(255,0,0));
保存旧画刷并选择新画刷:
CBrush*pOldBrush=pDC->
执行绘图操作:
恢复旧画笔:
38、请指出下面的代码中哪行代码是创建新字体?
哪行代码是选择新字体和保存旧字体?
哪行代码是设置字体颜色?
哪行代码是设置背景颜色?
哪行代码是恢复旧字体?
OnDraw(CDC*pDC)
{charmyStr[100];
CFontfont;
font.CreateFont(8,0,0,0,FW_NORMAL,1,0,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
VARIABLE_PITCH|FF_ROMAN,“TimesNewRoman”);
CFont*pOldFont=font.SelectObject(&
font);
SetTextColor(RGB(0,0,255));
SetBkMode(TRANSPARENT);
strcpy(myStr,“HelloWorld.”);
TextOut(20,30,myStr,strlen(myStr));
SelectObject(pOldFont);
}
创建新字体:
选择新字体和保存旧字体:
CFont*pOldFont=font.SelectObject(&
设置字体颜色:
设置背静模式:
恢复旧字体:
39、单项选择题(每小题2分,共12分)在每小题列出的四个选项中只有一个选项是符合题目要求的,请将其代码填在题后的括号内。
错选或未选均无分。
1.在C++中,函数原型不能标识(D)
A.函数的返回类型B.函数参数的个数
C.函数参数类型D.函数的功能
2.对于任意一个类,析构函数的个数最多为(B)
A.0B.1C.2D.3
3.下面说法正确的是(B)
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline定义
4.在C++程序中,对象之间的相互通信通过(B)
A.继承实现B.调用成员函数实现
C.封装实现D.函数重载实现
5.可以用p.a的形式访问派生类对象p的基类成员a,其中a是(D)
A.私有继承的公有成员B.公有继承的私有成员
C.公有继承的保护成员D.公有继承的公有成员
6.派生类中的成员函数可以访问基类的(D)
A私有段成员
B保护段成员
C公有段成员
D保护段和公有段成员
40、改错题(共4分)
指出下面程序段中的错误,并说明出错原因。
#include<
iostream.h>
classA{
public:
voidfun(){cout<
<
″a.fun″<
endl;
};
classB{
″b.fun″<
voidgun(){cout<
″b.gun″<
classC:
publicA,publicB{
private:
intb;
voidgun(){cout<
″c.gun″<
voidhun(){fun();
voidhun(){fun();
}出错,C:
fun()有二义性。
41、程序分析,写出下列程序的运行结果(每题5分)
(1)
#include<
externinta[]={100,200,300};
voiddisplay();
voidmain()
inta[]={10,20,30};
for(intj=0;
j<
3;
j++)
cout<
a[j]<
endl;
display();
voiddisplay()
for(inti=0;
i<
i++)
a[i]<
结果:
10
20
30
100
200
300
(2)
classsample
staticintcounter;
public:
sample()
counter++;
cout<
"
创建sample类的第"
counter<
个对象."
~sample()
sample类的第"
个对象被删除."
counter--;
intsample:
counter=0;
sampledemo[3];
创建sample类的第1个对象.
创建sample类的第2个对象.
创建sample类的第3个对象.
sample类的第3个对象被删除.
sample类的第2个对象被删除.
sample类的第1个对象被删除.
(3)
classX
protected:
intx;
X(inti)
x=i;
"
x="
x<
~X(){cout<
类X的对象被删除!
classY
inty;
Y(inti)
y=i;
y="
y<
~Y(){cout<
类Y的对象被删除!
classmul:
publicX,publicY
{
mul(inti,intj):
X(i),Y(j)
i<
与"
j<
之积等于"
x*y<
~mul(){cout<
类mul的对象被删除!
muldemo(10,15);
x=10
y=15
10与15之积等于150
类mul的对象被删除!
类Y的对象被删除!
类X的对象被删除!
(4)
string.h>
charOne[]=“Oneifbyland”;
intfullLength=strlen(One);
inttooShort=fullLength4;
inttooLong=fullLength+1;
cout.write(One,fullLength)<
”\n”;
cout.write(One,tooShort)<
cout.write(One,tooLong)<
Oneifbyland
Oneifby
42、计算函数积分通常采用矩形法和梯形法。
积分如下:
假设积分区间为x1到x2,被积函数为f(x),将积分区间等分n段,则每小段的长度h为:
h=(x2x1)/n
则矩形法的积分为:
S=h*(f(x1)+f(x1+h)+……+f(x1+(n1)*h))
梯形法的积分公式为:
S=h*(f(x1)+2*f(x1+h)+……+2*f(x1+(n1)*h)+f(x2))/2
利用虚函数的知识设计一程序计算函数f(x)=1/(1+x)在0.0到10.0区间内的积分值。
doublefun(double);
classintegrat
doublex1,x2,h;
intn;
integrat(doublea1,doublea2,inta3)
x1=a1;
x2=a2;
n=a3;
h=(x2-x1)/(double)n;
virtualdoubleintegrate()=0;
classrectangle:
publicintegrat
rectangle(doublea1,doublea2,inta3):
integrat(a1,a2,a3){};
doubleintegrate();
doublerectangle:
integrate()
doubles=0.0;
n;
i++)
s+=fun(x1+h*(double)i);
s*=h;
returns;
classladder:
ladder(doublea1,doublea2,inta3):
doubleladder:
doubles=(fun(x1)+fun(x2))/(double)2;
for(inti=1;
s+=fun(x1+h*(double)i);
//定义积分函数
doublefun(doublex)
return1.0/(1+x);
voiddisplay(integrat*obj)
obj->
integrate();
rectanglerect(0.0,10.0,10);
利用矩形求的函数的积分值为(分成10等分):
;
display(&
rect);
利用梯形求得函数的积分值为(分成10等分):
ladderlad(0.0,10.0,10);
lad);
rectanglerect1(0.0,10.0,100);
利用矩形求得函数的积分值为(分成100等分):
rect1);
利用梯形求得函数的积分值为(分成100等分):
ladderlad1(0.0,10.0,100);
lad1);
43、有一组记录,其内容为:
NameAgeScore
LiuDong16460
LiBin2080
WangMing18285
分别使用操作符和流类成员函数按下列格式要求显示出来:
(1)Name域采用左对齐方式,宽度为10,宽度不足的用*填充。