dlg.SetActivePage(3);
6. 基本控件有哪些?举例说明基本控件的方法?
答: Button、 StaticText、EditBox、ScrollBar、ComboBox、ListBox和CheckListBox等
例如按钮控件使用方法。
(1)新建一个基于对话框的应用程序项目,命名为“Button”。
(2)删除对话框上自带的“确定”和“取消”以及静态文本框。 (3)添加一个按钮和编辑框控件。
在右边工具栏上单击Button按钮拖动到对话框,修改Button的Captio为叮咚按钮。单击Edit Control按钮,拖动到对话框。
(4)给按钮添加消息处理函数,方法是双击“叮咚按钮”在OnBnClickedButton1()函数中添加如下代码:
void CButtonDlg::OnBnClickedButton1() {
SetDlgItemText(IDC_EDIT1, _T(\按钮功能实现了\
}
调试运行程序。单击“叮咚按钮”,结果如图所示。
7. 设计一个对话框应用程序。要求:能选择字体(宋体、黑体、楷体)、字型(粗体、斜体、下划线)、字号(1-64,带旋转按纽)并在“示例”组框中显示示例文字“基于对话框的应用”。
答:创建对话框程序,添加按钮,建立消息映射,添加代码,使用字体对话框CFontDialog。 8. 编写一个对话框应用程序,程序运行时,通过编辑框输如被减数与减数的值,单击“计算”按钮,将像是这两个数的差。
答:创建对话框程序,添加三个编辑框和一个计算按钮,为编辑框添加关联的double类型的变量,在按钮中进行计算,注意需要使用UpdateData函数进行更新。
9. 设计一个“用户登录对话框”,要求用户输入帐号和用户密码,单击“确定”按钮,
可以实现用户登录功能。 答:创建对话框程序,添加一个对话框,在InitInstance中添加代码进行验证,不正确则退出,正确则继续。
10. 要求通过滑动水平滚动条和垂直滚动条,同时有对应进度条显示滑动范围。
答:创建对话框程序,添加一个水平、一个垂直滚动条和一个进度条,为其添加关联变量。再添加一个按钮,添加消息映射函数,添加相关代码。
第五章习题 参考答案
1. 常见的菜单类型有哪几种?
答:常见的菜单可以分为三类:主菜单、弹出菜单和快捷菜单。
主菜单是指出现在应用程序主窗口或最上层窗口的菜单。主菜单由菜单名和菜单项构成。菜单名指出一组菜单项命令的主要功能和目标。常见的菜单名有:文件、编辑、帮助等。通常,每个主菜单都对应有一个弹出菜单作为它的子菜单,而一个菜单项或对应一个确定的
功能,或对应一个弹出菜单。
弹出菜单是指选择主菜单或一个菜单项时弹出的子菜单。用户可以定义多重嵌套的弹出式菜单,菜单项右边的三角符号表示有子菜单存在。可以通过放置分隔线在逻辑或功能上对菜单项进行分组。
快捷菜单是显示于窗体之上的浮动式菜单,快捷菜单的显示是由单击鼠标右键触发的,所弹出的具体菜单依赖于被选中的对象,以及光标或鼠标在工作区域内所指的位置,由此,快捷菜单又称为上下文菜单。
2. 简述菜单设计的主要步骤有哪些? 答:1.用菜单编辑器编辑菜单资源
2.将菜单资源链接到对话框(对于对话框的菜单) 3.添加消息响应函数 4.编写消息响应函数
3. 简述快捷菜单创建的基本步骤有哪些? 答:1. 添加菜单资源
2.建立消息映射,编辑响应函数
3.在CMainFrame类中加入WM_CONTEXTMENU消息的处理函数
4.编辑WM_CONTEXTMENU消息处理函数 4. 简述工具栏创建的基本步骤有哪些?
答:1.用编辑器编辑工具栏资源;2.若工具栏资源没有对应的菜单资源,或者没有给对应的菜单资源添加消息响应函数则进行3和4,否则编辑完成; 3.添加消息响应函数; 4.编写消息响应函数
5. 编写一个单文档应用程序MyDraw,为程序添加一个“颜色”主菜单,当运行程序时,
用户单击“颜色”菜单时,弹出系统自定义的颜色对话框。 答:略
6. 为应用程序MyDraw新增一个“线宽”主菜单,且“线宽”主菜单下包含“1”“2”
两个菜单项,在状态栏的最右侧,增加一个窗格,当运行程序时,用户选择了“线宽”下的“1”菜单项后,在窗格中显示“线宽1”,当用户选择了“2”是在窗格中显示“线宽2”。 答:略
7. 为应用程序MyDraw新增菜单项控制功能,当“线宽”下的“1”或“2”被选中时,在“1”或“2”前添加复选标记。 答:略
8. 为应用程序MyDraw中增加的菜单添加工具栏按钮,并为“线宽”菜单添加快捷菜单。 答:略
9. 新建一个基于对话框的应用程序,为其添加在单文档应用程序中添加的两个主菜单。 答:略
第六章习题 参考答案
1. 什么是DC?什么是CDC类?
答:DC:Windows使用抽象设备的管理方法,一个图形输出设备可以是显示器或打印机等物理设备。Windows用一个称为设备环境(Device Context,DC)的虚拟逻辑设备来描述这些输出设备。CDC:包括在MFC类库中的所有设备环境类的基类,对GDI的所有绘图函数进
行了封装。
2. 什么是OnDraw函数?
答:OnDraw函数是视图类的成员函数,是关于WM_PAINT消息的映射函数,当视图窗口的显示状态发生变化,窗口会收到WM_PAINT消息,OnDraw函数中的代码即被自动调用执行。若图形绘制的代码写在OnDraw函数内,则图形应该始终出现在窗口上。
OnDraw函数不能在程序中调用,若需要调用,可以通过调用函数Invalidate函数,实现对OnDraw的间接调用。Invalidate函数是窗口类的一个成员函数,功能是刷新窗口,向窗口发送WM_PAINT消息,因此会执行到OnDraw函数。 3. 如何创建CDC对象 答:CClientDC dc(this);
4. CDC中关于图形输出的函数有哪些?
答:CDC类中实现基本几何图形输出的一些常用函数有:
? 绘制椭圆
BOOL Ellipse( int x1, int y1, int x2, int y2 );
BOOL Ellipse( LPCRECT lpRect ); // lpRect和x1,y1,x2,y2意义一致
绘制一个椭圆,其中参数x1,y1是椭圆外接矩形的顶点坐标,x2,y2是椭圆外接矩形的另一个顶点坐标。即二个点确定一个矩形,矩形尺寸确定了椭圆的范围,如图6-5-a所示。
? 绘制矩形
BOOL Rectangle( int x1, int y1, int x2, int y2 );
BOOL Rectangle( LPCRECT lpRect ); // lpRect和x1,y1,x2,y2意义一致
绘制一个矩形,其中参数x1,y1,x2,y2是矩形的顶点坐标。即二个点确定一个矩形,如图6-5-b所示。
? 绘制线段
CPoint MoveTo( int x, int y );
CPoint MoveTo( POINT point ); //point和x,y意义一致 BOOL LineTo( int x, int y );
BOOL LineTo( POINT point ); //point和x,y意义一致
绘制一个线段需要调用二个函数,MoveTo()功能是将笔移到(x1,y1)位置;LineTo()是绘制线条到(x2,y2)位置,如图6-5-c所示。
? 绘制圆弧
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); //参数目的一致
此函数的功能为绘制一个圆弧。圆弧是圆周的一部分,所以需要的参数是4个点的坐标,前二个点x1,y1和x2,y2确定了圆所在的位置,后个点x3,y3和x4,y4则指明了在这儿点之间截取圆弧。参见图6-5-d所示。
? 绘制扇形
BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); //参数目的一致 此函数的功能为绘制一个扇形。参数的意义与Arc相同。 ?
绘制一段弦
BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); //参数目的一致 此函数的功能为绘制一个弦。参数的意义与Arc相同。 ? 绘制多边形
BOOL PolyPolygon( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount );
此函数是根据二个以上的顶点,绘制一个多边形,其中point[]是POINT类型的数组,可以存储一系列点的坐标,参数n是顶点的个数。 5. 如何使用画笔类CPen?
答:画笔对象保存了绘制图形时线条的类型、宽度和颜色参数,CDC对象通过选择画笔对象,使用某个画笔。
(1)使用库存画笔
库存画笔是MFC预设好参数的画笔对象,不需要定义和设置,可以直接使用。CDC类中选用库存画笔的成员函数为:
virtual CGdiObject* SelectStockObject( int nIndex ); 其中nMode是库存画笔的类型,可用取值如下: BLACK_PEN:黑笔 WHITE_PEN:白笔 NULL_PEN:空笔
例如,在OnDraw函数中执行: pDC->SelectStockObject(BLACK_PEN);
pDC->Ellipse(10,10,100,100);
以上二行实现的是,pDC选用了一个黑色的画笔。
库存画笔的样式很少,远不能满足应用,因此多数情况下需要自定义画笔对象。
(2)使用自定义对象
画笔类是CPen类,定义画笔对象,设置参数,然后应用于DC对象。 ?
创建画笔
CPen( );
CPen( int nPenStyle, int nWidth, COLORREF crColor );
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 可以使用第二个函数直接创建一种画笔,也可以先使用第一个函数先创建画笔对象,在设置画笔样式。笔模式有若干种,所表示的是线条的形状,其可用值均由系统定义好,用符号常量来表示,编程时选择所需要的一种。
nPenStyle具体包括:PS_SOLID实线;PS_DASH虚线; nWidth表示宽度;
crColor表示笔颜色,一个COLORREF类型的数值,可以用RGB方式进行合成表示。 与CreatePen函数相对应的函数为DeleteObject,此函数清除前次所做的画笔参数设置,以便设置新的参数。
? 应用画笔
使用CDC类中的SelectObject函数即可将创建的新画笔选入DC中,例如,在OnDraw函数中执行如下代码:
CPen pen ;
pen.CreatePen(PS_SOLID,4,RGB(255,0,0)); pDC->SelectObject(&pen);
pDC->Ellipse(10,10,100,100); //pDC选了一个红色、宽度为4、实线笔画园 6. 如何使用画刷类CBrush?
答:画刷是在画封闭图形时用来填充的颜色,例如画圆形或方形时系统会用当前的刷子对内部进行填充。
(1)使用库存的画刷
和画笔类似,可以使用SelectStockObject (nMode)函数选择库存画刷。nMode的值可以有:BLACK_BRUSH、WHITE_ BRUSH、GRAY_ BRUSH和NULL_ BRUSH等
(2)使用自定义画刷
? 创建画刷涉及的函数有:
CBrush( );
CBrush( COLORREF crColor );
CBrush( int nIndex, COLORREF crColor ); CBrush( CBitmap* pBitmap );
BOOL CreateSolidBrush( COLORREF crColor );
BOOL CreateHatchBrush( int nIndex, COLORREF crColor );
函数中的参数意义:crColor为画刷颜色。nIndex代表网格画刷中的网格类型,包括HS_BDIAGONAL、HS_CROSS、HS_DIAGCROSS、HS_FDIAGONAL、HS_HORIZONTAL和HS_VERTICAL。pBitmap代表创建位图画刷的位图对象。
与CreateSolidBrush及CreateHatchBrush函数相对应的函数为DeleteObject,此函数清除前次所做的画刷参数设置,以便设置新的参数。 ? 应用画刷:
使用CDC类中的SelectObject函数将创建的画刷选入DC中。例如,在OnDraw函数中执行如下代码:
CBrush bsh ;
bsh.CreateHatchBrush (HS_CROSS,RGB(255,0,0)); pDC->SelectObject(&bsh);
pDC->Ellipse(10,10,100,100);
以上代码pDC选用了一个红色的、十字网格的刷子画椭圆。 7. 编程实现在视图上输出各种基本的图形。 答:参考实验六
8. 编程实现在视图上绘制红、黄、蓝组成的三色交通灯。 答:参考第一章交通灯实例
9. 编程实现,绘制一个由浅红色到深红色的渐变矩形。 答:参考例题6-7
10. 编程实现,尺寸由小到大逐渐变化的文字动画显示。 答:略
第7章 文档与视图
1. 在应用程序中,文档有什么作用?如何声明一个文档类?
答:在文档视图结构里,文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元;另外它还提供了管理和维护数据的手段。文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但它不必是一个磁盘文件,文档的数据源也可以来自串行口、网络或摄像机输入信号等。文档对象负责来自所有数据源的数据的管理。
MFC提供了一个文档模板类CDocTemplate支持文档模板。文档模板类是一个抽象的基类,它定义了文档模板的基本处理函数接口。由于它是一个抽象基类,因此不能直接用它来定义对象而必需用它的派生类。对一个单文档界面程序,使用CSingleDocTemplate(单文档模板类),而对于一个多文档界面程序,使用CMultipleDocTemplate。如: