课后习题答案(2)

2019-08-01 23:59

第3章 Windows程序分析

1. 简述什么是窗口、句柄、消息和消息队列?API是什么?SDK又是什么?

答:窗口是Windows应用程序中一个非常重要的元素,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上的一块矩形区域,是应用程序与用户进行交互的接口。利用窗口,可以接收用户的输入,以及显示输出。

在Windows环境中,句柄是一种标识符,用来标识模块(module)、任务(task)、实例(instance)、文件(file)、内存块(block of memory)、菜单(menu)、控制(control)、字体(font)、 资源(resource)和GDI对象(GDI object)等项目。

一个消息,是系统定义的一个32位的值,唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。Windows程序是事件驱动的,事件驱动程序设计是围绕着消息的产生与处理而展开的。消息可由应用程序本身产生,也可由运行的其它应用程序产生,还可以由用户或Windows产生,每当事件发生时,Windows做出记录并将相应的消息分配到有关的应用程序中去。消息队列则是在消息的传输过程中保存消息的容器。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

Windows操作系统提供给应用程序编程的接口(Application Programming Interface,API),简称为API函数。

SDK的全称是Software Development Kit,中文译为软件开发包。SDK实际上就是开发所需资源的一个集合。

2. Windows的应用程序特点有哪些?通过对程序的框架进行分析,简述Windows程序运行过程。

答:Window应用程序的特点就是消息驱动,当系统或者用户要求应用程序完成某一个任务的时候,所依靠的就是消息,系统会把用户的要求或者系统的要求放到一个消息结构中,然后发送给应用程序,再去处理。

Windows程序具有相对固定的结构,大部分过程由系统完成,编程中只要按一定的格式填写系统留给客户的那一小部分。所需要完成的有:窗口类的定义、窗口的建立、消息函数的书写、消息循环。工作流程如下:入口“_tWinMain”、“MyRegisterClass”、“InitInstance”、“while消息循环”。函数由入口开始执行,之后调用 MyRegisterClass注册窗口类,之后InitInstance 生成并显示窗口,这样之后,就完成了一个窗口的初始化工作了(当然,在 MyRegisterClass,InitInstance 中都需要调用相应的API函数来具体的实现,不过这里重点分析的是它的结构,所以不考虑它的具体实现细节),然后就是维护消息循环。至此,这个程序的基本结构就基本建立了,程序的运作依靠这个消息循环来推动。 3. MFC的优点有哪些?文档和视图的作用是什么?

答:MFC应用程序对Windows API函数进行封装,使得不需要理解Windows内部编程机制就可以通过程序向导或模板来创建相应的应用程序框架,这些框架能满足大多数开发者的需要,并且不必添加太多的代码就能实现最常用的程序功能。

视图类主要用于表示文档中的数据,此类中拥有一个重要的函数OnDraw函数用于绘制图形,即视图显示的内容通过此函数实现。

文档类主要用于管理程序的文档,此类中的OnNewDocument函数用于创建新文档时的初始化,类中另外一个重要的函数Serialize 用于执行文档的串行化(打开文档和保存文档)。 4. 单文档应用程序框架中各个类的作用和功能是什么?

答:CWinApp、CDocument、CView、CMainFrame类

CWinAPP,主要用于创建应用程序实例,创建的CTestApp类自动重载了父类的InitInstance

函数,此函数用于初始化应用程序实例,在函数体内创建了文档模板用于管理文档、视图和框架窗口。

CView视图类主要用于表示文档中的数据,此类中拥有一个重要的函数OnDraw函数用于绘制图形,即视图显示的内容通过此函数实现。 CDocument文档类主要用于管理程序的文档,此类中的OnNewDocument函数用于创建新文档时的初始化,类中另外一个重要的函数Serialize 用于执行文档的串行化(打开文档和保存文档)。

CFrameWnd,此类主要用于管理程序的框架窗口,CMainFrame类中的函数PreCreateWindow用于预创建窗口,可以通过修改函数参数cs来修改窗口的样式。类中重载的OnCreate函数用于创建应用程序框架窗口,载入相关资源,例如工具栏、菜单栏等。 5. MFC应用程序向导提供了哪几种类型的应用程序?各有什么不同?

答:单文档、多文档、基本对话框应用程序。单文档和多文档程序都提供了文档视图机制,单文档窗口一次只能打开一个文档框架窗口,而多文档应用程序在应用程序的一个实例中打开多个文档框架窗口,这些窗口称作子窗口。这些文档可以是同一类型的,也可以是不同类型的。对话框程序不支持不提高文档视图框架结构,以一个默认对话框作为程序主界面。 6. 什么是消息?简述消息驱动机制,消息的类别有哪此?

答:一个消息,是系统定义的一个32位的值,唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。Windows程序是事件驱动的,事件驱动程序设计是围绕着消息的产生与处理而展开的。消息可由应用程序本身产生,也可由运行的其它应用程序产生,还可以由用户或Windows产生,每当事件发生时,Windows做出记录并将相应的消息分配到有关的应用程序中去。

Windows中的消息虽然很多,但是种类并不繁杂,大体上有三种:窗口消息、命令消息和控件通知消息。

7. 如何创建映射消息?如何为基于MFC的类重载虚函数?

答:消息映射创建分为类,一类通过IDE可以选择需要被映射的类,然后选择消息,再选择添加消息映射函数,另一类需要用户手工添加代码,在头文件添加消息映射函数声明,在实现文件添加消息和消息映射函数。选择需要重载的函数,选择属性,再选择重载,找到需要重载的函数,选择添加重载即可。

8. 概述MFC消息机制。Windows中有哪些常用消息?各有什么作用?

答:在MFC框架下,一般一个消息的处理过程是这样的:函数AfxWndProc接收Windows操作系统发送的消息。函数AfxWndProc调用函数AfxCallWndProc进行消息处理,这里是把对句柄的操作转换成对CWnd对象的操作。函数AfxCallWndProc调用CWnd类的函数WindowProc进行消息处理。注意AfxWndProc和AfxCallWndProc都是AFX的API函数。而WindowProc已经是CWnd的一个方法。所以可以注意到在WindowProc中已经没有关于句柄或者是CWnd的参数了。WindowProc调用方法OnWndMsg进行正式的消息处理,即把消息派送到相关的方法中去处理。Windows中常用的消息及其作用在3.3.3节中详细介绍。 9. 创建一个单文档应用程序,建立鼠标右键单击消息,每单击一次数出单击的坐标。 答:创建单文档程序,在视图类中添加右键消息映射,设定计数器,每右键单击一次,计数器加一。

10. 用户自定义消息如何创建?使用消息发送函数SendMessage和PostMessage发出消息有什么区别?

答:自定义消息步骤: 第一步:定义消息。#define WM_MYMESSAGE WM_USER+1。

第二步:实现消息处理函数。

afx_msg 返回类型 XXXX(参数);

实现文件中定义此消息处理函数: 返回类型 类::XXXX(参数){ ……}

第三步:在视图类的消息块中,使用各类消息映射宏指令将消息映射到消息处理函数中。 PostMessage只负责将消息放到消息队列中,不确定何时及是否处理,SendMessage要等到受到消息处理的返回码(DWord类型)后才继续,PostMessage执行后马上返回,SendMessage必须等到消息被处理后才会返回。

11. 创建一个单文档应用程序,记录鼠标左键单击次数,若是7的倍数时,弹出消息框,显示当前单击了多少次。

答:创建单文档程序,设定计数器,添加鼠标左键按下消息映射函数,添加相关代码。

第四章习题 参考答案

1. 简述列表框控件与组合框控件的异同?

答:列表框与组合框控件为用户提供了包含一些选项和信息的可滚动列表。

● 列表框:显示为一个可滚动的列表,允许用户从列表中选取所包含的选项,但不允许输入新的选项(即新值)。Visual FoxPro包含一个列表框生成器,可创建一个简单的列表框。 ● 组合框:是文本框与列表框的组合,平时只看见一个项,用鼠标单击下拉三角按钮可看到多项的列表。允许输入新的选项(即新值)或选取所包含的选项。 2. 简述列表框与列表视图之间的异同? 答:ListBox

ListBox 控件显示项目列表,从其中可以选择一项或多项。如果项目总数超过了可显示的项目数,就自动在 ListBox 控件上添加滚动条。功能相对简单。

ListView

ListView 控件可使用四种不同视图显示项目。通过此控件,可将项目组成带有或不带有列表头的列,并显示伴随的图标和文本。

列表控制提供了对Windows列表功能操作的基本方法,而使用列表视的视函数可以对列表视进行各种操作,通过调用视成员 GetListCtrl获取嵌在列表视内列表控制的引用(GetListCtrl& ctrlList = GetListCtrl()),就可以和列表控制一样进行各种操作。操作一个列表控制和视的基本方法为:创建列表控制;创建列表控制所需要的图像列表;向列表控制添加表列和表项;对列表进行各种控制,主要包括查找、排序、删除、显示方式、排列方式以及各种消息处理功能等;最后撤消列表控制。

对于一个列表控制,其最典型最常用的显示控制方式为:大图标方式(LVS_ICON)、小图标方式(LVS_SMALLICON)、列表显示方式(LVS_LIST)和详细资料(即报告LVS_REPORT)显示方式。这可以通过设置其显示方式属性来实现。要控制列表所在窗口的风格,可通过功能函数GetWindowLong和SetWindowLong来实现,要控制列表图标的对齐方式,可通过设置列表窗口的风格LVS_ALIGNTOP或 LVS_ALIGNLEFT来实现, 功能要复杂的多。

3. 简述模态对话框的创建步骤,简述非模态对话框的创建步骤。

答:模态对话框:

首先在DialogView.cpp文件中添加头文件“StudyDlg.h”,即加入#include\,然后在消息处理函数中调用对话框,具体代码如下:

void CDialogView::OnDialog() //之前创建的消息响应

{

CStudyDlg mydlg;

if(IDOK==mydlg.DoModal()) { ……//单击“确定”后的处理 }

if(CANCEL==mydlg.DoModal()) { }

}

上面的程序中,先是定义一个对话框对象mydlg,然后利用这个对象调用DoModal函数以产生一个模态对话框。另外,在视图类中并不知道这个CStudyDlg对话框是什么样的数据类型,所以还必须在视图类的源文件中包含这个CStudyDlg类的头文件,如下:

#include \

调试运行该程序,会看到如图所示的运行结果,单击“显示对话框”菜单,就会出现刚刚设计的学习对话框,如图所示。

……//单击“取消”后的处理

非模态对话框:基于上面模态对话框步骤,修改OnDialog()

void CDialogView::OnDialog() {

CStudyDlg *pDlg=new CStudyDlg; pDlg->Create(IDD_DIALOG1,this); pDlg->ShowWindow(SW_SHOW); }

调试并运行Dialog程序,如图所示,这就是非模

态对话框的特点。因为程序显示非模态对话框时,并不会停留在某条语句处,所以CDialogView类的OnDialog函数内部的代码就会顺序地被执行,直到该函数执行结束,这时,程序就可以执行其它任务了,例如响应“文件”菜单的单击操作。

4. 如何实现在运行单文档应用程序时,首先弹出一个模态对话框?

答:.首先你要新建一个对话框,并为这个对话框新建一个类,假如为CMyDlg。在应用程序类(C***App)的InitInstance()函数里AfxEnableControlContainer();这句话后面添加如下代码(当然要包含头文件MyDlg.h): CMyDlg dlg;

if (dlg.DoModal() != IDOK) {

return FALSE;

}

5. 简述属性页对话框创建步骤?

答:属性页对话框是将多个对话框集中起来,通过标签将各个页面激活。与属性页对话框相关的类主

要包括CPropertySheet类和CPropertyPage类。一个属性页对话框可以包括一个CPropertySheet类和多 个CPropertyPage类对象。

CPropertySheet类是CWnd类的派生类,其对象作为属性对话框的窗口框架出现,主要实现管理各 个属性页面的作用。其用于管理属性页对话框的主要成员函数详见msdn。 CPropertyPage类是CDialog类的一个派生类,其用于管理属性页对话框的主要成员函数详见msdn。 使用CPropertySheet类和CPropertyPage类创建属性页对话框的示例步骤如下:

(1) 在资源编辑器中新增5个对话框资源,其ID值分别为:IDD_DIALOG1、IDD_DIALOG2、 IDD_DIALOG3、IDD_DIALOG4、IDD_DIALOG5。并为这些对话框资源新增5个以CPropertyPage类为基类的

派生类CMyPropertyPage1、CMyPropertyPage2、CMyPropertyPage3、CMyPropertyPage4、 CMyPropertyPage5。

(2) 在应用程序自动生成的对话框头文件和实现文件从工程中删除,并新增一个以CPropertySheet

类为基类的派生类CMyPropertySheet,该类的头文件和实现文件新增部分如下所示: 在头文件中增加: #include\ #include\ #include\ #include\ #include\ CMyPropertyPage1 m_Page1; CMyPropertyPage2 m_Page2;

CMyPropertyPage3 m_Page3; CMyPropertyPage4 m_Page4; CMyPropertyPage5 m_Page5;

在实现文件中的构造函数中加入:

CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage):CPropertySheet(pszCaption, pParentWnd, iSelectPage) {

AddPage(&m_Page1); AddPage(&m_Page2); AddPage(&m_Page3); AddPage(&m_Page4); AddPage(&m_Page5);

}

(3)按照下面所示的代码,在应用程序类中修改InitInstance()函数。 #include \

//把以前生成默认对话框的两行代码修改成下面的两行代码

CMyPropertySheet dlg(\、如何创建一个属性页对话框?\


课后习题答案(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:宪法知识竞赛题(正式稿不含答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: