2024年4月2日发(作者:)

1. Windows应用程序中消息传递是如何进行的?

简答:由Windows以及由其他应用程序向用户的应用程序发送的全部消息都储存在消息队列中,等待

调用。SDK程序以消息循环调用Windows消息,如下代码表示此循环一直运行到程序接受终止执行消

息才停止。

MSG Msg;

while (GetMessage (&Msg,NULL,0,0))

{ TranslateMessage(&Msg);

DispatchMessage(&Msg); }

在While循环内部,由循环的每次迭代调用Windows API函数GetMessage (&Msg,NULL,0,0)以得到消

息队列中的下一个消息,并把它存在特定的MSG结构体变量Msg中。TranslateMessage(&Msg)实现键

盘上某个键的翻译。DispatchMessage(&Msg)函数向窗口的消息处理函数发送消息,调用相应的消息处

理函数。完成后进入下一个循环

2. Windows应用程序常用消息?

简答:窗口消息、命令消息和控件消息

3. Windows应用程序的最基本构成?

简答:

1) Windows应用程序由WinMain函数和WndProc窗口处理函数构成基本框架。

2) WinMain函数是所有Windows程序的入口,其功能包含窗口类的定义和注册,窗口的创建和显示,

并产生消息循环。

WinMain(„)//程序的入口点

{ WNDCLASS wndclass ; //定义窗口类

RegisterClass ( &wndclass); //注册窗口类

CreateWindow („); //创建窗口

ShowWindow („) ; //显示窗口

UpdateWindow („); //更新窗口

While (GetMessage (&msg,NULL,0,0))

//消息循环,将消息派送给窗口函数WndProc

{ TranslateMessage (&msg);

DispatchMessage (&msg);

}

}

3) WndProc窗口处理函数定义了应用程序对收到的不同消息的响应,其中包含了应用程序对各种可能

接收到的消息的处理过程,是消息处理分支控制语句的集合。

WndProc (hwnd, message, wParam, lParam)

{

switch (message)

{

case …

case WM_DESTROY: //关闭窗口并退出程序

PostQuitMessage (0);

default:

return DefWindowProc (hwnd,message,wParam,lParam);

}

return (0);

}

4. 什么是图形设备接口?如何支持与设备无关的图形?

简答:

GDI:图形设备接口(Graphics Device Interface)

GDI是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设

备上显示图形或文字。 Windows应用程序使用GDI和Windows设备驱动程序来支持与设备无关的图

形。

5. 应用程序如何获取设备环境输出图形?比较两种方法的异同?

简答:常用的获取设备环境的方法是调用函数BeginPaint和GetDC,采用的方法为响应WM_PAINT消

息:

case WM_PAINT:

HDC hdc; //定义一个DC句柄变量

PAINTSTRUCT ps; //定义无效区域

hdc = BeginPaint(hwnd, &ps);

//使无效窗口变为有效,并获得一个DC句柄

„ //使用 GDI 函数

EndPaint(hwnd, &ps); //释放DC句柄

函数

项目

适用场合

操作区域

释放设备环境所用函数

BeginPaint

只适用于由WM_PAINT消

息驱动的图形刷新

无效区域

EndPaint

GetDC

非WM_PAINT消息驱动

也可以,使用范围更广

整个用户区

ReleaseDC

6. VC6建立的工程中后缀为.cpp,.h,.rc,.dsp,.dsw的文件的作用是什么?

文 件 名

.cpp

.h

.rc

.dsw

.dsp

.clw

说 明

源文件,源程序代码,常为类的实现文件

包含函数声明和变量定义的头文件头文件,常为类的声明文件

可编辑资源脚本文件

工作区文件,它保存了当前工作区所包含的项目的信息,一个工作

区可能包含一个或多个工程

项目文件,它包含当前项目的设置、项目中包含的文件等信息

类信息文件,它含有能被AppWizard用来编辑现有类或增加新类

的信息。AppWizard还用这个文件来保存创建和编辑消息映射与对

话框数据所需的信息,以及创建虚拟成员函数所需的信息

7. MFC支持的三种不同类型的应用程序?相互间的区别?其中哪些采用了文档/视图结构?

简答:MFC应用程序向导能建立基于单文档(SDI),基于多文档(MDI)和基于对话框(Dialog Based)三种

应用程序的框架。其中前两种采用了文档/视图结构。

8. 简述链接器在控制台程序方式、API程序方式和MFC程序方式在寻找入口函数上的不同。

简答:

控制台程序方式(Console Application):链接器自动去寻找main()函数作为入口

API程序方式(Win32 Application):链接器自动去寻找Winmain()函数作为入口

MFC程序方式(MFC Application(exe)) :使用系统的AfxWinMain()函数作为入口

9. 使用MFC AppWizard生成一个简单的单文档应用程序,分析创建了哪些主要类?各类的作用?

简答:应用程序框架类CMainFrame、应用程序类、文档类、视图类和关于帮助类。这五个类之间

的通讯和数据交换是通过相互调用公开成员函数和发送消息来完成的。

应用程序类:负责程序的初始化、运行以及结束处理;

主窗口类:负责主窗口的创建、显示和搜索用户命令以及消息派发;

文档类:负责应用程序文档的装载和维护,文档是应用程序需要保存的任何内容;

视图类:负责为文档提供一个或几个视图,视图的作用是为显示和修改文档提供人机界面。

类名称

CMymfcApp

CMainFrame

CMymfcDoc

CMymfcView

基 类

CWinApp

CFrameWnd

CDocument

CView

类声明文件

Mymfc.h

MainFrm.h

MymfcDoc.h

MymfcView.h

类实现文件

10. 使用MFC AppWizard生成应用程序时,在源程序中找不到WinMain()函数,为什么?

简答:MFC应用程序中都以一个公有的AfxWinMain()函数作为程序的入口,此函数存储在VC安装目

录„Microsoft Visual StudioVC98MFCSRC的文件中。

11. 简述MFC应用程序的启动流程.

简答:MFC应用程序从theApp开始启动

(1) 构建theApp全局对象

(2) 操作系统加载AfxWinMain函数,启动应用程序, InitInstance ()函数调用

(3) 创建并显示窗口(InitInstance ()函数中“注册文档模板”过程中隐含地创建了主窗口)

(4) 返回AfxWinMain函数,再调用函数Run(),启动消息循环,接收系统或用户的消息,完成用户

需要的功能。

(5) 当接收WM_QUIT消息或按下键时,应用程序从Run成员函数内部调用函数

ExitInstance () ,使应用程序从当前实例中退出当应用程序终止时,执行清除工作,将控制权交给操作

系统。

12. AppWizard所产生的STDAFX文件的作用?

简答:StdAfx.h是预编译头文件,将常用的MFC头文件都放在StdAfx.h中,如afxwin.h、afxext.h、

afxdisp.h、afxcmn.h等,同时让包含StdAfx .h

作用:只需编译一次,并能生成预编译头文件,采用预编译头文件可以加速编译过程

13. 文档/视图结构的作用?

简答:文档对数据进行管理和维护,数据保存在文档类的成员变量中;视图在文档和用户之间起中介作

用,接收用户的输入并接受用户的修改视图可以直接或间接的访问文档类中的成员变量,它从文档类中

(而不是从存储介质中)将文档中的数据取出来,然后在屏幕上显示文档的数据

14. 如何获取一个对话框中控件的指针?

简答:调用CWnd: : GetDlgItem,获取一个CWnd*指针调用成员函数。

15. 如何使窗口不可见?

简答:用SW_HIDE 隐藏窗口,可以结合 FindWindow,ShowWindow 控制。

16. 如何创建和使用模态(模式)对话框?

简答:

(1) 使用资源编辑器建立对话框资源并使用ClassWizard创建一个CDialog的派生类

(2) 创建派生类的对象

(3) 使用对象名调用DoModal()函数,弹出模态对话框

(4) 如果选择OK按钮,则DoModal()返回IDOK;如果选择Cancel按钮,则DoModal()返回

IDCANCEL,取消用户输入。

17. 如何禁止和使能控件?

简答:控件也是窗口,所以可以调用CWnd::EnableWindow使能和禁止控件。

m_Window(TRUE)

m_Window(FALSE )

18. 简述在MFC应用程序中UpdateData函数的作用及其参数含义与使用场合。

简答:

UpdateData只有一个BOOL类型的参数,UpdateData(FALSE)一般用于对话框控件连接的变量值刷新屏

幕显示;UpdateData(TRUE)用于获取屏幕数据到对话框控件连接的变量中。

19. 已知一个对话框上有一个编辑框控件,ID为IDC_EDIT1,为其关联了CEdit类型的变量m_edit1,

说明如何改变编辑框内部的文本为“Hello”,写出程序代码。

简答:

第一种方法:

m_(0,-1);

m_eSel("Hello");

第二种方法:

SetWindowText("Hello");

20. 在一个对话框上添加了三个单选按钮,要使它们之间自动实现互斥,应该注意什么问题?在VC

环境下如何操作?

简答:要实现一组单选按钮的自动互斥,应该让它们的控件ID值连续,并设置第一个单选按钮的Group

属性,其他的不设。

21. 说明系统定时器消息(WM_TIMER)的使用方法及其用到的函数 .

简答:使用定时器消息的方法是:首先调用SetTimer函数定义定时器消息,包括消息产生的时间间隔

等;然后在相应的WM_TIMER消息处理里添加定时器消息响应代码;最后调用KillTimer释放该定时

器。

22. 在MFC中,要对一个消息进行响应(如菜单的COMMAND消息)需要定义该消息的处理函数,说

明添加一消息处理函数包括的三个内容?

简答:

(1) 在头文件中声明消息处理函数

(2) 在实现文件中完成消息映射

(3) 在实现文件中加入消息处理函数

23. 单文档界面(SDI) 的应用程序和多文档界面(MDI)的应用程序的主要差别

简答:

(1) SDI的应用程序只有一个窗口;MDI的应用程序每次可以读写多个文件或文档,可同时对多个

文档进行操作,可以有多个子窗口。

(2)

在创建SDI界面的应用程序时,不生成CChildFrame类,CMainFrame类的基类为

CFrameWnd在创建MDI界面的应用程序时,CMainFrame类的基类为CMDIFrameWnd。