VC++三四次实验报告.docx
- 文档编号:10154127
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:18
- 大小:83.59KB
VC++三四次实验报告.docx
《VC++三四次实验报告.docx》由会员分享,可在线阅读,更多相关《VC++三四次实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
VC++三四次实验报告
实验三MFC消息映射编程实验
一、预备知识
1、消息映射
消息映射本质上就是一个数组,MFC使用消息映射建立消息和类的成员函数
的对应关系。
消息映射数组中存储的信息
(1)所处理的消息;
(2)消息应用的控件ID,或者ID范围;
(3)消息所传递的参数;
(4)消息所期望的返回值。
2、消息映射宏
下面介绍常用的两个消息映射宏:
(1)ON_MESSAGE:
处理任意消息
语法规则:
ON_MESSAGE(ID,func)
LRESULTfunc(WPARAMwParam,LPARAMlParam);
举例:
映射鼠标左键按下消息
ON_MESSAGE(WM_LBUTTONDOWN
LRESULTOnLButtonDown(WPARAMwParam,LPARAMlParam);
(2)ON_COMMAND:
处理WM_COMMAND消息
语法规则:
ON_COMMAND(ID,func)
voidfunc();
举例:
映射菜单项命令消息
ON_COMMAND(ID_OPER_TEST,OnOperTest)
voidOnOperTest();
3、消息映射步骤
MFC中手工添加消息映射按照如下步骤进行:
(1)在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射
宏;
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_KEYDOWN,OnKeyDown)
ON_COMMAND(ID_OPER_TEST,OnOperTest)
END_MESSAGE_MAP()
(2)在类声明中声明成员函数;
LRESULTOnPaint(WPARAMwParam,LPARAMlParam);
DECLARE_MESSAGE_MAP()
(3)在类的实现部分实现成员函数。
二、实验目的
(1)熟悉VisualStudio开发环境;
(2)掌握消息映射机制的基本原理和手工添加消息映射的方法;
(3)熟练掌握在VisualStudio开发环境调试程序的方法。
三、实验内容
设计MFC应用程序,手工添加消息映射,实现下面的功能:
(1)按下CTRL键,拖动鼠标绘制矩形;
(2)按下SHIFT键,拖动鼠标绘制椭圆。
四、实验报告
(1)总结手工添加消息映射的基本步骤;
MFC中手工添加消息映射按照如下步骤进行:
在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射
宏;
如:
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_KEYDOWN,OnKeyDown)
ON_COMMAND(ID_OPER_TEST,OnOperTest)
END_MESSAGE_MAP()
)在类声明中声明成员函数;
如:
LRESULTOnPaint(WPARAMwParam,LPARAMlParam);
DECLARE_MESSAGE_MAP()
)在类的实现部分实现成员函数。
如:
LRESULTCDemoWnd:
:
OnPaint(WPARAMwParam,LPARAMlParam)
{
CPaintDCdc(this);
//定义一支黄色画笔,绘制一条线段;
CPenPen,*pOldPen;
Pen.CreatePen(PS_SOLID,2,RGB(255,255,0));
pOldPen=dc.SelectObject(&Pen);
//dc.SelectObject(pOldPen);
//画直线
dc.MoveTo(50,50);
dc.LineTo(180,180);
returnTRUE;
}
(2)列出鼠标绘图功能的实现代码;
Demo.h
#include
classCDemoWnd:
publicCFrameWnd
{
public:
CDemoWnd();
~CDemoWnd();
public:
LRESULTOnLButtonDown(WPARAMwParam,LPARAMlParam);
LRESULTOnMouseMove(WPARAMwParam,LPARAMlParam);
LRESULTOnPaint(WPARAMwParam,LPARAMlParam);
DECLARE_MESSAGE_MAP()
public:
intm_nX0;
intm_nY0;
intm_nX1;
intm_nY1;
};
classCDemoApp:
publicCWinApp
{
public:
BOOLInitInstance();
};
CDemoApptheApp;//全局应用程序对象
Demo.cpp
#include"Demo.h"
//构造函数
CDemoWnd:
:
CDemoWnd()
{
intm_nX0=0;
intm_nY0=0;
intm_nX1=0;
intm_nY1=0;
}
//析构函数
CDemoWnd:
:
~CDemoWnd()
{
}
///////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown)
ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove)
ON_MESSAGE(WM_PAINT,OnPaint)
END_MESSAGE_MAP()
LRESULTCDemoWnd:
:
OnPaint(WPARAMwParam,LPARAMlParam)
{
return0;
}
LRESULTCDemoWnd:
:
OnLButtonDown(WPARAMwParam,LPARAMlParam)
{
m_nX0=LOWORD(lParam);
m_nY0=HIWORD(lParam);
return0;
}
LRESULTCDemoWnd:
:
OnMouseMove(WPARAMwParam,LPARAMlParam)
{
CClientDCdc(this);
//1.擦除原有图形
dc.SelectStockObject(WHITE_PEN);
if(wParam&MK_CONTROL&&wParam&MK_LBUTTON)//CONTROL画矩形
{
dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1);
}
if(wParam&MK_SHIFT&&wParam&MK_LBUTTON)//SHIFT画椭圆
{
dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1);
}
//2.绘制新图形
m_nX1=LOWORD(lParam);
m_nY1=HIWORD(lParam);
dc.SelectStockObject(BLACK_PEN);
if(wParam&MK_CONTROL&&wParam&MK_LBUTTON)//CONTROL画矩形
{
dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1);
}
if(wParam&MK_SHIFT&&wParam&MK_LBUTTON)//SHIFT画椭圆
{
dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1);
}
return0;
}
BOOLCDemoApp:
:
InitInstance()
{
CDemoWnd*pMainWnd=newCDemoWnd();
pMainWnd->Create(0,_T("消息映射实验程序"));
pMainWnd->ShowWindow(m_nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd=pMainWnd;
returnTRUE;
}
运行结果:
(3)总结实验的心得体会,实验中遇到的困难以及解决的方法等。
这次实验室我们接触MFC以来第一个真正意义上编写的程序,真个程序主要训练了在MFC中添加消息映射的方法及基本步奏,同时涉及到MFC图形绘制的方法和鼠标、键盘消息的使用,是一个具有一定复杂程度的程序。
要完成这个程序的编写,要求我们熟悉MFC程序的基本结构及创建方法,掌握消息映射基本定义及创建方法,并能够使用基本的鼠标消息和键盘消息。
实验四MFC图形绘制编程实验
一、预备知识
1、图形设备接口
图形设备接口(GraphicsDeviceInterface,GDI)负责系统与用户或绘图程序之间
的信息交换,并控制在输出设备上显示图形或文字,是Windows系统的重要组成
部分。
2、设备环境
设备描述表用来定义绘图规则,设备描述表即为设备环境的属性的集合,
可以将设备描述表看成图形的“输出模板”。
应用程序每一次图形操作均参照设备描
述表中的属性执行。
获取设备环境是应用程序输出图形的先决条件,常用的两个MFC类是
CPaintDC和CClientDC。
(1)CPaintDC类
应用程序响应WM_PAINT消息进行图形刷新时,主要通过CPaintDC类对象
获取设备环境。
示例代码:
CPaintDCdc(this);
(2)CClientDC
如果绘图工作并非由WM_PAINT消息驱动,则使用CClientDC类的对象获取
设备环境。
示例代码:
CClientDCdc(this);
3、绘图工具与颜色
(1)画笔编程示例代码
CPaintDCdc(this);
CPenPen,*pOldPen;
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
pOldPen=dc.SelectObject(&Pen);
…
dc.SelectObject(pOldPen);
12
(2)画刷编程示例代码
CPaintDCdc(this);
CPenBrush,*pOldBrush;
Brush.CreateSolidBrush(RGB(255,0,0));
pOldBrush=dc.SelectObject(&Brush);
…
dc.SelectObject(pOldBrush);
(3)颜色
Windows使用宏RGB定义绘图的颜色,其形式为:
COLORREFRGB(BYTEnRed,BYTEnGreen,BYTEnBlue)
4、常用绘图函数
(1)设置画笔当前位置的函数
CPointMoveTo(intx,inty);
CPointMoveTo(POINTpoint);
(2)从当前位置向指定坐标点画直线的函数
BOOLLineTo(intx,inty);
BOOLLineTo(POINTpoint);
(3)从当前位置开始,依次用线段连接lpPoints中指定的各点
BOOLPolyline(LPPOINTlpPoints,intnCount);
示例代码:
CPaintDCdc(this);
CPointpoint[3];
point[0]=CPoint(100,100);
point[1]=CPoint(200,100);
point[2]=CPoint(200,200);
dc.Polyline(point,3);
(4)绘制矩形,并用当前画刷进行填充
BOOLRectangle(intx1,inty1,intx2,inty2);
BOOLRectangle(LPCRECTlpRect);
13
(5)绘制椭圆,并用当前画刷填充;
BOOLEllipse(intx1,inty1,intx2,inty2);
BOOLEllipse(LPCRECTlpRect);
(6)绘制多边形,并用当前画刷填充
BOOLPolygon(LPPOINTlpPoints,intnCount);
示例代码:
CPaintDCdc(this);
CPointpoint[3];
point[0]=CPoint(100,100);
point[1]=CPoint(200,100);
point[2]=CPoint(200,200);
dc.Polygon(point,3);
二、实验目的
(1)熟悉VisualStudio开发环境;
(2)掌握MFC消息映射的操作步骤;
(3)掌握MFC图形输出的方法;
(4)理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。
三、实验内容
请编写程序,要求如下:
(1)定义一支黄色画笔,绘制一条线段;
(1)定义一支紫色画笔,绘制一条多段线;
(3)定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;
(4)定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;
(5)定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。
四、实验报告
(1)列出图形绘制程序代码清单;
Demo.h
#include
classCDemoWnd:
publicCFrameWnd
{
public:
CDemoWnd();
~CDemoWnd();
public:
LRESULTOnPaint(WPARAMwParam,LPARAMlParam);
DECLARE_MESSAGE_MAP()
};
classCDemoApp:
publicCWinApp
{
public:
BOOLInitInstance();
};
CDemoApptheApp;
Demo.cpp
#include"Demo.h"
CDemoWnd:
:
CDemoWnd()
{
}
CDemoWnd:
:
~CDemoWnd()
{
}
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_PAINT,OnPaint)
END_MESSAGE_MAP()
LRESULTCDemoWnd:
:
OnPaint(WPARAMwParam,LPARAMlParam)
{
CPaintDCdc(this);
//定义一支黄色画笔,绘制一条线段;
CPenPen,*pOldPen;
Pen.CreatePen(PS_SOLID,2,RGB(255,255,0));
pOldPen=dc.SelectObject(&Pen);
//dc.SelectObject(pOldPen);
//画直线
dc.MoveTo(50,50);
dc.LineTo(180,180);
//定义一支紫色画笔,绘制一条多段线;
CPenPen1,*pOldPen1;
Pen1.CreatePen(PS_SOLID,2,RGB(255,0,255));
pOldPen1=dc.SelectObject(&Pen1);
//画折线
CPointpoint[4];
point[0]=CPoint(150,50);
point[1]=CPoint(200,50);
point[2]=CPoint(200,200);
point[3]=CPoint(300,200);
dc.Polyline(point,4);
//定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;
CPenPen2,*pOldPen2;
Pen2.CreatePen(PS_SOLID,2,RGB(255,0,0));
pOldPen2=dc.SelectObject(&Pen2);
//使用画刷
dc.SelectStockObject(LTGRAY_BRUSH);
//画正方形
dc.Rectangle(400,100,600,300);
//定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;
//画笔
CPenPen3,*pOldPen3;
Pen3.CreatePen(PS_SOLID,2,RGB(0,255,0));
pOldPen3=dc.SelectObject(&Pen3);
//dc.SelectObject(pOldPen3);
//使用画刷
dc.SelectStockObject(GRAY_BRUSH);
//画圆
dc.Ellipse(700,100,900,300);
//定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部
//画笔
CPenPen4,*pOldPen4;
Pen4.CreatePen(PS_SOLID,2,RGB(0,0,255));
pOldPen4=dc.SelectObject(&Pen4);
//画刷
dc.SelectStockObject(BLACK_BRUSH);
//画多边形
CPointpoint1[6];
point1[0]=CPoint(99,300);
point1[1]=CPoint(186,350);
point1[2]=CPoint(186,450);
point1[3]=CPoint(99,500);
point1[4]=CPoint(12,450);
point1[5]=CPoint(12,350);
dc.Polygon(point1,6);
returnTRUE;
}
BOOLCDemoApp:
:
InitInstance()
{
CDemoWnd*pMainWnd=newCDemoWnd();
pMainWnd->Create(0,_T("消息映射实验程序"));
pMainWnd->ShowWindow(m_nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd=pMainWnd;
returnTRUE;
}
(2)总结在MFC程序中绘制图形的基本操作步骤;
利用MFC生成画图应用程序框架具体步骤如下:
)执行VC程序,选择File|New命令,弹出New对话框.单击Projects标签,转到Projects选项卡,选择MFCAppWizard(exe)选项,然后在Projectname文本框中输入Draw文本框是指项目的本地路径。
)由于本程序是实现画线,要在视图中完成,所以首先创建一个基于单文档的应用程序。
(3)总结实验的心得体会,实验中遇到的困难以及解决的方法等。
在课本次实验中,学到很多的知识,积累了不少的经验。
本实验主要是为了实现一个画图程序里的一些功能。
其中为了实现画图程序的各个功能,我首先考虑的是这个程序的外观,在编辑选项里把初始化的菜单选项给删除添加上我们画图需要用的几个选项。
和窗口的前置问题等。
其中画笔的实现和一些细节方面的就在程序里,下面列出一点基本的知识点:
Windows程序设计中窗口过程的作用是什么?
是由谁调用的?
答:
Windows系统中的每个窗口都有一个相应的窗口过程,用于处理发送或投递到该窗口的所有消息的函数,窗口外观和特性的所有方面取决于窗口过程对这些消息的响应。
每个窗口都是某个窗口类的成员,窗口类决定了窗口用来处理它的消息窗口过程。
窗口过程函数DefWindowProc。
什么是MFC,用MFC编程有什么体验?
答:
MFC微软基础类(Microsoft Foundation Classes),是一种Application Framework,随微软Visual C++ 开发工具发布。
该类库提供一组通用的可重用的类库供开发人员使用。
MFC是面向对象程序设计与Application framework的完美结合,他将传统的API进行了分类封装,并且为你创建了程序的一般框架。
MFC是对WindowsAPI的封装,大大简化了我们的工作。
MFC中模态对话框和非模态对话框分别从用户角度和编程角度讲,有什么区
别?
答:
从用户角度模式对话框:
在关闭模式对话框之前,程序不能进行其他工作。
非模式对话框:
模式对话框打开后,程序仍然能够进行其他工作。
从编程角度非模态通过调用CDialog:
:
Create函数来启动对话框,在对话框关闭后,用delete操作符删除对话框对象。
而模态是调用CDialog:
:
DoModal函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 三四 实验 报告