logo资料库

MFC程序设计练习题,实现鼠标左键点击圆变大,右击变小,ctrl+左键可以拖动的功能.docx

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
高级程序设计---课程练习 2018-12-20~2018-12-25 专业: 学号: 姓名: 练习目的: 1. 了解面向对象基础概念(类及对象) 2. 理解 Windows 编程及 MFC 基础编程 B. 私有类型 C. 保护类型 D. 友元类型 B. 便于数据转换 D. 防止不同模块之间数据的非法访问 一.选择题 1.对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制 属性的是( D ) A. 公有类型 2.下列关于多态性的描述,错误的是( C ) A. C++语言的多态性分为编译时的多态性和运行时的多态性 B. 编译时的多态性可通过函数重载实现 C. 运行时的多态性可通过模板和虚函数实现 D. 实现运行时多态性的机制称为动态绑定 3.在 C++语言中,数据封装要解决的问题是( D ) A. 数据的规范化 C. 避免数据丢失 4.使用 private 修饰的成员变量,以下说法正确的是( C ) A. 只能由本类中的函数使用,不能被外面的程序所访问。 B. 可以由本类中的函数使用,也可以被外面的程序所访问。 C. 只能由本类和派生类中的函数使用。 D. 可以在主函数中使用。 5.对类的构造函数和析构函数描述正确的是( A ) A. 构造函数可以重载,析构函数不能重载 B. 构造函数不能重载,析构函数可以重载 C. 构造函数可以重载,析构函数也可以重载 D. 构造函数不能重载,析构函数也不能重载 6.在 VC++语言类体系中,不能被派生类继承的有( B ) A. 转换函数 7.下面关于句柄正确的说法是( A ) A. 句柄是一个标识 Windows 资源和设备等对象的变量。 B. 句柄是用户程序自定义的数据类型。 C. 用户程序使用句柄时不需要定义。 D. 句柄仅仅是一个抽象的概念,程序中不能使用句柄。 8.下面关于动态链接库正确的说法是( B ) A. 动态链接库提供的函数,在编译阶段能够连接到应用程序中。 B. 动态链接库提供的函数,在运行阶段能够连接到应用程序中。 C. 动态链接库本身不能单独设计、编译和调试。 D. 动态链接库的使用使得程序缺乏灵活性。 9.关于函数 UpdateData(),下面哪个说法是正确的( B ) D. 静态成员函数 B. 构造函数 C. 虚函数 1
B. 单击鼠标左键时发送 D. 双击鼠标左键时发送 A. 数据从相关联的成员变量向控件传输 B. 数据从控件向相关联的成员变量复制 C. 实现不同控件之间的数据交换 D. 实现与不同控件相关联变量的数据交换 10.为使工具栏按钮与对应菜单项功能一致,下面哪个说法是正确的( B ) A. 工具栏按钮与对应菜单项的 ID 相同,工具栏按钮必须重写代码。 B. 工具栏按钮与对应菜单项的 ID 相同,工具栏按钮不用重写代码。 C. 工具栏按钮与对应菜单项的 ID 必须不同,工具栏按钮必须重写代码。 D. 工具栏按钮与对应菜单项的标题相同,工具栏按钮不用重写代码。 11.关于消息 WM_CONTEXTMENU 的说法,下面哪个说法是正确的( A ) A. 单击鼠标右键时发送 C. 双击鼠标右键时发送 12.关于消息 BN_CLICKED 的说法,下面哪个说法是正确的( B ) B. 单击鼠标左键时发送 A. 单击鼠标右键时发送 C. 双击鼠标右键时发送 D. 双击鼠标左键时发送 13.关于函数 OnDraw,下面哪个说法是正确的( A ) A. 窗口首次生成时自动调用 B. 窗口生成后调用 C. 窗口消失前调用 D. 窗口消失后调用 14.设有定义 CRect re(10,20,50,60) ,下面哪个说法是正确的?( A ) A. 定义的矩形左上角顶点坐标是(10,20),右下角顶点坐标是(50,60) B. 定义的矩形左下角顶点坐标是(10,20),右上角顶点坐标是(50,60) C. 定义的矩形右上角顶点坐标是(10,20),左下角顶点坐标是(50,60) D. 定义的矩形右下角顶点坐标是(10,20),左上角顶点坐标是(50,60) 15.下列关于虚基类的描述,错误的是( A. 设置虚基类的目的是为了消除二义性 B. 虚基类的构造函数在非虚基类之后调用 C. 若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用 D. 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数 B ) 函数开始执行的。 消息映射 ____。 。 是面向对象思想的主要特征。 二、填空题 1.在面向对象方法中,类之间共享属性和操作的机制称为____继承 2.在面向对象的程序设计中,类描述的是具有相似性质的一组 对象 3.在 C++中封装性、继承性和 多态性 4.MFC 框架程序是从 WinMain 5.消息映射宏 DELCARE_MESSAGE_MAP 的作用是用来声明对 的支持。 6.Windows 提供的图形界面接口 GDI,使得用户能方便实现图形和文本的输出,不必关心 与系统相连的 外部设备特性 7.每个 MFC 应用程序都需要 函数、变量等。 8.每个 Win32 应用程序都需要 定义了 Windows 所有的数据类型、函数调用、数据结构和符号常量等。 9.在 VC++中,菜单、工具栏、对话框、图标等都被视为 资源 10.GDI 提供高层绘图函数,支持与 设备 头文件,该头文件定义了 MFC 的所有类、 头文件,该头文件及其所包含的文件 。 afxwin.h Windows.h 无关的图形显示。 。 2
三、简答题 1. 什么是 Windows API 函数? 答:视窗操作系统应用程序接口(Windows API),有非正式的简称法为 WinAPI,是微 软对于 Windows 操作系统中可用的内核应用程序编程接口的称法。它设计为由 C/C++程序 调用,而且它也是应用软件与 Windows 系统最直接的交互方式。 2.什么是 MFC 的消息映射机制? 答:消息映射机制即指 MFC 类中将消息与消息处理函数联系起来,一一对应的机制。 映射一个消息的过程由三个部分组成: ①在处理消息的类中,使用消息宏 LARE_MESSAGE_MAP() 声明对消息映射的支持,并 在该宏之前声明消息处理函数。 ②使用 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 宏在类声明之后的地方定义该类 支持的消息映入口点,所有消息映射宏都添加在这里,当然不同的消息 MFC 都会有不同 的消息映射宏。 ③定义消息处理函数,在该函数内添加消息处理代码。 3.简述构成文档/视图结构应用程序框架的四个 MFC 派生类,并说出它们的功能。 假如工程名称为 test 则 MFC AppWizard 会自动创建一下四个派生类来构成 应用程序的框架。 .CFrame 类的派生类 CMainFrame; .CWinApp 类的派生类 CtestApp; .CDocument 类的派生类 CtestDoc; .CView 类的派生类 CtestView。 其中,CtestDoc 类对象用来存储和管理应用程序中的数据;CMainFrame 对 象与 CtestView 对象构成了应用程序的界面,CMainFrame 对象只是 CtestView 对象的 容器,而 CtestView 类的对象是用来显示文档与接收用户事件的; CtestApp 类的对象是应用程序的全局对象,它是应用程序中各对象的容器,负 责创建应用程序界面和消息循环。 四、编程题 1. 编写一个单文档应用程序。程序启动后在用户区显示一个方形,当用鼠标左键单击用户 区后,该方形会变为圆形,如果再单击则又变回方形。 步骤:(1)新建一个单文档的 MFC 程序,命名为 test; (2) 在 testview 头文件的 public 中定义一个 bool 变量 key,和一个变量保存坐标。 bool key; CRect saveRec; (3)在构造函数中赋值key;并赋予坐标值saveRec(400,300,600,500); key=false; (4)在绘图 OnDraw 中添加如下代码: CtestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(key) pDC->Ellipse(saveRec); else pDC->Rectangle(saveRec); (5) 添加LButtondown消息函数,并添加如下代码; if(key) key=false; else 3
key=true; InvalidateRect(saveRec); CView::OnLButtonDown(nFlags, point); 【选做】2.编写一个 Windows 应用程序,要求在窗口的用户区绘制一个圆,当单击左键时, 该圆放大;单击右键时,该圆缩小;按下 Ctrl 键的同时移动鼠标,则该圆会随鼠标的移动而 移动。 步骤: (1)建立一个单文档 MFC,并命名为 test2; (2)在视图类定义一个变量 receiveView,用来接收文档类的数据,用于视图类画图; CRect receiveView; (3)同样的在文档类也定义一个变量 receiveDoc 用来保存鼠标的消息数据。 CRect receiveDoc; (4)对于文档类的构造函数初始化。 (5)添加鼠标左键的消息函数; if(pDoc->receiveDoc.left) pDoc->receiveDoc.left-= 5; if(pDoc->receiveDoc.right <=(clientRec.right-clientRec.left)) pDoc->receiveDoc.right += 5; if(pDoc->receiveDoc.top>0) pDoc->receiveDoc.top -= 5; if(pDoc->receiveDoc.bottom <= (clientRec.bottom - clientRec.top)) pDoc->receiveDoc.bottom += 5; Invalidate( true); CView::OnLButtonDown(nFlags, point); (6)同样的添加鼠标右键的消息函数; Ctest2Doc *pDoc = GetDocument(); CRect clientRec; GetClientRect(&clientRec ); if(pDoc->receiveDoc.left + 5 <= pDoc->receiveDoc.right) pDoc->receiveDoc.left += 5; if(pDoc->receiveDoc.right -5 >= pDoc->receiveDoc.left) pDoc->receiveDoc.right -= 5; if(pDoc->receiveDoc.top + 5 <= pDoc->receiveDoc.bottom) pDoc->receiveDoc.top += 5; if(pDoc->receiveDoc.bottom - 5 >= pDoc->receiveDoc.top) pDoc->receiveDoc.bottom -= 5; Invalidate(true ); CView::OnRButtonDown(nFlags, point); (7)添加鼠标移动的消息函数: Ctest2Doc *pDoc = GetDocument(); CRect clientRect; GetClientRect(&clientRect); int r =(pDoc->m_Ell.right-pDoc->m_Ell.left)/2; if( nFlags & MK_CONTROL) { pDoc->receiveDoc.left = point.x-r; pDoc->receiveDoc.top = point.y-r; pDoc->receiveDoc.right = point.x+r; pDoc->receiveDoc.bottom = point.y+r; } InvalidateRect(NULL,TRUE); CView::OnMouseMove(nFlags, point); 4
(8)在视图类的的构造函数OnDraw中添加如下代码: Ctest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); receiveView=pDoc-> receiveDoc; pDC->Ellipse(receiveView); 5
分享到:
收藏