MFC 图形绘制编程实验

MFC 图形绘制编程实验
MFC 图形绘制编程实验

MFC 图形绘制编程实验

姓名:

班级:学号:【预备知识】

1、图形设备接口

图形设备接口(Graphics Device Interface, GDI)负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字,是Windows 系统的重要组成部分。

2、设备环境

设备描述表用来定义绘图规则,设备描述表即为设备环境的属性的集合,可以将设备描述表看成图形的“输出模板”。应用程序每一次图形操作均参照设备描述表中的属性执行。获取设备环境是应用程序输出图形的先决条件,常用的两个MFC 类是CPaintDC 和CClientDC。

(1) CPaintDC 类

应用程序响应WM_PAINT 消息进行图形刷新时,主要通CPaintDC 类对象获取设备环境。示例代码:CPaintDC dc(this);

(2) CClientDC

如果绘图工作并非由WM_PAINT 消息驱动,则使用CClientDC 类

的对象获取设备环境。示例代码:CClientDC dc(this);

3、绘图工具与颜色

(1) 画笔编程示例代码

CPaintDC dc(this);

CPen Pen,*pOldPen;

Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));

pOldPen = dc.SelectObject(&Pen);

dc.SelectObject(pOldPen);

(2) 画刷编程示例代码

CPaintDC dc(this);

CBrush Brush,*pOldBrush;

Brush.CreateSolidBrush (RGB(255,0,0));

pOldBrush = dc.SelectObject(&Brush);

dc.SelectObject(pOldBrush);

(3) 颜色

Windows 使用宏RGB 定义绘图的颜色,其形式为: COLORREF RGB(BYTE nRed, BYTE nGreen, BYTE nBlue)

4、常用绘图函数

(1) 设置画笔当前位置的函数

CPoint MoveTo ( int x, int y );

CPoint MoveTo ( POINT point );

(2) 从当前位置向指定坐标点画直线的函数

BOOL LineTo ( int x, int y );

BOOL LineTo ( POINT point );

(3) 从当前位置开始,依次用线段连接lpPoints 中指定的各点BOOL Polyline(LPPOINT lpPoints, int nCount );

示例代码:

CPaintDC dc(this);

CPoint point [3];

point [0] = CPoint(100, 100);

point [1] = CPoint(200, 100);

point [2] = CPoint(200, 200);

dc.Polyline(point, 3);

(4) 绘制矩形,并用当前画刷进行填充

BOOL Rectangle ( int x1, int y1, int x2, int y2 ); BOOL Rectangle ( LPCRECT lpRect );

(5) 绘制椭圆,并用当前画刷填充;

BOOL Ellipse ( int x1, int y1, int x2, int y2 ); BOOL Ellipse ( LPCRECT lpRect );

(6) 绘制多边形,并用当前画刷填充

BOOL Polygon (LPPOINT lpPoints, int nCount );

示例代码:

CPaintDC dc(this);

CPoint point [3];

point [0] = CPoint(100, 100);

point [1] = CPoint(200, 100);

point [2] = CPoint(200, 200);

dc.Polygon(point, 3);

【实验目的】

(1) 熟悉Visual Studio 开发环境;

(2) 掌握MFC 消息映射的操作步骤;

(3) 掌握MFC 图形输出的方法;

(4) 理解设备环境、画笔、画刷的概念,掌握常用的绘图函数。【实验内容】

请编写程序,要求如下:

(1) 定义一支黄色画笔,绘制一条线段;

(1) 定义一支紫色画笔,绘制一条多段线;

(3) 定义一支红色画笔,绘制一个正方形,并用适当的画刷填充图形内部;

(4) 定义一支绿色画笔,绘制一个圆,并用适当的画刷填充图形内部;

(5) 定义一支蓝色画笔,绘制一个正六边形,并用适当的画刷填充图形内部。

【实验报告】

(1) 列出图形绘制程序代码清单;

头文件Demo.h

#include "afxwin.h"

class CDemoWnd :public CFrameWnd

{

public:

CDemoWnd();

~CDemoWnd();

public:

LRESULT OnPaint(WPARAM wParam, LPARAM lParam);

DECLARE_MESSAGE_MAP()

};

class CDemoApp :public CWinApp

{

public:

BOOL InitInstance();

};

CDemoApp theApp;

源文件Demo.cpp

#include "Demo.h"

#include "math.h"

// 构造函数

CDemoWnd::CDemoWnd()

{

}

// 析构函数

CDemoWnd::~CDemoWnd()

{

}

BEGIN_MESSAGE_MAP(CDemoWnd, CFrameWnd)

ON_MESSAGE(WM_PAINT, OnPaint)//WM_PAINT是消息类型,OnPaint是函数END_MESSAGE_MAP()

//创建消息映射

LRESULT CDemoWnd::OnPaint(WPARAM wParam, LPARAM lParam)

{

CPaintDC dc(this);

CPoint point_0[4];

point_0[0] = CPoint(100, 100);

point_0[1] = CPoint(200, 100);

point_0[2] = CPoint(100, 200);

point_0[3] = CPoint(300, 200);

CPoint point_1[4];

point_1[0] = CPoint(600, 300);

point_1[1] = CPoint(700, 300);

point_1[2] = CPoint(700, 400);

point_1[3] = CPoint(600, 400);

CPoint point_2[6];

point_2[0] = CPoint(400, 300);

point_2[1] = CPoint(500, 300);

point_2[2] = CPoint(550, 300 + 50 * sqrt(3.0));

point_2[3] = CPoint(500, 300 + 100 * sqrt(3.0));

point_2[4] = CPoint(400, 300 + 100 * sqrt(3.0));

point_2[5] = CPoint(350, 300 + 50 * sqrt(3.0));

CPen Pen_0, Pen_1, Pen_2, Pen_3, Pen_4, *oldpen;

CBrush Brush_0, Brush_1, Brush_2, *oldbrush;

//1

Pen_0.CreatePen(PS_SOLID, 2, RGB(255, 255, 0));

oldpen = dc.SelectObject(&Pen_0);

dc.MoveTo(20, 20);

dc.LineTo(100, 20);

dc.SelectObject(oldpen);

//2

Pen_1.CreatePen(PS_SOLID, 2, RGB(255, 0, 255));

oldpen = dc.SelectObject(&Pen_1);

dc.SelectObject(&Pen_1);

dc.Polyline(point_0, 4);

dc.SelectObject(oldpen);

//3

Brush_0.CreateSolidBrush(RGB(0, 255, 0));

oldbrush = dc.SelectObject(&Brush_0);

Pen_2.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));

oldpen = dc.SelectObject(&Pen_2);

dc.Polygon(point_1, 4);

dc.SelectObject(oldpen);

dc.SelectObject(oldbrush);

//4

Brush_1.CreateSolidBrush(RGB(0, 0, 255));

oldbrush = dc.SelectObject(&Brush_1);

Pen_3.CreatePen(PS_SOLID, 2, RGB(0, 255, 0));

oldpen = dc.SelectObject(&Pen_3);

dc.Ellipse(600, 100, 700, 200);

dc.SelectObject(oldpen);

dc.SelectObject(oldbrush);

//5

Brush_2.CreateSolidBrush(RGB(255, 0, 0));

oldbrush = dc.SelectObject(&Brush_2);

Pen_4.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));

oldpen = dc.SelectObject(&Pen_4);

dc.Polygon(point_2, 6);

dc.SelectObject(oldpen);

dc.SelectObject(oldbrush);

return 0;}

BOOL CDemoApp::InitInstance()

{

CDemoWnd *pMainWnd = new CDemoWnd();

pMainWnd->Create(NULL, "Demo Mini-MFC");

pMainWnd->ShowWindow(m_nCmdShow);

pMainWnd->UpdateWindow();

m_pMainWnd = pMainWnd;

return TRUE;

}

【实验结果】

(2) 总结在MFC 程序中绘制图形的基本操作步骤;

①获取设备环境:

获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用函数

BeginPaint或 GetDC

a、调用 BeginPaint函数

应用程序响应 WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函

数获取设备环境

PAINTSTRUCT ps;

hdc=BeginPaint(hwnd,&ps); //ps为 PAINTSTRUCT类型结构

由BeginPaint函数获取的设备环境要用 EndPaint函数释放

void EndPaint(HWND hwnd, PAINTSTRUCT &ps)

b、调用 GetDC函数

如果绘图工作并非由 WM_PAINT消息驱动,则调用 GetDC函数获取设备环境。

hdc=GetDC(hwnd);

由 GetDC函数获取的设备环境必须用ReleaseDC函数释放

void ReleaseDC(HWND hwnd);

②选择绘图工具与颜色:

(a)画笔的操作:创建画笔;将画笔选入设备环境;删除画笔。(b)画刷的创建与应用与画笔很相似,操作画刷也包括创建、选入设备环境和删除。

③选择绘图函数进行绘图:

常见的绘图函数有:绘制椭圆弧线的函数;绘制饼图,并用当前画刷进行填充的函数;绘制矩形,并用当前画刷进行填充的函数;绘制椭圆,并用当前画刷填充的函数;绘制多边形,并用当前画刷填充的函数等。

(3) 总结实验的心得体会,实验中遇到的困难以及解决的方法等。

本次实验让我对画笔、画刷的概念有了更加深入的了解,经过实验内容的多个练习,我也对常用的绘图函数有了跟深刻的认知。要正确的完成实验内容,就要熟练的掌握各种绘图函数的类型和格式,这也对我的学习提出了更高的要求。

相关主题
相关文档
最新文档