Visual C++ 实用教程 第4版 - 郑阿奇 - - 习题参考答案 下载本文

6.什么是DDV/DDX技术?如何使用这种技术?

为了能方便地操作一个控件,MFC采用了独特的DDX(Dynamic Data Exchange,动态数据交换)和DDV(Dynamic Data verify,动态数据交换)技术。DDX将数据成员变量与对话类模板内的控件相连接,这样使得数据在控件之间很容易传输。DDV用于数据的校验,它能自动校验数据成员变量数值的范围,并给出警告。

7.什么是控件的通知消息?它在编程中起哪些作用?

当控件状态发生改变时,控件就会向其父窗口发送消息,这就是控件的通知消息。控件的通知消息可以是一条WM_COMMAND消息,也可以是一条WM_NOTIFY消息。

8.什么是按钮控件?它有几种类型?

按钮控件是CButton类的控件。按钮控件分为:

⑴推压式按钮BS_PUSHBUTTON;⑵单选按钮BS_RADIOBUTTON;⑶复选按钮BS_CHECKBOX

9.什么是编辑框控件?它有哪些功能?

编辑框是一个允许用户从键盘输入数据和编辑文本的矩形窗口。编辑框属于CEdit类的“窗口控件”,可以获得输入焦点。

10.编辑框控件中的EN_CHANGE和EN_UPDATE通知消息有何异同? ? EN_CHANGE:在文本发生改变后产生。

? EN_UPDATE:在文本发生改变,还未显示之前产生。

11.向某一个应用程序添加一个对话框,并在对话框中添加一个按钮和一个编辑框,当单击按钮后,在编辑框中显示“你好!”字样。

12.什么是列表框和组合框?它们的通知消息有何异同?

列表框控件提供了文本项目的列表供用户选择,可以单选也可以多选。列表框是CListBox类的;组合框可以看成是编辑框和列表框的组合,它提供了列表框,允许用户从中选择项目;也提供了编辑框,允许用户直接输入,它是CCombobox类的。

这两个控件发送的都是通知消息(WM_NOTIFY)。当列表框中发生了某个动作,比如双击了列表框中某项时,列表框就会向其父窗口发送一条通知消息;而在组合框的通知消息中,有的是列表框发出的,有的是编辑框发出的。

13.在例[Ex_CommCtrls]的CListBoxDlg对话框中,如果使登记的成绩是4门课程,则对话框中的控件应如何添加?代码应如何修改?

14.什么是滚动条、进展条、滑动条和旋转按钮控件?

⑴滚动条:是CSrollBar类的控件,它有一个独立的窗口,两端有两个箭头按钮,中间有一个可移动的滚动块 ,具有直接的输入焦点,分为垂直滚动条和水平滚动条两种类型。 ⑵进展条:用于说明一个操作的进度,在操作过程中不断地从左到右填充进展条,可以让用户看到还有多少任务要完成。

⑶滑动条:由滑动块和可选的刻度线组成的,它是CSliderCtrl 类的。

⑷旋转按钮控件:是CSpinButtonCtrl类的,由一对箭头按钮组成,它通常与一个相伴的控件一起使用。

15.什么是旋转按钮的“伙伴”控件?如何设置?

与旋转按钮控件一起使用的控件称为“伙伴(buddy)控件”, 单击旋转按钮控件的箭头按钮,可以增大或减小其伙伴控件中某个值。 伙伴(buddy)控件的设置有两种方法:

①SetBuddy:设置旋转控件的伙伴窗口。 ②在对话框中用Ctrl+D进行设置

16.在MFC中,通用对话框有哪些?如何在程序中使用它们?

Windows提供了一组标准用户界面对话框,它们都有相应的MFC库中的类来支持,所有这些通用对话框类都是从一个公共的基类CCommonDialog派生而来的。

MFC的涌用对话框

17.如果消息对话框只有“是”和“否”两个按钮,则如何设置MessageBox函数的参数?

答:可以将MessageBox函数中的参数nType设置为MB_YESNO。

第5章 菜单、工具栏和状态栏

1.菜单有哪些常见的规则? P221

为了使Windows程序更容易操作,菜单的显示都遵循下列一些规则:

⑴若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“?”。

⑵若某项菜单有子菜单,那么在该菜单项文本后有 。 ⑶若菜单项需要助记符,则用括号将带下画线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。

⑷若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。

2.什么是助记符?它是如何在菜单中定义的? P221

菜单项的助记符是用括号和带下画线的字母括起来的符号,助记符与Alt构成一个组合键。

3.菜单项的消息有哪些?

菜单项产生的消息有:COMMAND 消息和UPDATE_COMMAND_UI消息。

4.若对同一个菜单用Class Wizard分别在视图类和主框架窗口类CMainFrame都处理其 COMMAND消息,并在它们的函数中添加相同的代码,则当用户选择该菜单后,会有什么

样的结果?为什么?

命令消息处理的优先级别为:命令→视图类→文档类→文档模板类→框架窗口类→应用程序类。因此,视图类的消息处理函数会执行,而

5.什么是键盘快捷键?它是如何定义的?

键盘快捷键也称为加速键,加速键一般是几个按键的组合,用于激活特定的命令。 用Ctrl+R进入资源编辑器,选择Accelerator的资源项,双击IDR_MAINFRAME,进

行加速键资源的添加。

6.什么是快捷菜单?用程序实现一般需要哪些步骤?

快捷菜单也称为浮动式弹出菜单,即按下鼠标右键时,就会相应地弹出一个菜单。 用CMenu::TrackPopupMenu和资源编辑器可以创建这样的菜单。具体操作步骤如下: ①用Ctrl+R进入资源编辑器,新建一个菜单资源;

②在视图类或其他接收鼠标右键单击的窗口类中添加WM_CONTEXTMENU消息控制函数;编辑代码如下:

CMenu menu; //菜单项目是属于CMenu类的 menu.LoadMenu(IDR_MENU1); //加载菜单资源 menu.GetSubMenu(0)->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);

7.如何使一个工具按钮和某菜单项命令相结合?

将工具栏上按钮的ID设置成和菜单项ID一样即可。

8.状态栏的作用是什么?状态栏的窗格分为几类?如何添加和减少相应的窗格? ⑴状态栏是一条位于应用程序的主窗口底部的水平条,可以分割成几个窗格,用来显示应用程序的当前状态信息或提示信息。

⑵状态栏窗格分为“信息行窗格”和“指示器窗口”。

⑶要增加一个信息行窗格,则只需在状态栏数组中适当的位置增加一个ID_SEPARATOR标识即可;要增加指示器窗格,则在状态栏数组的适当位置增加一个在“字符串表”中定义过的资源ID。若要减少窗格,只需减少数组元素即可。

9.如何在状态栏的窗格显示文本?

可以调用CStatusBar::SetPaneText函数更新任何窗格中的文本。

10.若状态栏只有一个用户定义的指示器窗格(其ID号为ID_TEXT_PANE),应如何定义?若当用户在客户区双击鼠标时,在该窗格中显示“双击鼠标”字样,则应如何编程? 答:步骤:

首先建立一个SDI应用程序,然后:

⑴用Ctrl+R进入资源编辑器,新建一个字符串资源,其ID为ID_TEXT_PANE;

⑵打开MainFrm.cpp文件,删除状态栏数组中缺省的元素,并增加一个为ID_TEXT_PANE的元素;

⑶为了使指示器窗格填满整个状态栏,可以在CMainFrame类的OnCreate函数中,添加以下代码:

m_wndStatusBar.SetPaneInfo(0,ID_TEXT_PANE,SBPS_STRETCH,0);

⑷将CMainFrame类的的成员变量m_wndStatusBar由protected类型改为public型;

⑸在SDI视图类中加入:

#include \

⑹用Ctrl+W进入类向导,在SDI视图类中映射WM_LBUTTONDBCLK的消息处理函数,并增加代码:

CMainFrame *pFrame=(CMainFrame *)AfxGetApp( )->m_pMainWnd; CStatusBar *pStatus=&pFrame->m_wndStatusBar; if (pStatus)

pStatus->SetPaneText(0,\双击鼠标\

11.什么是命令更新消息?它的作用是什么?

UPDATE_COMMAND_UI消息又称为“更新命令UI消息”,该消息映射函数中有一个CCmdUI类的对象pCmdUI,CCmdUI类中包含了一个指向菜单项或工具栏按钮的指针,于是利用该指针对菜单项或工具栏按钮的显示形式进修改。

第6章 框架窗口、文档和视图

1.什么是主窗口和文档窗口? ⑴主窗口又称为“主框架窗口”,是应用程序直接放置在桌面上的那个窗口,每个应用程序只能有一个主窗口,主框架窗口的标题栏上往往显示应用程序的名称。当用MFC 程序向导创建单文档SDI或多文档MDI应用程序时,主窗口类名是CMainFrame ,源文件名是MainFrm.h和MainFrm.cpp。

⑵文档窗口是CDocument类的派生类,只能出现在主窗口之内,即主窗口是文档窗口的工作平台。文档窗口可以包含一个文档或一个数据文件等。在一个主窗口中可同时打开几个文档窗口。

2.窗口的风格分为哪两类?各举一例。

窗口风格有一般风格(以WS_为前缀)和扩展风格(以WS_ EX_为前缀)两种形式。 例如: WS_ORDER表示窗口含有边框,WS_EX_MDICHILD 表示创建一个 MDI子窗口。

3.改变窗口风格的方法有哪些?

⑴在用MFC AppWizard创建SDI或MDI应用程序过程的第四步中进行设置; ⑵在CMainFrame类的PreCreateWindow函数中有个表示窗体的引用变量cs,利用它可以修改窗体的风格;

⑶使用ModifyStyle和ModifyStyleEx:它们都是CWnd类的成员函数,可以更改窗口的风格,ModifyStyleEx还可更改窗口的扩展风格。

4.窗口状态的改变方法有哪些?

⑴在应用程序类的InitInstance函数中,用ShowWindow改变窗口的显示状态; ⑵用CWnd类提供的成员函数SetWindowPos、MoveWindow、CenterWindow都可以改变窗口的显示状态;

5.若将主窗口的大小设置为屏幕的1/4大小,并移动到屏幕的右上角,应如何实现? 答:在CMainFrame类的PreCreateWindow函数中添加代码:

cs.cy= ::GetSystemMetrics(SM_CYSCREEN)/2;

cs.cx= ::GetSystemMetrics(SM_CXSCREEN)/2; cs.y=0; cs.x=(cs.cx*2-cs.cx);

6.若将多文档的文档窗口的大小设置为主窗口客户区的1/4大小,并移动到主窗口客户区的右上角,应如何实现?

答:在CMainFrame类的PreCreateWindow函数中添加代码: cs.cy= ::GetSystemMetrics(SM_CYFULLSCREEN)/2; cs.cx= ::GetSystemMetrics(SM_CXFULLSCREEN)/2; cs.y=0; cs.x=(cs.cx*2-cs.cx);

7.对于SDI应用程序来说,能否有多个文档类型?应如何实现?

对于SDI应用程序来说可以有多个文档类型,通过修改文档模板字串资源实现。

8.文档字串资源有哪些含义?如何编辑字串资源?

⑴文档模板字串资源用于标识文档类型、标题等内容的

⑵字串资源的每一项都是以“XXXX\\n”结构组成的,不同的位置有不同的含义,参考课件。

9.若想通过对文档字串资源的更改,使应用程序的“打开”或“保存”对话框中的文件类型显示为“C源文件(*.c,*.cpp)”,则应如何实现? 答:文档模板字串资源的合适位置插入以下字符串: ?? C源文件(*.c,*.cpp)\\n.c;*.cpp\\n ??

10.什么是文档的序列化?其过程是怎样的?

⑴ “序列化”的概念是说对象可以持续的,即当程序退出时它可存盘,而当程序重启动时它们又可恢复。对象的这种存盘和恢复处理过程就称为“序列化Serialize ”。 ⑵利用Serialize函数可以避免直接使用CFile对象,但是在Serialize函数与CFile对象之间,存在一个归档对象(CArchive类)。CArchive对象可以看成CFile对象的数据缓冲区,它具有一个内部标记,用来标识归档是存入(写盘)还是载入(读盘)。每次只能有一个活动的归档对象与磁盘文件相连。应用程序框架会自动创建CFile及CArchive对象,为CFile对象打开相应的磁盘文件,并且将相应的归档对象与文件相连。用户只要在Serialize函数中,将数据存到归档对象中或从归档对象中取出。