MFC的课后练习——包含MFC基础代码编程,肯定对你有一定的帮助

第一章 Windows应用程序基础知识

1-2 什么是Windows API函数?

答:用来开发Windows SDK应用程序的软件开发工具包是用C语言编写的一个大型函数库,这个库中的函数叫做API函数。 1-5 什么是事件?试举例说明。

答:能触发程序做出相应反应的因素或动作叫做“事件”。例如,在键盘上按下了一个键、鼠标的单击或双击、应用程序窗口的显示和销毁等。 1-7 什么是消息循环?

答:在创建了窗口的应用程序中,应用程序将不断地从消息队列中获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列获取消息,这个不断重复的工作过程叫做消息循环。 1-9 说明Windows应用程序的主函数、窗口函数与Windows系统之间的关系。

答:Windows应用程序的主函数和窗口函数都是系统调用的函数,主函数是在应用程序启动时由系统首先调用的函数,而窗口函数是主函数在消息循环中获得消息并把消息派送给系统之后,由系统调用的用来处理消息的函数。

第二章 Windows应用程序的类封装

2-1 在窗体类CframeWnd中需要封装哪些成员?

答:在窗体类CframeWnd中要封装窗口句柄、窗口类的定义、注册窗口类、创建窗口、显示更新窗口。 2-3 在MFC程序设计中,如果要建立拥有自己风格的主窗口,应该重写什么函数。 答:继承CWinAPP类并需要重写该类的成员函数InitInstaance。 2-4 什么是消息映射表?

答:在Windows SDK应用程序的窗口函数中,是采用switch-case分支结构实现消息处理的,这种方式不适合面向对象设计的要求。因此MFC建立了一套自己的消息映射机制——消息映射表。从外观来看,这种表有些类似学校中使用的学生名册,学号相当于消息号,学生姓名就相当于消息处理函数名,学号和学生号一一对应(映射)。而MFC把实现表的代码用宏封装起来了。

第三章 MFC应用程序框架

3-3 简述构成文档/视图结构应用程序框架的四个MFC派生类,并说出它们的功能。

答:假如工程名称为MyPrj则MFC AppWizard会自动创建一下四个派生类来构成应用程序的框架。 .CFrame类的派生类CMainFrame; .CWinApp类的派生类CMyPrjApp; .CDocument类的派生类CMyPrjDoc; .CView类的派生类CMyPrjView。

其中,CMyPrjDoc类对象用来存储和管理应用程序中的数据;CMainFrame对象与CMyPrjView对象构成了应用程序的界面,CMainFrame对象只是CMyPrjView对象的容器,而CMyPrjView类的对象是用来显示文档与接收用户事件的;CMyPrjApp类的对象是应用程序的全局对象,它是应用程序中各对象的容器,负责创建应用程序界面和消息循环。 3-5 在MFC对程序窗口功能的划分中你受到了什么启发?

答:由于简单的MFC应用程序框架没有把数据的存储部分和与用户的交互部分分开,所以类违背了面向对象程序设计的“单一职责原则”,从而使窗口类笨重杂乱,没有灵活性。而在文档/视图结构中则由于遵循了“单一职责原则”,从而使文档类和视图类既有分工又有合作,代码清晰,程序架构灵活。 3-6 什么叫类信息表?它在对象动态创建中起什么作用?

答:类中存放了类信息的一个CruntimeClass结构类型数据。其中的主要内容为类名称和指向对象构

建函数的指针,建立该表的目的就是为了能在运行期根据类名称调用构建函数来动态创建对象。

第四章 图形

4-6 编写一个单文档应用程序。程序启动后在用户区显示一个方形,当用鼠标左键单击用户区后,该方形会变为圆形,如果再单击则又变回方形。

答:设置一个开关变量m_bKey当其值为FALSE时,在OnDraw函数中使用函数Rectangle绘制方形;而当值为TRUE时使用函数Ellipse绘制圆形。

再定义一个成员变量m_rectRec存储方形和圆形的尺寸。 程序代码如下:

//在视图类声明中定义成员变量 Private:

BOOL m_bKey; CRect m_rectRec;

//在视图类的构造函数中对成员变量进行初始化

CRec_CrlView::CRec_CrlView():m_rectRec(100,100,400,400) {

//TODO:add construction code here m_bKey=FALSE; }

//在视图类鼠标左键按下消息中添加如下代码

void CRec_CrlView::OnLButtonDown(UINT nFlags,CPoint point) {

if(m_bKey) m_bKey=FALSE; else

m_bKey=TRUE;

InvalidateRect(m_rectRec);

CView::OnLButtonDown(nFlags,point); }

//在视图类的OnDraw函数中添加如下代码 void CRec_CrlView::OnDraw(CDC*pDC) {

CRec_CrlDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(m_bKey)

pDC->Ellipse(m_rectRec); else

pDC->Rectangle(m_rectRec); }

4-7 编写一个应用程序,该程序运行后在用户区绘制一个圆形,每单击鼠标左键一次,则圆的颜色会变化一次。 答:

(1)在视图类声明中定义三个数据成员以描述颜色。 int m_clr1,m_clr2,m_clr3;

(2)在视图类的鼠标按下消息响应函数中用下面代码改变颜色。 void CColorView::OnLButtonDown(UINT nFlags,CPoint point) {

m_clr1-=10;

InvalidateRect(NULL);

CView:: OnLButtonDown(nFlags, point); }

(3)在视图类的OnDraw函数中定义画刷和绘制圆形。 Void CColorView:: OnDraw(CDC*pDC) {

int clr=RGB(m_clr1,m_clr2,m_clr3); CBrush newBrush(clr);

CBrush *oldBrush=pDC->SelectObject(&newBrush); pDC->Ellipse(20,20,220,220); pDC->SelectObject(oldBrush); }

第五章 MFC的通用类

5-6 编写一个单文档界面应用程序,该程序可以测试在鼠标左键按下时鼠标光标的位置是否处在某规定的矩形框内,如果不在该矩形内则计算机的扬声器会发出“叮”的声音,反之则会在用户区显示光标的位置。 答:

(1)用MFC AppWizard创建一个名称为MusInRec的单文档应用程序框架。

(2)在视图类的声明中定义一个CRect类的对象来描述矩形,再定义一个POINT结构来存储鼠标在按下时的位置,即在视图类的声明中添加如下代码。 Public:

POINT m_point; CRect m_rRct;

(3)在视图类的构造函数中初始化数据成员:

CMusInRecView::CMusInRecView():m_rRct(50,50,250,200) {

m_point.x=0;m_point.y=0; }

(4)在视图类的OnDraw函数中写入如下代码。 void CMusInRecView::OnDraw(CDC*pDC) {

CmusInRecDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//TODO:add draw code for native data here Char s[20];

wsprintf(s,”X=%d Y=%d”,m_point.x,m_point.y); pDC->TextOut(5,5,s); }

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4