西安邮电大学windows编程考试
问答题
1.Windows API是什么?MFC是什么?请写出它们的英文全称。
Windows的API是Windows操作系统的应用程序接口。
Windows的API的英文全称是Windows Application Programming Interface.
Winsows编程中MFC表示微软基础类库,
它的英文全称是Microsoft Foundation Class.
2 MFC消息机制以及事件模型是什么?
MFC消息机制 Windows是基于消息驱动的,作好消息处理是Windows编程的关键任务之一,在MFC中消息是通过一种所谓的消息映射机制来处理的。应用程序框架使用消息映射(message map)来连接消息和对应的消息处理函数。消息映射本质上就是一个数组,应用程序框架使用该数组来确定消息传递时具体要传递给哪个对象,由哪个消息处理函数来处理。这样的好处是可以避免罗列一大堆的case语句来处理各种消息。
事件模型事件驱动程序设计是一种全新的程序设计方法,它不是由事件的顺序来控 制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没 有预定的顺序,这样就允许程序的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。
3.Windows编程中窗口的含义是什么?
答:在Windows中,一个窗口就是屏幕上的一个矩形区域,它接收用户的输入并以文字或图形的格式显示输出内容。窗口是Windows应用程序基本的操作单元,是应用程序与用户之间交互的接口,也是系统管理应用程序的基本单位。
4.Windows系统提供的标准控件有那些?
答:静态控件,按钮控件,编辑框控件,列表框控件,组合框控件,滚动条控件。
5.Windows应用程序可以使用哪些资源?资源的主要作用有哪些?
答:Windowss应用程序可以使用:加速键,位图,光标,对话框,菜单,工具条,字符串等。在Windows的可执行文件中,资源是独立于代码的,使用单独的Resource Compiler来进行编译,并嵌入到可执行文件中,在编程过程中,代码是可复用的,通过资源的导入导出功能来实现资源的可复用。另外,程序的国际化,也是通过资源来实现的。
6 什么是图形设备接口GDI, 请写出全称? 并解释设备无关性
答:Windows图形设备接口(GDI)的英文全称是Graphics Device Interface,是为与设备无关的图形设计的,GDI处于设备驱动程序的上一层,是Windows的重要组成部分。它负责管理用户绘图操作时功能的转换。Windows 通过GDI函数为应用程序提供服务。用户通过调用GDI函数绘制不同尺寸、颜色、风格的几何图形、文本和位图。GDI通过不同设备提供的驱动程序将绘图语句转换为对应的绘图指令,避免了应用程序直接对硬件进行操作,从而实现所谓的设备无关性。
7 请解释设备环境DC
“设备”是指任何类型的显示器或打印机等输出设备,绘图时用户不用关心所使用设备的编程原理和方法。所有的绘制操作必须通过设备环境进行间接的处理,Windows自动将设备环境所描述的结构映射到相应的物理设备上。 从根本上来说,设备环境DC是一个Windows数据结构,该结构存储着程序向设备输出时所需要的信息,应用程序利用它定义图形对象及其属性,并实现应用程序、设备驱动程序和输出设备之间绘图命令的转换。在Windows中不使用DC无法进行输出,在使用任何GDI绘图函数之前,必须建立一个设备环境。
8 MFC中设备环境类有哪些? 请解释有代表性的几个设备环境类?
CDC类 既作为其它MFC设备环境类的基类,又可以作为一个一般的设备环境类使用。利用它可以访问设备属性和设置绘图属性。CDC类对GDI的所有绘图函数进行了封装。 CPaintDC类 是OnPaint()函数使用的设备环境类,它代表一个窗
口的绘图画面。如果添加WM_PAINT消息处理函数OnPaint(),就需要使用CPaintDC类来定义一个设备环境对象。
CClientDC类 代表了客户区设备环境。当在客户区实时绘图时,需要利用CClientDC类定义一个客户区设备环境。
CWindowDC类 代表了整个程序窗口设备环境,可以在整个窗口区域绘图。
9.简述应用程序类、框架类、文档类和视图类的主要功能?
答:应用程序类CWinApp负责一个且唯一的一个应用程序对象的创建、初始化、运行和退出清理过程。
框架窗口类CframeWnd负责显示和搜索用户命令,例如:响应标准的窗口消息。 视图类Cview负责为文档提供一个或者多个视图。
文档类Cdocument负责装载和维护文档。
10 文档视图的优点是什么?
使用 MFC 文档/视图结构的主要优点是该结构能够很好地支持同一文档的多个视图。(如果不需要多个视图并且文档/视图的少量系统开销在应用程序中过多,则可以避免该结构、当用户更新其中一个视图时,该视图对象调用 CDocument::UpdateAllViews。该函数通知所有文档视图,每个视图使用文档中的最新数据更新自身。单一调用 UpdateAllViews 对不同的视图进行同步处理。
11.Windows编程中常用的消息有 哪些?应用程序如何响应键盘消息? Windows中常用的消息有:窗口管理消息、初始化消息、输入消息、系统消息、
剪切板消息、控件处理消息、控件通知消息、滚动条通知消息、非用户区消息、MDI(多文档见面)消息、DDE(动态数据交换)消息,以及应用程序自定义的消息等。当用户按下一个键时,WINDOWS就会发送一个键盘输入消息给有输入焦点的那个应用程序,应用程序会根据输入消息执行相应的任务
12.简述在VC++开发环境中创建一个MFC对话框应用程序的过程?
执行File]New命令打开new对话框,选择MFC AppWizard [exe]项,输入程序名,单机】击OK按钮,在随后出现的MFC AppWizard –Step对话框窗口中选择Dialog based选项,单击finish按钮就创建了应用程序项目。
13 序列化的基本思想是什么?
序列化的基本思想 一个类应该能够对自己的成员变量的数据进行读写操作,对象可以通过读操作而重新创建。即对象可以将其当前状态(由其成员变量的值表示)写入永久性存储体(通常是指磁盘)中,以后可以从永久性存储体中读取(载入)对象的状态,从而重建对象。类的对象自己应该具备将状态值写入磁盘或从磁盘中读出的方法(即成员函数),这种对象的保存和恢复的过程称为序列化。 一个可序列化的类必须有一个称作为序列化的成员函数Serialize(),文档的序列化在文档类的成员函数Serialize()中进行。MFC AppWizard应用程序向导在生成应用程序时只创建了文档派生类序列化Serialize()函数的框架,由于不程序的数据结构各不相同,可序列化的类应该重载Serialize()函数,使其支持对特定数据的序列化。并且,任何需要保存的变量(数据)都应该在文档派生类中声明。
14 什么是静态链接库和动态连接库,都有什么作用?
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
15 VC++工程中包含哪些文件,其作用是什么。 (如DSW,DSP,.CPP,.h,.RES文件) .DSW:是工作区文件,一个工作区可能包含一个或多个工程。
.DSP:是VC++的工程配置文件,记录当前工程的有关信息
.CPP:源代码文件,按C++语法编译处理。
.H:用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。 .RES:二进制资源文件,资源编译器编译资源定义文件后即生成RES文件。
.EXP:由LIB工具从DEF文件生成的输出文件,其中包含了函数和数
据项目的输出信息,LINK工具将使用EXP文件来创 建动态链接库。
只有在编译DLL时才会生成,记录了DLL文件中的一些信息。
.LIB:库文件,LINK工具将使用它来连接各种输入库,以便最终生成EXE文件。
.OBJ:由编译器或汇编工具生成的目标文件,是模块的二进制中间文件。
.ODL:用对象描述语言编写的源代码文件,VC用它来生成TLB文件。
.OLB:带有类型库资源的一种特殊的动态链接库,也叫对象库文件。
.PLG:编译信息文件,编译时的error和warning信息文件。
程序阅读题
一.下列代码段是一个API函数程序设计的源代码,其功能是显示一个标题为“My_Windows”的空白窗口,请阅读完程序后回答后面的问题。
#include
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
①程序开始有语句行 “#include ” ,它有什么作用?
当API程序中用到Windows中定义的API函数、宏定义和相应的数据结构等时,程序前面必须加上该语句行。
②消息“WM_DESTROY”是在什么条件下产生的?
当关闭窗口时会产生WM_DESTROY消息。
③WinMain函数定义中第一个形式参数hInstance的含义是什么?它的值从什么地方产生? 形式参数hInstance是当前应用程序实例句柄。当该程序运行时,操作系统会产生一个无符号的32位整数(即当前应用程序实例句柄)并传递给该参数。
④程序中语句行“WndClass.lpfnWndProc=WndProc;”的作用是什么?
语句行“WndClass.lpfnWndProc=WndProc;”的作用是为窗口WndClass指定窗口函数 ⑤写出本程序中消息循环的代码段,并指出程序在什么条件下退出消息循环?
本程序中消息循环的代码段如下:
while (GetMessage(&msg,NULL,0,0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);}
当函数GetMessage(&msg,NULL,0,0)从消息队列中取出消息WM_QUIT时,其返回值为0,此时退出消息循环。
⑥指出函数WndProc()的功能及其形式参数的含义?
函数WndProc()是窗口函数,用来根据对应窗口上的不同的消息来执行不同的代码。各形式参数含义如下:
HWND hwnd: 对应消息的窗口句柄
UINT message: 要处理的消息编号
WPARAM wParam:消息所带附加信息的字参数
LPARAM lParam: 消息所带附加信息的长字参数
⑦函数LoadCursor()、RegisterClass ()、PostQuitMessage() 和DefWindowProc()的功能是什么? LoadCursor():加载鼠标光标,即当鼠标移动到该窗口上时鼠标的光标;
RegisterClass ():在创建窗口时向系统注册窗口类;
PostQuitMessage():产生WM_QUIT消息,并存放到消息队列中;
DefWindowProc():默认的消息处理函数,即在窗口函数中不需要编写代码来 处理的消息都由它来处理。
⑧ 消息循环中函数GetMessage()和TranslateMessage()的功能是什么?,程序在什么条件下退出消息循环?
消息循环中函数GetMessage()的功能是从消息队列中取出消息,函数TranslateMessage()的功能是对取出的消息进行相应的转换;当函数GetMessage()从消息队列中取出消息为WM_QUIT时,其返回值为0,此时退出消息循环。
⑨ 试简述该程序的执行过程?
当该源程序被编译连接形成可执行文件后,就可以运行了。该程序先从主函数开始运行,步骤如下:
第一步:定义窗口变量wndclass并设置其各成员分量的值;
第二步:向系统注册窗口类(wndclass),注册失败将退出程序的执行,否则继续; 第三步:创建并显示窗口;
第四步:进入消息循环,此时调用GetMessage(&msg,NULL,0,0)函数从消息队列取消息,若消息不为WM_QUIT,则调用函数TranslateMessage(&msg)对消息中的信息进行相应的转换,然后调用函数DispatchMessage(&msg)把消息发送到对应的窗口以驱动对应的窗口函数的执行;
第五步:窗口函数利用switch-case结构根据不同的消息来执行不同的代码段
第六步:若GetMessage(&msg,NULL,0,0) 函数从消息队列中取出的消息为WM_QUIT, 则返回值为0,最终退出消息循环,从而退出主函数,应用程序运行结束。
二.下面是一个MFC的程序,请根据程序回答如下问题:
#include
class CMainWindow : public CFrameWnd
(1) #include 的作用是什么?
MFC中的核心和标准组件所在的头文件。比如CFrameWnd 和CWinApp等核心类都在afxwin.h文件中。
(2) 程序的入口在什么地方?
程序从此处开始执行CMyApp x;,实例化之后调用CMyApp :: InitInstance (),也就是从m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow (); 开始执行。
(3) 请解释程序的执行过程?
请对照下图
(4) MFC 和window API的关系是什么?
MFC是一个微软提供的基础类库,它封装了WINDOWS里的API,对于开发者来说,用MFC会比直接用Windows的API来得容易一些。(所有Windows应用程序都得通过使用Windows API来实现)MFC中还提供了很好的应用程序框架,最突出的就是"文档-视"结构。
(5) ON_WM_PAINT ()事件发生在何时?
此为windows绘图事件,窗体初始化时候就执行了一次,当移动窗体、
改变窗体大小,
最大化,最小化,窗体被其他窗体遮住后再次显示。都会执行发生paint事件,执行afx_msg void OnPaint ()方法。
三.下列代码段是一段用VB60设计的图片浏览程序的源代码,其功能是能够显示*.JPG、*.BMP等类型的图片(其中:cmbPic是组合框、imgPic是图象框、drvPic是驱动器列表框、dirPic是文件夹列表框、filPic是文件列表框对象的名称),请阅读完程序后回答后面的问题。 Private Sub Form_Load()
cmbPic.AddItem "*.BMP"
cmbPic.AddItem "*.JPG"
cmbPic.AddItem "*.*"
cmbPic.Text = "*.*"
imgPic.Stretch = True
End Sub
1 该程序中设计了哪些事件过程?它们都有什么功能?
Form_Load():窗体的Load事件过程,功能是给组合框中添加项目;
drvPic_Change():驱动器列表框的Change事件过程,功能是根据驱动器列表框的变化而设置文件夹列表框的Path属性的值;
dirPic_Change():文件夹列表框的Change事件过程,功能是根据文件夹列表框的变化而设置文件列表框的Path属性的值;
cmbPic_Click():组合框的Click事件过程,功能是根据组合框的变化而指定文件列表框中显示文件的类型;
filPic_Click():文件列表框的Click事件过程,功能是根据在文件列表框中所选择的文件而在图象框中显示对应的图片。
2 试结合该段程序代码说明该程序的执行过程?
当该源程序被编译连接形成可执行文件后,就可以运行了。该程序的运行过程如下: 第一步:加载窗体到内存,发生Load事件,执行Form_Load()事件过程。
第二步:要显示某个图片,首先要找到其对应的图片文件,其方法是在drvPic中选择对应的驱动器,发生Change事件,调用执行drvPic_Change();在dirPic中选择对应的文件夹,发生Change事件,调用执行dirPic_Change();然后在filPic中左键单击对应的图片文件,发生Click事件,调用执行filPic_Click(),从而在imgPic中显示出对应的图片。
第三步:如果要改变filPic中显示的文件类型,就要在cmbPic中选择对应的文件类型,发生Click事件,调用执行cmbPic_Click()事件过程,从而使filPic中显示相应类型的文件名列表。
四.下面是一个三子棋的游戏代码,请根据代码回答如下问题
1 该程序中设计了哪些事件过程?它们都有什么功能?
主要是两个事件过程
Private Sub Form_Load() 程序运行时,窗体加载的事件
Private Sub lblGrid_Click(Index As Integer) 点击棋盘格子中发生的事件。
首先加载窗体,然后加载窗体中的棋盘组件。等待用户的事件消息发生,进行对弈。 2 .试结合该段程序代码说明该程序的执行过程?
当该源程序被编译连接形成可执行文件后,就可以运行了。该程序的运行过程如下: 第一步:加载窗体到内存,发生Load事件,执行Form_Load()事件过程。
第二步:点击到,某个棋格当中,判断是否可落子,可以落子,判断是哪一方的棋子,进行落子绘制。随后判断当前的两方谁胜谁负,进行下一次lblGrid_Click事件的发生。
第三步:关闭窗体时,窗体关闭的消息发生,窗体关闭,相应资源回收。