MFC的课后练习包含MFC基础代码编程肯定对你有一定的帮助.docx
《MFC的课后练习包含MFC基础代码编程肯定对你有一定的帮助.docx》由会员分享,可在线阅读,更多相关《MFC的课后练习包含MFC基础代码编程肯定对你有一定的帮助.docx(23页珍藏版)》请在冰豆网上搜索。
MFC的课后练习包含MFC基础代码编程肯定对你有一定的帮助
第一章Windows应用程序基础知识
1-2什么是WindowsAPI函数?
答:
用来开发WindowsSDK应用程序的软件开发工具包是用C语言编写的一个大型函数库,这个库中的函数叫做API函数。
1-5什么是事件?
试举例说明。
答:
能触发程序做出相应反应的因素或动作叫做“事件”。
例如,在键盘上按下了一个键、鼠标的单击或双击、应用程序窗口的显示和销毁等。
1-7什么是消息循环?
答:
在创建了窗口的应用程序中,应用程序将不断地从消息队列中获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列获取消息,这个不断重复的工作过程叫做消息循环。
1-9说明Windows应用程序的主函数、窗口函数与Windows系统之间的关系。
答:
Windows应用程序的主函数和窗口函数都是系统调用的函数,主函数是在应用程序启动时由系统首先调用的函数,而窗口函数是主函数在消息循环中获得消息并把消息派送给系统之后,由系统调用的用来处理消息的函数。
第二章Windows应用程序的类封装
2-1在窗体类CframeWnd中需要封装哪些成员?
答:
在窗体类CframeWnd中要封装窗口句柄、窗口类的定义、注册窗口类、创建窗口、显示更新窗口。
2-3在MFC程序设计中,如果要建立拥有自己风格的主窗口,应该重写什么函数。
答:
继承CWinAPP类并需要重写该类的成员函数InitInstaance。
2-4什么是消息映射表?
答:
在WindowsSDK应用程序的窗口函数中,是采用switch-case分支结构实现消息处理的,这种方式不适合面向对象设计的要求。
因此MFC建立了一套自己的消息映射机制——消息映射表。
从外观来看,这种表有些类似学校中使用的学生名册,学号相当于消息号,学生姓名就相当于消息处理函数名,学号和学生号一一对应(映射)。
而MFC把实现表的代码用宏封装起来了。
第三章MFC应用程序框架
3-3简述构成文档/视图结构应用程序框架的四个MFC派生类,并说出它们的功能。
答:
假如工程名称为MyPrj则MFCAppWizard会自动创建一下四个派生类来构成应用程序的框架。
.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:
BOOLm_bKey;
CRectm_rectRec;
//在视图类的构造函数中对成员变量进行初始化
CRec_CrlView:
:
CRec_CrlView():
m_rectRec(100,100,400,400)
{
//TODO:
addconstructioncodehere
m_bKey=FALSE;
}
//在视图类鼠标左键按下消息中添加如下代码
voidCRec_CrlView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
if(m_bKey)
m_bKey=FALSE;
else
m_bKey=TRUE;
InvalidateRect(m_rectRec);
CView:
:
OnLButtonDown(nFlags,point);
}
//在视图类的OnDraw函数中添加如下代码
voidCRec_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)在视图类声明中定义三个数据成员以描述颜色。
intm_clr1,m_clr2,m_clr3;
(2)在视图类的鼠标按下消息响应函数中用下面代码改变颜色。
voidCColorView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
m_clr1-=10;
InvalidateRect(NULL);
CView:
:
OnLButtonDown(nFlags,point);
}
(3)在视图类的OnDraw函数中定义画刷和绘制圆形。
VoidCColorView:
:
OnDraw(CDC*pDC)
{
intclr=RGB(m_clr1,m_clr2,m_clr3);
CBrushnewBrush(clr);
CBrush*oldBrush=pDC->SelectObject(&newBrush);
pDC->Ellipse(20,20,220,220);
pDC->SelectObject(oldBrush);
}
第五章MFC的通用类
5-6编写一个单文档界面应用程序,该程序可以测试在鼠标左键按下时鼠标光标的位置是否处在某规定的矩形框内,如果不在该矩形内则计算机的扬声器会发出“叮”的声音,反之则会在用户区显示光标的位置。
答:
(1)用MFCAppWizard创建一个名称为MusInRec的单文档应用程序框架。
(2)在视图类的声明中定义一个CRect类的对象来描述矩形,再定义一个POINT结构来存储鼠标在按下时的位置,即在视图类的声明中添加如下代码。
Public:
POINTm_point;
CRectm_rRct;
(3)在视图类的构造函数中初始化数据成员:
CMusInRecView:
:
CMusInRecView():
m_rRct(50,50,250,200)
{
m_point.x=0;m_point.y=0;
}
(4)在视图类的OnDraw函数中写入如下代码。
voidCMusInRecView:
:
OnDraw(CDC*pDC)
{
CmusInRecDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
Chars[20];
wsprintf(s,”X=%dY=%d”,m_point.x,m_point.y);
pDC->TextOut(5,5,s);
}
(5)在视图类的鼠标左键按下消息响应函数OnLButtonDown中写入如下代码。
VoidCmusInRecView:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
if(m_rRct.PtInRect(point))
{
m_point.x=point.x;
m_point.y=point.y;
}
else
{
MessageBeep(0);
}
InvalidateRect(NULL);
CView:
:
OnLButtonDown(nFlags,point);
}
5-7编写一个单文档界面应用程序,该程序在用户区能以在两个矩形的相交矩形为外接矩形画一个椭圆。
答:
(1)用MFCAppWizard创建一个名称为RecRec的单文档应用程序框架。
(2)在视图类的声明中声明两个描述矩形的成员变量:
CRectm_rRec1;
CRectm_rRec2;
(3)在视图类的构造函数初始化数据成员:
CRecRecView:
:
CrecRecView():
m_rRec1(50,50,250,200),m_rRec2(100,120,300,400)
{
}
(4)在视图类的OnDraw函数中写入如下代码。
VoidCRecRecView:
:
OnDraw(CDC*pDC)
{
CRecRecDoc*pDoc=GetDocument();
ASSERT_VALIDA(pDoc);
intx1,y1;
intx2,y2;
if(m_rRec1.leftx1=m_rRec2.left;
else
x1=m_rRec1.left;
if(m_rRec1.topy1=m_rRec2.top;
else
y1=m_rRec1.top;
if(m_rRec1.rightx2=m_rRec1.right;
else
x2=m_rRec2.right;
if(m_rRec1.bottomy2=m_rRec1.bottom;
else
y2=m_rRec2.bottom;
pDC->Ellipse(x1,y1,x2,y2);
}
第六章Windows应用程序界面的设计
6-4使用框架窗口类PreCreateWindow函数用坐标(200,200),(400,400)设计一个应用程序的窗口。
答:
代码为
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CframeWnd:
:
PreCreateWindow(cs))
returrnFALSE;
cs.cx=400;
cs.cy=400;
cs.x=200;
cs.y=200;
cs.style=WS_OVERLAPPED;
returnTRUE;
}
第七章鼠标和键盘
7-9编写一个Windows应用程序,要求在窗口的用户区绘制一个圆,当单击左键时,该圆放大;单击右键时,该圆缩小;按下Ctrl键的同时移动鼠标,则该圆会随鼠标的移动而移动。
答:
(1)创建一个名称为My7_9的SDI程序框架。
(2)在文档类中添加一个数据成员:
CRecttagRect;
(3)在其文档类的构造函数中添加如下初始化代码。
CMy7_9Doc:
:
CMy7_9Doc()
{
tagRect.left=270;tagRect.top=130;
tagRect.right=420;tagRect.bottom=280;
}
(4)在其视图类的鼠标右键按下消息响应函数中写入如下代码。
voidCMy7_9View:
:
OnRButtonDown(UINTnFlags,CPointpoint)
{
CMy7_9Doc*pDoc=GetDocument();
pDoc->tagRect.left+=5;
pDoc->tagRect.top+=5;
pDoc->tagRect.right-=5;
pDoc->tagRect.bottom-=5;
InvalidateRect(NULL,TRUE);
CView:
:
OnRButtonDown(nFlags,point);
}
(5)在视图类的左键按下消息响应函数中写入如下代码。
VoidCMy7_9View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
CMy7_9Doc*pDoc=GetDocument();
pDoc->tagRect.left-=5;
pDoc->tagRect.top-=5;
pDoc->tagRect.right+=5;
pDoc->tagRect.bottom+=5;
InvalidateRect(NULL,TRUE);
CView:
:
OnRButtonDown(nFlags,point);
}
(6)在视图类的鼠标移动消息响应函数写入如下代码。
VoidCMy7_9View:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
CMy7_9Doc*pDoc=GetDocument();
CRectclientRect;
GetClientRect(&clientRect);
intr=(pDoc->tagRect.right-pDoc->tagRect.left)/2;
if(nFlags&MK_CONTROL)
{
pDoc->tagRect.left=point.x-r;
pDoc->tagRect.top=point.y-r;
pDoc->tagRect.right=point.x+r;
pDoc->tagRect.bottom=point.y+r;
}
InvalidateRect(NULL,TRUE);
CView:
:
OnMouseMove(nFlags,point);
}
(7)在视图类的OnDraw函数中编写如下代码。
voidCMy7_9View:
:
OnDraw(CDC*pDC)
{
CMy7_9Doc*pDoc=GetDocumengt();
ASSERT_VALID(pDoc);
pDC->Ellipse(pDoc->tagRect);
}
7-10编写一个Windows应用程序,将应用程序窗口的客户区均分为16个不同的区域,当鼠标光标移动到不同的区域中会出现不同的形状。
答:
(1)创建一个名称为My7_10的单文档应用程序框架。
(2)在视图类声明中定义一个成员变量:
Public:
HCURSOR*m_hCursor;
(3)在视图类的构造函数中编写如下代码。
CMy7_10View:
:
CMy7_10View()
{
Staticchar*szCursor[]={
IDC_ARROW,
IDC_IBEAM,
IDC_WAIT,
IDC_CROSS,
IDC_UPARROW,
IDC_SIZENWSE,
IDC_SIZENESW,
IDC_SIZEWE,
IDC_SIZENS,
IDC_SIZEALL,
IDC_NO,
IDC_APPSTARTING,
IDC_HELP,
IDC_ARROW,
IDC_ARROW,
IDC_ARROW
};
for(inti=0;i<16;i++)
m_hCursor[i]=:
:
LoadCursor(NULL,szCursor[i]);
}
(4)为视图类添加一个成员函数GetCursorRegion,代码如下:
intCMy7_10View:
:
GetCursorRegion(POINT*lpPt)
{
RECTRect;
GetClientRect(&Rect);
intx=(lpPt->x*4)/Rect.right;
if(x>3)x=3;
intx=(lpPt->y*4)/Rect.bottom;
if(y>3)y=3;
return(y*4+x);
}
(5)在视图类的WM_SETCURSOR消息响应函数中编写如下代码。
BOOLCMy7_10View:
:
OnSetCursor(CWnd*pWnd,UINTnHitTest,UINTmessage)
{
if(nHitTest==HTCLIENT)
{
POINTpt;
GetCursorPos(&pt);
ScreenToClient(&pt);
intnCursor=GetCursorRegion(&pt);
:
:
SetCursor(m_hCursor[nCursor]);
return(TRUE);
}
ReturnCView:
:
OnSetCursor(pWnd,nHitTest,message);
}
(6)在视图类的鼠标移动消息响应函数中编写如下代码。
voidCMy7_10View:
:
OnMouseMove(UINTnFlags,CPointpoint)
{
StaticCstringstrCursor[]={
“IDC_ARROW”,“IDC_IBEAM”,“IDC_WAIT”,
“IDC_CROSS”,“IDC_UPARROW”,“IDC_SIZENWSE”,
“IDC_SIZENESW”,“IDC_SIZEWE”,“IDC_SIZENS”,
“IDC_SIZEALL”,“IDC_NO”,“IDC_APPSTARTING”,
“IDC_HELP”,“IDC_ARROW”,“IDC_ARROW”,“IDC_ARROW”
};
intnCursor=GetCursorRegion(&point);
CclientDCClientDC(this);
CstringstrInfo;
strInfo=“Cursor:
”+strCursor[nCursor]++“”;
ClientDC.TextOut(0,0,strInfo,strInfo.GetLength());
CView:
:
OnMouseMove(nFlags,point);
}
(7)编译运行程序。
7-11试编写一个能满足如下要求的Windows应用程序。
(1)在窗口中绘制一个像OICQ中的表情符号那样的小人脸,当用户在窗口用户区中按下鼠标左键时,小人的脸会变为黑色的哭泣的脸;而当释放左键时,小人的脸又变为红色的笑脸。
(2)当在窗口用户区中按下鼠标左键并拖动鼠标将其移出窗口以外时,释放鼠标左键按,小人的脸会又变为红色的笑脸。
答:
(1)首先创建一个名称为My7_11的SDI程序,为其文档类声明中添加一个数据成员:
public:
intcolor;
(2)在其文档类的构造函数中添加如下初始化代码。
CMy7_11Doc:
:
CMy7_11Doc()
{
Color=1;
}
(3)在视图类的WM_LBUTTONDOWN消息响应函数中编写如下代码。
voidCMy7_11View:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
CMy7_11Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
SetCapture();
pDoc->color=2;
InvalidateRect(NULL,TRUE);
CView:
:
OnLButtonDown(nFlags,point);
}
(4)在视图类的WM_LBUTTONUP消息响应函数中编写如下代码。
voidCMy7_11View:
:
OnLButtonUp(UINTnFlags,CPointpoint)
{
CMy7_11Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
ReleaseCapture();
pDoc->color=1;
InvalidateRect(NULL,TRUE);
CView:
:
OnLButtonUp(nFlags,point);
}
(5)编写视图类的OnDraw函数,代码如下。
voidCMy7_11View:
:
OnDraw(CDC*pDC)
{
CMy7_11Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
Cpenpen,*oldpen;
if(pDoc->color==1)
pen.Createpen(PS_SOLID,1,RGB(255,0,0));
else
pen.Createpen(PS_SOLID,1,RGB(0,0,0));
oldpen=pDC->SelectObject(&pen);
pDC->Ellipse(275,170,425,320);
pDC->Arc(290,215,340,240,340,225,290,225);
pDC->Arc(360,215,410,240,410,225,360,225);
if(pDoc->color==1)
pDC->Arc(320,240,380,300,320,270,380,270);
else
pDC->Arc(320,270,380,310,380,290,320,290);
pDC->SelectObject(oldpen);
//TODO:
adddrawcodefornativedatahere
}
(6)编译运行该程序。
7-12编写一个Windows应用程序,在窗口用户区中绘制一个矩形,用键盘上的上下左右光标键可以使该矩形分别向这四个方向移动,当按下Home键时该矩形会从左上角方向增大,当按下End键时该矩形会从右下角方向缩小,当单击鼠标左键时该矩形会恢复到原始尺寸。
答:
(1)首先创建一个名称为My7_12的SDI应用程序框架。
(2)为其文档类中添加一个数据成员:
Public:
CRecttagRect;
(3)文档类的构造函数中添加如下初始化代码。
CMy7_12Doc:
:
CMy7_12Doc()
{
tagRect.left=250;
tagRect.top=150;
tagRect.right=450;
tagRect.bottom=300;
}
(4)在视图类的WM_LBUTTONDOWN消息响应函数中编写如下代码。
VoidCMy7_12View:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
Cmy7_12Doc*pDoc=GetDocument();
CRectclient;
GetClientRect(&client);
Switch(nChar)
{
CaseVK_LEFT:
pDoc->tagRect.left-=5;
pDoc->tagRect.right