MFC期末复习简答题及答案

MFC期末复习简答题及答案

2023年7月17日发(作者:)

MFC期末复习及答案

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

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

3简述MFC消息映射机制。

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

5如何自定义消息?如何发送自定义消息?

6 GDI创建哪几种类型的图形输出?

7什么是设备环境?它的主要功能有哪些?

8什么是GDI,它有什么功能?

MFC将GDI函数封装在哪个类中?

9请叙述设备无关性的含义,实现设备无关性需要哪几个环节?

10 MFC提供了哪几种设备环境类?它们各自有什么用途?

11 简述传统的SDK获取设备环境的方法。

12 简述创建和使用自定义画笔的步骤。

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

14 简述菜单设计的主要步骤。

15 为应用程序创建快捷菜单主要有哪些方法?

16 如何动态创建菜单?

17 创建工具栏的基本步骤有哪些?

18 简述MFC创建状态栏所做的工作。

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

20 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?

21 什么是DDX和DDV?

编程时如何使用MFC提供的DDX功能?

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

23 在应用程序中访问控件的方法有哪些?

24 单选按钮控件如何成组?

25组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?

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

27简述文档序列化与一般文件处理的区别。

28. 如何让用户定义的类支持序列化?

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( )函数。

6 GDI创建哪几种类型的图形输出?

应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本。

7什么是设备环境?它的主要功能有哪些?

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

(1)允许应用程序使用一个输出设备。

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

(3)保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜色和背景等影响图形输出的绘图模式。

(4)保存窗口剪切区域(Clipping Region),限制程序输出到输出设备中窗口覆盖的区域。

8什么是GDI,它有什么功能?MFC将GDI函数封装在哪个类中?

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

函数封装在CDC类中。

9请叙述设备无关性的含义,实现设备无关性需要哪几个环节?

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

应设图形备物

用备设驱理

程环备动设

接程口

10 MFC提供了哪几种设备环境类?它们各自有什么用途?

MFC提供的设备环境类包括CDC、CPaintDC、CClientDC、CWindowDC和 CMetaFileDC等,其中CDC类是MFC设备环境类的基类,其他MFC设备环境类都是CDC类的派生类,各个设备环境类的功能如下表所示。

设备环境类 功能描述

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

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

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

该类

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

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

11 简述传统的SDK获取设备环境的方法。

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

12 简述创建和使用自定义画笔的步骤。

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

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

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

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

 声明一个CDC类的对象,使用CreateCompatibleDC( )函数创建一个与显示设备环境兼容的内存设备环境。

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

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

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

14 简述菜单设计的主要步骤。

菜单设计一般需要经过下面两步:

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

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

15 为应用程序创建快捷菜单主要有哪些方法?

为应用程序创建快捷菜单主要有以下两种方法:

 使用Component Gallery创建快捷菜单

 使用TrackPopupMenu( )函数创建快捷菜单

16 如何动态创建菜单?

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

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

 调用AppendMenu( )或InsertMenu( )函数在菜单中加入菜单项

 调用函数SetMenu( )加载动态菜单

17 创建工具栏的基本步骤有哪些?

创建工具栏的基本步骤是:

 创建工具栏资源;

 构建一个CToolBar对象;

 调用CToolBar::Create( )或CreateEx( )函数创建工具栏窗口;

 调用CToolBar::LoadToolBar()载入工具栏资源。

18 简述MFC创建状态栏所做的工作。

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

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

 使用对话框编辑器来创建包含不同控件的对话框模板资源

 从MFC的CDialog中派生出一个类,用来负责对话框行为。

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

 对话框的初始化。

 创建一个对话框对象,调用CDialog::DoModal()函数打开对话框。

20 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?

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

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

Member Variable对话框。在Member variable name框用于输入成员变量名,在Category下拉框选择成员变量的类别。

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

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

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

 设计对话框资源。分别为各个页创建对话框模板,每页的模板最好具有相同尺寸,如果尺寸不统一,则框架将根据尺寸最大的页来确定属性页对话框的大小。

 用ClassWizard为每页创建新类,并加入与控件对应的成员变量。

 打开属性页对话框

23 在应用程序中访问控件的方法有哪些?

应用程序访问控件一般有3种方法:

 利用对话框的数据交换功能访问控件

 通过控件对象来访问控件

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

24 单选按钮控件如何成组?

将一组单选按钮放在一个组框控件中,并为同组中的第一个单选按钮设置Group属性。

25组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?

列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框不仅可以显示列表项供用户进行选择,而且允许用户输入新的列表项。

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

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

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

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

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

 CDocument类的成员函UpdateAllViews()

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

 视图类的成员函数OnUpdate()当应用程序

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

 CView类的OnInitialUpdate()函数

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

也可以利用派生类的OnInitialUpdate()函数对视图对象进行初始化。

27简述文档序列化与一般文件处理的区别。

一般文件处理是通过文件句柄来实现磁盘输入和输出,一个文件句柄与一个磁盘文件相关联。而文档序列化与一般文件处理最大的不同在于:在序列化中,对象本身对读和写负责。CArchive类对象并不知道也不需要知道它所读写数的内部结构,CArchive类对象为读写CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:Serialize()函数<-->CArchive类对象

<-->CFile类对象<-->磁盘文件;

可见序列化使得程序员可以不直接面对一个物理文件而进行文档的读写。

28. 如何让用户定义的类支持序列化?

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

 从CObject类派生,这样派生类就具有RTTI(Run-time type information)、Dynamic Creation等功能。

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

 类的实现部分必须有IMPLEMENT_SERIAL宏,此宏需要3个参数:一是类名称,二是基类名称,三是版本号。

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

 为此类加上一个默认构造函数,这是因为如果一个对象来自文件,MFC必须先动态地创建它,而且在没有任何参数的情 况下调用构造函数,然后才从文件中读取对象数据。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689606804a270049.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信