MFC纯复习题200504_第1页
MFC纯复习题200504_第2页
MFC纯复习题200504_第3页
MFC纯复习题200504_第4页
MFC纯复习题200504_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实用软件技术复习题1 在用API编写Windows程序时,要有一个入口函数,它的函数名和功能是什么?答:在Windows编程中这个入口函数就是WinMain()。WinMain函数主要用于初始化程序,显示主窗口,并进入一个消息循环。2 在Windows程序的入口函数WinMain()中有一个消息循环,代码如下:while (GetMessage(&msg) TranslateMessage(&msg); DispatchMessage(&msg); 上述代码中个函数作用是什么?答:通过GetMessage函数从线程的消息队列中取出消息,用TranslateMessage函数将消息解释后,再调用

2、DispatchMessage将该消息分发至相应的窗口过程(WndProc)进行处理。3 Windows程序中有一个窗口函数,该函数的作用是什么?答 :每一个窗口都应该有一个“窗口函数”(window procedure,或称window function)。 如果窗口获得一个消息,则这个窗口函数必须判断消息的类别,决定处理的方式。4 在Windows系统中分别定义了两个数据类型用来表示应用程序对象的句柄及窗口对象的句柄,这两个数据类型是什么?答:应用程序:数据类型HINSTANCE,也常把HINSTANCE的变量命名为hInstance, 窗口:数据类型为HWND(也写成HWindow或HW

3、ND)。5 利用AppWizard生成的多文档应用程序包括哪几个主要的类?答:主要是 CWinApp, CDocument, CView, CFrameWnd派生,另外再加上CDocTemplate, 这5个类构成了大部分MFC应用程序的核心, 6 MFC类库可分为哪两部分?答:MFC类库可以分为两部分,一部分是MFC类,另一部分是全局函数(变量)和宏。7 MFC中下列类的类名分别是什么?应用程序类(CWinApp)、视图类(CView)、文档类(CDocument)、窗口类(CWnd)、主框架窗口类(CFrameWnd)、文档模板类(CDocTemplate)、对话框类(CDialog)、异

4、常类(CException)、字符串类(CString)、菜单类(CMenu)、工具栏类(CToolBar)、状态栏类(CStatusBar)、静态控件类(CStatic)、按钮控件类(CButton)、编辑控件类(CEdit)、列表框控件类(CCListBox)、组合框控件类(CComboBox)、滚动条控件类(CScrollBar)。8 Windows系统的消息主要分为哪几大类?并写出几个常用的消息及其消息处理函数。答:1. 标准的Windows消息以WM_为前缀,除了WM_COMMAND消息,(1) 键盘消息一类是系统键(system key),另一类则是非系统键。WM_CHAR也称为键

5、盘消息,该消息的处理函数为OnChar()。此外还有两个常用的键盘消息:WM_KEYDOWN按下非系统键和WM_KEYUP. 释放非系统键 (2) 鼠标消息 #define WM_MOUSEMOVE 0x0200 /鼠标移动消息(3) 与窗口操作有关的两个重要消息 WM_CREATE消息创建一个窗口时,会产生WM_CREATE消息,处理函数为:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) WM_PAINT消息重画当前窗口时,会发出WM_PAINT消息。处理函数为:OnPaint()。2. 控件通知消息1) 文本编辑框控件消息2) 按扭控

6、件消息3)列表框控件消息4) 组合框控件消息5) 滚动栏控件消息6) 默认下压式按扭消息3. 命令消息处理函数为:OnCommand()。4 定时消息如SetTimer(ID_TIMER, 1000, NULL); /该定时器ID,时间间隔,调用函数5 用户自定义消息消息处理函数原型前面都有关键字 afx_msg前缀,用于把消息处理函数与其它函数区分开来。9 在MFC程序设计中,什么是消息映射?哪些类可以有消息映射?答:所谓消息映射,就是将消息与其处理函数相对应,即当系统产生一条消息时,它能够找到处理该消息的函数。 在MFC中,凡是从CCmdTarget(命令发送类)派生的类都可以有消息映射。

7、10 MFC中有哪些常用的消息映射宏,它们各有什么作用?答:三种:DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP和END_MESSAGE_MAP。DECLARE_MESSAGE_MAP用于类申明的末尾,即在.h文件中;在实现文件(.cpp)中,使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP来完成消息映射的任务。DECLARE_MESSAGE_MAP:用于声明在源文件中存在消息映射。BEGIN_MESSAGE_MAP:用于标志消息映射的开始, END_MESSAGE_MAP:标志消息映射的结束。11 AppWizard及ClassWizard各

8、有什么功能?答:与AppWizard类似,ClassWizard也能自动生成程序代码,只是两者生成的对象不同,AppWizard主要用来创建应用程序的框架,而ClassWizard则主要是在应用程序框架的基础上创建和编辑各种类。ClassWizard既可以操作由AppWizard在应用程序框家中创建的类,又可以操作后来由ClassWizard自己添加的类。利用ClassWizard可以很轻松地完成一些最基本、最普通的工作,如在自己的应用程序中创建新类、映射消息为其添加消息处理函数、覆盖虚拟函数、将对话框中的控件与某个变量相关联等。12 如何应用ClassWizard创建一个新类?要求写出主要步

9、骤。答:只需指定一些关于新类的重要信息,ClassWizard将自动为你生成代码。步骤如下:(1) 首先打开FirstApp的项目工作区。(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。(3) 在Message Maps选项卡中选择功能按钮Add Class,并从其下拉选项栏中单击New选项,将会打开New Class对话框。(4) 首先在Name栏中键入新类的名称,如FirstButton。(5) 接下来应当设定新类的基类,即该类是由什么类派生而来的。(6) 如果创建的基类需要对话框或其它资源,则在Dialog ID框中选择一个资源ID值。(7) Aut

10、omation组框用于设置类的自动化信息,这只适用于能够自动化的类,即由CCmdTarget所派生的类,我们保持其默认选择None。(8) 最后单击OK按钮结束。13 如何应用ClassWizard为视图类的WM_LBUTTONDOWN消息添加一个消息处理函数?假定项目工程的名称为FirstApp,要求写出主要步骤。答:以FirstApp应用程序为例来添加消息处理函数,处理用户在视图中的单击鼠标操作。步骤如下:(1) 首先打开FirstApp的项目工作区。(2) 点击菜单项View|ClassWizard,进入ClassWizard对话框。(3) 选择Message Maps选项卡,在Proj

11、ect下拉列表框中选择项目名FirstApp,在Class name下拉列表框中选择类名CFirstAppView。(4) 在Object IDs列表框中选择对象ID为CFirstAppView。(5) 在Message列表框中选择需要处理的消息为WM_LBUTTONDOWN,即按下鼠标左键消息。(6) 此时会发现Add Function按钮已经可用。单击此按钮,ClassWizard将选中消息的处理函数添加到Member Functions列表框中。在本例中,对应WM_LBUTTONDOWN消息的处理函数是OnLButtonDown()。(7) 最后单击OK按钮结束。14 ClassWiza

12、rd的Message Maps选项卡的Object Ids列表框中显示什么信息?答: Object IDs列表框:显示当前选定类中能够产生消息的对象的ID值。这些对象包括菜单选项、工具栏按钮选项、对话框以及各种控件等。15 Class Wizard的Message Maps选项卡的Messages列表框中显示什么信息?答: Message列表框:当Object IDs列表框中选定当前类名时,Message列表框前部分显示的是当前类所能覆盖的虚拟函数,后部分显示的是能够处理的消息。16 在文档视图结构中,文档类与视图类各有什么作用?答:文档类用于管理应用程序中的各种数据, 在MFC应用程序中,文

13、档用于管理、保存应用程序中的各种数据, 视图的主要作用是显示文档数据、接收用户的输入并将其解释为对文档的操作。17 在文档视图结构中,视图类通过什么途径访问和操作文档类的数据?答: 视图通过使用视图中指向文档的指针来访问文档对象。在使用MFC应用程序向导创建的程序中,这个指针被直接放在视图类的数据成员中。用户可以调用CView类的成员函数GetDocument()在视图的成员函数中检索该指针,获取指针后才可以使用指针访问文档类的数据。18 文档类中的成员函数UpdateAllViews()有什么作用?答:UpdateAllViews()函数用于通知所有视图它的文档已经被更改。19文档类中创建一

14、个新文档时,将调用什么成员函数?文档数据的初始化在哪个成员函数里实现。答:创建一个新文档时,将调用OnNewDocument()函数。它先调用DeleteContents()函数把文档内容清除掉此外,OnNewDocument()还会将文件名清除,改用缺省文件名,并且调用SetModifiedFlag()函数将“修改标志”设成FALSE。调用这个函数重新初始化已经存在的文档。20 文档类中打开一个已存在的文档、设置文档修改标志、保存一个已存在的文档、关闭一个文档时时,各调用什么成员函数?答:使用OnOpenDocument()函数打开指定的文件时,通常先调用DeleteContents()函数

15、来确保文档已经被清空(动态销毁分配的数据),并调用Serialize()函数读取文档内容。void CDocument:SetModifiedFlag(BOOL bModified = TRUE);通常在存档时程序会调用IsModified()检查修改标志,如果“修改标志”的状态为FALSE,表示文档没有被修改过,因此可以考虑不做实际存档操作。储存文档有两种方式,第一种是“Save”,第二种是“Save As”。两者的差异在于后者会查询文件名,但最终两者都会跳到OnSaveDocument()进行实质的存档操作,该函数唯一的参数就是文档的文件名。函数原型如下:virtual BOOL CDoc

16、ument:OnSaveDocument(LPCTSTR lpszPathName);当关闭一个打开的文档时,将调用OnCloseDocument()函数。21 MFC编程时采用串行化方法加载和保存文档中的数据成员,这通过调用serialize()函数实现,serialize()函数的结构如下:void CFirstAppDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: add storing code hereelse/ TODO: add loading code here请问储存数据及读取数据的代码应当分别将放到哪一语句块?答:当我

17、们需要修改Serialize函数以满足应用程序的需要时,应该将写文档数据(输出)的代码放在if程序段中,而将读取文档数据(输入)的代码放在else程序段中。22 在视图类中,当需要绘制或重绘视图窗口时将调用哪个成员函数?答:virtual void CView:OnDraw(CDC* pDC) ;当需要绘制或重绘视图窗口时会调用此函数,此外打印以及打印预览时也会调用OnDraw()。23在视图类中的成员函数OnUpdate()有什么作用?答:OnUpdate()收到Document的消息之后会调用Invalidate(),重绘整个View。当CDocument的UpdateAllViews()

18、函数被调用时,如果pSender参数指向某个特定的视图,那么除了该指定的视图,文档所有其它视图的OnUpdate()函数都会被调用。24 在用MFC设计程序时,框架与视图有什么区别?答:框架与视图是两个不同的概念,框架窗口的作用是显示一个或多个视图,MFC的应用程序框架使用框架窗口来包含视图,将框架窗口与视图分开,使用户界面的设计更加灵活。MFC使用框架窗口类管理框架,使用视图类来管理框架中的视图。用户与文档之间的交互操作(如绘图)发生在视图的客户区内,而不是框架窗口的客户区内。框架窗口提供了用于环绕视图的可见框架25 在用户界面设计中,假定应用程序框架已经带有一个初始的菜单,在此基础上用户要

19、设计自己的菜单一般包括哪几个步骤?答:创建新菜单,应选择菜单项Insert | Resource,并在打开的Insert Resource对话框中选中Menu选项,再单击New按钮,就可以启动新菜单资源的创建工作。如果想在当前菜单条前添加一个新的菜单条,按下Insert键,在该菜单条前就会出现一个新的空白菜单条,然后可为其设置属性。26 在菜单编辑器中,怎样添加一个新的菜单选项?答:菜单编辑器中,用鼠标选中某个菜单项,直接双击该菜单项,或在选定菜单项上按下Enter键即可进入该菜单项的属性表对话框。也可以通过选择菜单项View | Properties打开该对话框。27 如何利用ClassWi

20、zard给某个菜单选项添加消息响应函数?假设项目工程名为FirstApp,菜单项的ID值为ID_DRAW。答: 进入ClassWizard(可按鼠标右键,在弹出的快捷菜单中选ClassWizard),选Message Maps,从Project下拉列表框中选FirstApp,从Class name框中选择CFirstAppView类。此时在Object Ids列表框中显示CFirstAppView类能够产生消息的对象ID值,从中选取某个新添加的菜单项的ID号。 在Message列表框中选择COMMAND,此时Add Function按钮变为实体显示,单击Add Function按钮后,弹出一个

21、对话框,显示该消息默认的消息响应函数名,用户可以更改该函数名。点击OK键后,在Member Function列表框中会出现刚才确认的消息响应函数名,再单击OK键完成添加消息响应函数,该函数也是当前操作的类的成员函数。也可以点击Edit Code按钮,完成添加成员函数,并且在源代码编辑窗格中打开该函数体所在的源文件,将光标自动跳到该函数所在的位置,提示用户输入消息响应函数的代码。编辑完成后经编译、链接后即可执行相应的菜单功能。28在用户界面设计中,要实现动态更新菜单,怎么设计代码?必须为菜单选项的哪一个消息添加消息处理函数,答:在用户单击菜单后,菜单中的菜单项需要知道它目前的状态,如是否被禁用等

22、。Windows提供了ON_UPDATE_COMMAND_UI消息参与对用户界面对象(菜单和控键栏等)的更新。ON_UPDATE_COMMAND_UI消息是MFC自己定义的,菜单状态的更新工作由MFC自动处理这些细节。 29在用户界面设计中,假定应用程序框架已经带有一个初始的工具栏,在此基础上用户要设计自己的工具栏一般包括哪几个步骤?答:MFC创建工具栏的一般流程是:1 创建工具栏资源,用工具栏编辑器进行创建或编辑,方法见前述第一部分。2 在应用程序中(一般在CMainFrame中)构造CToolBar对象。3 调用CToolBar类的Create()函数或CreateEX()函数创建一个工具

23、栏,并将其与CToolBar对象相连接。4 调用LoadToolBar()函数来加载在第一步中创建的工具栏资源。30 假设有一个常用的菜单选项,其ID值为:ID_DRAW。现在要对这个菜单项创建一个工具栏按钮,则该工具栏按钮的ID值应该设置为什么值?答:其ID值为:ID_DRAW31 状态栏的作用是什么?它分为哪两种类型的文本窗格?答:状态栏的作用就是在窗格(Pane)中显示一些文本。状态栏支持两种类型的文本窗格:信息行窗格和指示器窗格。32 创建状态栏时,先要定义一个indicators数组,如下面的定义static UINT indicators =ID_SEPARATOR, ID_IND

24、ICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;该数组定义的状态栏有哪几个窗格?答:常量ID_SEPARATOR标识了消息行窗格;其它三个常量为字符串资源ID,用来标识指示器窗格,如果要增加指示器窗格,则只需在数组中增加相应的ID。通过增加ID_SEPARATOR常量还可以增加消息行窗格。下图显示了indicators数组及它同状态栏的关系。CStatusBar:SetIndicators成员函数根据indicators数组的内容来配置状态栏。33对于有模式的对话框,调用对话框类的哪个成员函数才能显示这个对话框?答:有模式对话框用对话框的DoMo

25、dal()函数来显示。34在用户界面设计中,设计并使用一个对话框的有哪些主要步骤?答:1 创建应用程序框架。2 在文档类中增加所需要的成员变量。3 创建对话框资源4 创建对话框类5为对话框类添加成员变量,使其与对话框中的控件相关6 编辑菜单资源及添加菜单的消息响应函数7 在对话框类中为OK按钮添加消息响应函数。8 在视图类的实现文件中添加有关的包含文件。9 修改视图类的OnDraw()函数10 编译、链接、执行该程序35 阐述使用关联成员变量进行对话框数据交换的机制。答:使用关联成员变量更新数据:就是将对话框中的一个控件与一个变量相关联,当数据有更新时,可以使用UpdateData()函数让对

26、话框数据或控件显示的数据进行更新。36 在MFC中,有哪些常用的基本控件?各有什么作用?答:控件类型作用静态控件显示一些固定的文字提示或图形描述按钮用来产生某些命令或改变某些选项设置滚动条通过滚动块在滚动条上的移动来改变某些数值选项列表框显示一个列表,让用户从中选取一个或多个项编辑框实现文本的输入输出,用户能查看并编辑文字组合框把列表框和编辑框有机地组合在一起,用户不仅能选择列表中已有的项,还能添加新的项37 MFC提供了哪几类常用的绘图工具?各有什么功能?答:这些工具就是GDI对象。GDI对象包括绘制线条的画笔、用于区域填充的画刷以及绘制文本的字体等。38 使用画笔工具的主要步骤有那些?答:

27、使用画笔的主要步骤如下: 创建新的画笔类对象 保存原来的旧画笔, 开始实际绘图工作 恢复原来的旧画笔39 CDC类提供哪两类文本输出函数?各有什么特点?答:CDC类中有两种文本输出函数:TextOut()函数和DrawText()函数,TextOut()函数只能处理单行文本,而DrawText()函数可以处理多行文本。40 CDC类中下列绘图函数的功能是什么?各参数的含义是什么?COLORREF SetPixel(int x, int y, COLORREF crColor);画点函数:它用指定的颜色在指定的坐标位置画一个点,其中,参数x, y指定点的坐标;crColor 指定颜色值,可以使用

28、RGB(rr,gg,bb)宏合成颜色。p为一个POINT结构或CPoint对象,其成员就是x, y,即点的坐标。CPoint MoveTo(int x, int y);画直线先用MoveTo()函数移动当前点使用x, y来指定新位置点的坐标BOOL LineTo(int x, int y);LineTo()函数用于在当前点和指定点之间画一条直线,使用x, y来指定线段终点的坐标BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);Arc()函数用于画一条椭圆弧线参数的含义如下:x1, y1:指定矩形左上

29、角的坐标。 x2, y2:指定矩形右下角的坐标。x3, y3:指定圆弧起始参考点坐标。 x4, y4:指定圆弧结束参考点坐标。BOOL Ellipse(int x1, int y1, int x2, int y2);Ellipse()函数用于画椭圆参数x1, y1指定椭圆外切矩形左上角横、纵坐标;x2, y2指定椭圆外切矩形右下角横、纵坐标;BOOL Rectangle(int x1, int y1, int x2, int y2);Rectangle()函数用于画矩形,其中,参数x1, y1指定矩形左上角横、纵坐标;x2, y2指定矩形右下角横、纵坐标41 简述动态链节与静态链节的区别答:所

30、谓静态链接就是把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分,可执行文件中包含了运行时所需的全部代码。但当多个程序都调用同一函数时,内存中就会存在这个函数的多个拷贝,这显然造成了内存资源的浪费。它还增加了可执行文件的大小,会占用更多的磁盘空间。另外,在编写大的可执行文件时,每次修改源代码都要对所有的源代码进行编译,增加了编译的复杂性,也不利于阶段性的单元调试。在动态链接中,所要调用的函数代码并没有被拷贝到可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息。当应用程序开始运行时,在Windows的管理下,在应用程序和相应的动态链接之间建立关系,当要执行所调用的动态链接时,

31、根据链接的描述信息,Windows转去执行动态链接中相应的函数代码。42 使用Visual C+可以生成哪几种类型的动态链接库?答:使用VisualC+,可以生成四种类型的动态链接库。使用“Win32应用程序向导”创建Win32 DLL,也称为非MFC DLL。 使用“MFC DLL向导”生成静态链接到MFC的规则DLL。 使用“MFC DLL向导”生成动态链接到MFC的规则DLL。 使用“MFC DLL向导”生成MFC扩展DLL,这些DLL使用动态链接MFC。43 在DLL中声明导出函数有哪几种方法答:DLL中声明导出函数共有三种方法: 在生成DLL时,创建一个模块定义文件(.DEF)并使用此文件。 在即将导出的函数定义中使用关键字 _declspec(dllexport)。 使用AFX_EXT_CLASS宏导出类,这种方法只能用于扩展DLL。44 应用程序隐式链接到DLL时必须要提供哪几个文件?答:为了隐式链接到DLL,可执行文件必须从DLL的提供者获取三个文件: 包含导出函数或C+类的声明的头文件(.H),在程序开发时需要知道函数名和函数的入口信息。使用DLL的可执行文件必须包含头文件,此头文件中包含每个源文件中的导出函数或C+类,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论