MFC基于单文档实现绘图功能(线段,矩形,椭圆,圆,铅笔,橡皮),保姆式教程
需要手写的代码都在图片下面,实际内容不多------嘻嘻。
1.打开VS–新建项目–选择mfc应用程序
2.选择单文档,mfc标准,静态库–点击完成
3.设置初始变量(先点击C优快云View,按F12转到声明)
public:
int m_PenSize;
COLORREF m_PenColor, m_BrushColor;
CPoint m_PointBegin, m_PointEnd;
enum class DrawType {
LineSetgment, Circle, Rectangle, Ellips, Pencil, Eraser
4.赋初始值
m_PenSize = 1;
m_PenColor=RGB(0,0,0),
m_BrushColor = RGB(0, 0, 0);
m_PointBegin = CPoint(0, 0);
m_PointEnd = CPoint(0, 0);
m_DrawType = DrawType::LineSetgment;
5.鼠标响应
6.添加程序
m_PointBegin = m_PointEnd = point;
/*CClientDC dc(this);
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
*/
CView::OnLButtonDown(nFlags, point);
7.重复第5步,依次建立其他鼠标响应消息
8.添加OnMouseMove代码
if (nFlags & MK_LBUTTON)
{
CClientDC dc(this);
CPen newPen, *oldPen;
newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
oldPen = dc.SelectObject(&newPen);
switch (m_DrawType)
{
case DrawType::LineSetgment:
{
dc.SetROP2(R2_NOTXORPEN);
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
dc.MoveTo(m_PointBegin);
dc.LineTo(point);
m_PointEnd = point;
break;
}
case DrawType::Rectangle:
{dc.SetROP2(R2_NOTXORPEN);
dc.SelectStockObject(5);
CRect rectP1(m_PointBegin, m_PointEnd);
dc.Rectangle(rectP1);
CRect rectP2(m_PointBegin, point);
dc.Rectangle(rectP2);
m_PointEnd = point;
break;
}
case DrawType::Pencil:
{
m_PointBegin = m_PointEnd;
m_PointEnd = point;
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
break;
}
case DrawType::Eraser:
{
COLORREF pColor = dc.GetBkColor();
CPen newPen(PS_SOLID, m_PenSize, pColor);
dc.SelectObject(&newPen);
m_PointBegin = m_PointEnd;
m_PointEnd = point;
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
break;
}
case DrawType::Ellips:
{dc.SetROP2(R2_NOTXORPEN);
dc.SelectStockObject(5);
CRect rectP1(m_PointBegin, m_PointEnd);
dc.Ellipse(rectP1);
CRect rectP2(m_PointBegin, point);
dc.Ellipse(rectP2);
m_PointEnd = point;
break;
}
case DrawType::Circle:
{
dc.SetROP2(R2_NOTXORPEN);
dc.SelectStockObject(5);
int length_1 = m_PointEnd.y - m_PointBegin.y;
if (m_PointEnd.x<m_PointBegin.x)
{
m_PointEnd.x = m_PointBegin.x - abs(length_1);
}
else
{
m_PointEnd.x = m_PointBegin.x + abs(length_1);
}
CRect rectP1(m_PointBegin, m_PointEnd);
dc.Ellipse(rectP1);
int length_2 = point.y - m_PointBegin.y;
if (point.x<m_PointBegin.x)
{
m_PointEnd.x = m_PointBegin.x - abs(length_2);
}
else
{
m_PointEnd.x = m_PointBegin.x + abs(length_2);
}
m_PointEnd.y = point.y;
CRect rectP2(m_PointBegin, m_PointEnd);
dc.Ellipse(rectP2);
m_PointEnd = point;
break;
}
default:
break;
}
dc.SelectObject(oldPen);
}
9.添加OnLButtonUp程序
CClientDC dc(this);
CPen newPen, *oldPen;
newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
oldPen = dc.SelectObject(&newPen);
switch (m_DrawType)
{
case DrawType::LineSetgment:
{
dc.MoveTo(m_PointBegin);
dc.LineTo(point);
break;
}
case DrawType::Rectangle:
{
dc.SelectStockObject(PS_NULL);
CRect rectP2(m_PointBegin, point);
dc.Rectangle(rectP2);
break;
}
case DrawType::Pencil:
{
m_PointBegin = m_PointEnd;
m_PointEnd = point;
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
break;
}
case DrawType::Ellips:
{
dc.SelectStockObject(PS_NULL);
CRect rectP2(m_PointBegin, point);
dc.Ellipse(rectP2);
break;
}
default:
break;
}
dc.SelectObject(oldPen);
10.点击菜单进行编辑添加
11.事件处理
重复这个过程,将其他的事件处理也添加进去
一定要设置为view类,除了命名不同,其他都相同
线:LineSetgment
矩形:OnDrawRectangle
圆:OnDrawCircle
椭圆:OnDrawEllips
画笔颜色:OnSetColor
画笔粗细:OnSetPenSize
铅笔:OnSetPencil
橡皮:OnSetEraser
12.添加事件处理程序
void C优快云View::OnDrawLineSegment()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::LineSetgment;
}
void C优快云View::OnDrawRectangle()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Rectangle;
}
void C优快云View::OnDrawCircle()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Circle;
}
void C优快云View::OnDrawEllips()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Ellips;
}
void C优快云View::OnSetColor()
{
// TODO: 在此添加命令处理程序代码
CColorDialog dlg;
if (IDOK == dlg.DoModal()) {
m_PenColor = dlg.GetColor();
}
}
void C优快云View::OnSetPenSize()
{
// TODO: 在此添加命令处理程序代码
CSetPenSizeDialog dlg;
if (IDOK == dlg.DoModal())
{
this->m_PenSize = dlg.m_PenSize2;
}
}
void C优快云View::OnSetPencil()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Pencil;
}
void C优快云View::OnSetEraser()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Eraser;
}
13.添加两个头文件
#include"resource.h"
#include"SetPenSizeDialog.h"
14.添加资源
15.右击对话框,点击添加类
再回到这个页面,添加变量
15.添加程序
CString str;
m_Edit.GetWindowTextW(str);
m_PenSize2 = _ttoi(str);
16.完成,运行,OK
需要源代码的可以私聊我