VS2019MFC进行无预览简单绘图:直线,画笔,画刷,矩形,椭圆

1.MFC常用绘图函数

CreatePen创建画笔;属性:线型、宽度、颜色
CreateSolidBrush创建画刷,填充封闭图形
SetPixel绘制像素点,返回RGB值
SetPixelV绘制像素点,返回0或非0
MoveTo移动当前位置,绘制直线时确定起点
LineTo移动直线段,绘制直线时确定终点
Rectangle绘制矩形
Ellipse绘制椭圆
FillSolidRect填充矩形颜色

  

2.案例:拖动鼠标绘制直线、矩形、椭圆

首先在VS2019创建MFC程序,选择单文档程序,项目样式选MFC Standard,其余默认

项目创建成功,运行会启动空白窗体

在视图View类中声明起点和终点

CPoint p0, p1;

接下来写消息处理函数,用到的消息:

WM_LBUTTONDOWN鼠标左键按下
WM_LBUTTONUP鼠标左键抬起

添加方法:项目->类向导,对视图View类添加这两个消息的处理程序

书写消息处理函数:

处理鼠标左键按下的代码,很简单,无需变动

void CExample1View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	p0 = point;//将鼠标左键按下时光标位置记为起点
	CView::OnLButtonDown(nFlags, point);
}

处理鼠标左键抬起的代码,结合不同的绘图需求而变化

直接绘制线段,无要求

void CExample1View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	p1 = point;//将鼠标左键抬起时光标位置记为终点
	CDC* pDC = GetDC();//申请绘图设备
	pDC->MoveTo(p0);//设置线段起点
	pDC->LineTo(p1);//设置线段终点
	ReleaseDC(pDC);//释放绘图设备
	CView::OnLButtonUp(nFlags, point);
}

对线段效果有要求,使用画笔CPen

void CExample1View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	p1 = point;
	CDC* pDC = GetDC();
	CPen NewPen, * pOldPen;//声明画笔
	NewPen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//创建画笔,属性为线型、线宽、颜色
	pOldPen = pDC->SelectObject(&NewPen);//设备使用画笔
	pDC->MoveTo(p0);
	pDC->LineTo(p1);
	ReleaseDC(pDC);
	NewPen.DeleteObject();//删除画笔
	CView::OnLButtonUp(nFlags, point);
}

不画线段,画矩形,对线段不做要求

void CExample1View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	p1 = point;
	CDC* pDC = GetDC();
	pDC->Rectangle(CRect(p0, p1));//画矩形
	ReleaseDC(pDC);
	CView::OnLButtonUp(nFlags, point);
}

综合版,画椭圆,对线段及填充颜色有要求(填充颜色默认为白色,也就是说绘出的封闭图形重叠部分会被遮盖,后绘出的图形遮盖之前绘出的图形),观察代码,可以发现画笔和画刷是不冲突的,可以同时工作

void CExample1View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	p1 = point;
	CDC* pDC = GetDC();
	CPen NewPen, * pOldPen;
	NewPen.CreatePen(PS_SOLID, 3, RGB(255, 0, 0));
	pOldPen = pDC->SelectObject(&NewPen);
	CBrush NewBrush, * pOldBrush;//声明画刷
	NewBrush.CreateSolidBrush(RGB(0, 128, 0));//创建填充封闭图形的画刷
	pOldBrush = pDC->SelectObject(&NewBrush);//设备使用画刷
	pDC->Ellipse(CRect(p0, p1));//绘制椭圆
	ReleaseDC(pDC);
	NewPen.DeleteObject();
	NewBrush.DeleteObject();//删除画刷
	CView::OnLButtonUp(nFlags, point);
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赴星辰大海

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

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

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

打赏作者

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

抵扣说明:

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

余额充值