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);
}