mfc二维绘图

绘制像素点函数

在这里插入图片描述
使用CDC类时需要先调用GetDC函数

在这里插入图片描述

第二种速度比第一种快的多通常使用第二种像素绘图函数
在这里插入图片描述
第一种COLOREF类型函数绘制图形慢的原因
在这里插入图片描述

在这里插入图片描述

绘制像素点测试代码:
	CPoint P0(100, 100);
	CPoint P1(P0.x + 100, P0.y);
	pDC->SetPixel(P0, RGB(255, 0, 0));//设置p0点的颜色
	COLORREF clr = pDC->GetPixel(P0);//获取p0点的颜色
	pDC->SetPixel(P1, clr);//设置p1点的颜色

2.绘制矩形

在这里插入图片描述

1.定义画刷
在这里插入图片描述
2.将定义好的画刷选入设备上下文才能使用
在这里插入图片描述

原题:在这里插入图片描述

绘制矩形并填充代码:

	rect.DeflateRect(100, 50);//上下边界收缩100像素,左右边界收缩50像素
	CRect rect(100, 100, 300, 300);
	CPen NewPen, * OldPen;
	NewPen.CreatePen(0, 3, RGB(0, 255, 0));//创建画刷
	OldPen = pDC->SelectObject(&NewPen);//将画刷选入设备上下文
	CBrush NewBrush, * OldBrush;
	NewBrush.CreateSolidBrush(RGB(0, 0, 255));//创建实体画刷
	OldBrush = pDC->SelectObject(&NewBrush);
	pDC->Rectangle(rect);
	pDC->SelectObject(OldPen);//将画刷和画笔回复原设备上下文
	pDC->SelectObject(OldBrush);

总结:矩形边界由画笔绘制,可以通过设置画笔的属性改变边界的一些属性;
矩形的内部是由画刷绘制,可以通过设置画刷的属性改变矩形内部的一些属性;

3.绘制椭圆函数

在这里插入图片描述

自定义坐标系:
在这里插入图片描述
如果采用如下的这种画法,最终只能画出一个矩形,因为这些图形的内部默认的都是填充白色,所以最外边的矩形会把里边的内容覆盖掉;
在这里插入图片描述
这样就需要选入库对象函数的作用,要使用透明画刷,这样里边的内容自然就能显现出来;
在这里插入图片描述

在这里插入图片描述

例题
在这里插入图片描述

例题代码:

//绘制嵌套的矩形,椭圆和圆
	CRect rect;
	GetClientRect(&rect);
	rect.DeflateRect(100, 100);
	CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(5);//使用库画刷
	int r = rect.Height() / 2;
	CRect rect1(CPoint(-r, -r), CPoint(r, r));
	pDC->Ellipse(rect1);
	pDC->Ellipse(rect);
	pDC->Rectangle(rect);

4.绘制椭圆弧函数

在这里插入图片描述
参数分别为:矩形左上坐标,矩形右下坐标,起点坐标,终点坐标在这里插入图片描述设置图线方向的函数,方向为顺时针

5.绘制扇形函数

在这里插入图片描述
原理同绘制椭圆弧函数相同

6.绘制多边形函数

在这里插入图片描述

在这里插入图片描述

//绘制多边形(菱形),并且中心区域使用阴影填充
	CRect rect;
	GetClientRect(&rect);
	CPen NewPen, * OldPen;
	NewPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
	OldPen = pDC->SelectObject(&NewPen);
	CBrush NewBrush, * OldBrush;
	NewBrush.CreateHatchBrush(HS_BDIAGONAL, 0x00);//创建阴影画刷,并选择一种阴影模式
	OldBrush = pDC->SelectObject(&NewBrush);
	CPoint p[4];//x是横着的,Y是竖着的
	p[3].x = rect.left, p[3].y = rect.top + rect.Height() / 2;//注意这个是需要按照一定顺序的,因为多边形是顺序连线和顺序填充的
	p[2].x = rect.left + rect.Width() / 2, p[2].y = rect.bottom;
	p[1].x = rect.right, p[1].y = rect.top + rect.Height() / 2;
	p[0].x = rect.left + rect.Width() / 2, p[0].y = rect.top;
	pDC->Polygon(p, 4);//绘制多边形函数
	pDC->SelectObject(OldPen);
	pDC->SelectObject(OldBrush);

6.颜色填充矩形函数

在这里插入图片描述

用黑色的背景色填充客户区的颜色;先设置背景色,再获取背景色用于填充客户的颜色
在这里插入图片描述

7.画刷填充矩形函数

填充效果:
在这里插入图片描述
代码实现:

CRect rect;
	GetClientRect(&rect);
	int nWidth = rect.Width() / 12;//将客户区等分成12份;
	BYTE clr[12];//注意:RGB的参数类型是BYTE型的不是int型,由于12个格子,所以对应12中颜色
	clr[0] = 0;
	clr[1] = 4;
	clr[2] = 28;
	clr[3] = 51;
	clr[4] = 77;
	clr[5] = 102;
	clr[6] = 128;
	clr[7] = 152;
	clr[8] = 178;
	clr[9] = 204;
	clr[10] = 228;
	clr[11] = 255;
	CRect machRect[12];//表示12个小矩形
	CBrush Brush[12];//用12种画刷填充
	for (int i = 0; i < 12; i++) {//处理小矩形的坐标
		machRect[i].left = rect.left + i * nWidth;
		machRect[i].top = rect.top;
		machRect[i].right = rect.left + (i+1) * nWidth;
		machRect[i].bottom = rect.bottom;
		Brush[i].CreateSolidBrush(RGB(clr[i], clr[i], clr[i]));///实体画刷填充
		pDC->FillRect(&machRect[i], &Brush[i]);//对12个矩形分别进行填充,两个参数分别对应矩形区域和画刷指针
	}

路径层函数

可以使用路径层函数进行多边形的绘制
在这里插入图片描述
在这里插入图片描述
说一下我对路径层函数的理解:就是可以先划线,然后画好一个封闭图形之后对路径层所覆盖的面积进行填充;

例题:2.1给定4个顶点P0(200,300)、P1(700,500)、P2(1200,300)、P3(700,100),使用直线函数分别绘制三角形P0P1P2、P0P2P3,三角形内部使用GRAY_BRUSH库画刷填充,在设备坐标系中使用路径层函数编程,实现通过绘制两个三角形来绘制一个四边形。
编程实现:

代码:

//路径层填充函数
	CPoint p0(200, 300), p1(700, 500), p2(1200, 300), p3(700, 100);
	CBrush* p0ldBrush = (CBrush*)pDC->SelectStockObject(GRAY_BRUSH);
	
	pDC->BeginPath();//打开路径层
	pDC->MoveTo(p0);
	pDC->LineTo(p1);
	pDC->LineTo(p2);
	pDC->LineTo(p0);
	pDC->EndPath();//关闭路径层
	pDC->FillPath();

	pDC->BeginPath();//打开路径层
	pDC->MoveTo(p0);
	pDC->LineTo(p2);
	pDC->LineTo(p3);
	pDC->LineTo(p0);
	pDC->EndPath();//关闭路径层
	pDC->FillPath();//对路径层进行填充

9.位图

在这里插入图片描述

位图操作函数
在这里插入图片描述
内存设备上下文,是一块代表显示器的内存块,用来准备图像

在这里插入图片描述
函数的作用是将dib转化为btp

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

10.交互式绘图技术

这里仅介绍回显+引力域+橡皮筋技术
10.1回显
在这里插入图片描述

2.引力域
引力域就是你的鼠标在某一个区域的时候即可出发对某一个点的操作

3.橡皮筋技术使得线条的变化看起来效果平滑,使用双缓冲机制实现;

在View类里边定义函数在这里插入图片描述声明变量在这里插入图片描述然后添加消息处理函数onbuttonup,onbuttondown用来改变boDown的状态,
双缓冲代码:

void CMouseDrawLineView::doubleBuffer(CDC* pDC)
{
	CRect rect;
	GetClientRect(&rect);
	CDC memDC;//声明一个设备上下文对象
	memDC.CreateCompatibleDC(pDC);//创建于pDC兼容的内存设备上下文指针
	CBitmap NewBitmap, * OldBitmap;
	NewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
	OldBitmap = memDC.SelectObject(&NewBitmap);
	memDC.FillSolidRect(rect, pDC->GetBkColor());
	DrawObject(&memDC);//绘制三角形函数
	pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(OldBitmap);
	NewBitmap.DeleteObject();
	memDC.DeleteDC();
}

绘制三角形代码:

void CMouseDrawLineView::DrawObject(CDC* pDC)
{
	pDC->SelectStockObject(GRAY_BRUSH);//灰色画刷填充代表顶点引力域
	CPen NewPen, * OldPen;
	NewPen.CreatePen(PS_SOLID,3,RGB(0, 0, 255));
	pDC->SelectObject(&NewPen);
	//的正方形区域
	for (int i = 0; i < 3; i++) {
		CString str;
		str.Format(CString("x=%d,y=%d"), p[i].x, p[i].y);
		pDC->SetTextColor(RGB(255, 0, 0));
		pDC->TextOutW(p[i].x, p[i].y, str);
		pDC->Rectangle(p[i].x - 5, p[i].y - 5, p[i].x + 5, p[i].y + 5);
		if (0 == i) {
			pDC->MoveTo(p[i]);
		}
		else {
			pDC->LineTo(p[i]);
		}
	}
	pDC->LineTo(p[0]);
}

在OnDraw()函数中添加双缓冲机制,在双缓冲机制中实现绘制三角形的函数

	doubleBuffer(pDC);
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黒猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值