实验二:简易画
相关变量初始化
CMFCApplication3View::CMFCApplication3View() noexcept
{
// TODO: 在此处添加构造代码
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::Line;
m_count = 3;
int i = 0;
// 重写
}
DrawType为枚举变量,用于后面菜单的流程控制
public:
int m_PenSize;
int i;
int m_count;
CPoint P[10];
COLORREF m_PenColor, m_BrushColor;
CPoint m_PointBegin, m_pointEnd;
enum class DrawType
{
Line, Ellipse, Rectangle, Polygon, Freehand , Eraser
}m_DrawType;
// 重写
鼠标点击事件,获取当前位置的坐标,当DrawType不为Polygon时初始化为画多边形准备的点集,为Polygon时则向数组中录入当前点击位置
void CMFCApplication3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_PointBegin = m_pointEnd = point;
if (m_DrawType != DrawType::Polygon) {
for (i = 0; i < 10; i++) {
P[i].x = 0;
P[i].y = 0;
}
i = 0;
}
if (m_DrawType == DrawType::Polygon) {
if (i < 0) {
i = 0;
}
P[i] = point;
if (i < m_count) {
i++;
}
}
CView::OnLButtonDown(nFlags, point);
}
鼠标移动事件,通过DrawType控制
void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
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::Line://画直线
{
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::Ellipse://画椭圆
{
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::Freehand://自由曲线
{
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);
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;
}
default:
break;
}
dc.SelectObject(oldPen);
}
CView::OnMouseMove(nFlags, point);
}
鼠标松开事件,主要解决覆盖点无色和绘制多边形
void CMFCApplication3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CPen newPen, * oldPen;
newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
oldPen = dc.SelectObject(&newPen);
switch (m_DrawType)
{
case DrawType::Line:
{
dc.MoveTo(m_PointBegin);
dc.LineTo(point);
break;
}
case DrawType::Rectangle:
{
dc.SelectStockObject(5);
CRect rectP2(m_PointBegin, point);
dc.Rectangle(rectP2);
break;
}
case DrawType::Ellipse:
{
dc.SelectStockObject(5);
CRect rectP2(m_PointBegin, point);
dc.Ellipse(rectP2);
break;
}
case DrawType::Eraser:
{
COLORREF pColor = dc.GetBkColor();
CPen newPen(PS_SOLID, m_PenSize, pColor);
dc.SelectObject(&newPen);
CRect rectP2(m_PointBegin, point);
dc.Rectangle(rectP2);
break;
}
case DrawType::Polygon:
{
if (i == m_count) {//在点集录入点的个数不够时不执行
dc.SetROP2(R2_NOTXORPEN);
dc.SelectStockObject(5);
dc.Polygon(P, m_count);
for (i = 0; i < m_count; i++)
{
P[i].x = 0;
P[i].y = 0;
}
i = 0;
}
break;
}
default:
break;
}
dc.SelectObject(oldPen);
CView::OnLButtonUp(nFlags, point);
}
相关菜单对应事件,通过改变DrawType来达到目的
void CMFCApplication3View::OnDrawLine()
{
m_DrawType = DrawType::Line;
// TODO: 在此添加命令处理程序代码
}
void CMFCApplication3View::OnDrawRectangle()
{
m_DrawType = DrawType::Rectangle;
// TODO: 在此添加命令处理程序代码
}
void CMFCApplication3View::OnDrawEllipse()
{
m_DrawType = DrawType::Ellipse;
// TODO: 在此添加命令处理程序代码
}
void CMFCApplication3View::OnDrawPol()
{
m_DrawType = DrawType::Polygon;
// TODO: 在此添加命令处理程序代码
CSetPolygon dlg;
if (IDOK == dlg.DoModal()) {
m_count = dlg.m_count;
}
}
void CMFCApplication3View::OnSetSize()
{
// TODO: 在此添加命令处理程序代码
CSetPenSizeDialog dlg;
if (IDOK == dlg.DoModal()) {
m_PenSize = dlg.m_PenSize;
}
}
void CMFCApplication3View::OnSetColor()
{
// TODO: 在此添加命令处理程序代码
CColorDialog dlg;
if (IDOK == dlg.DoModal()) {
m_PenColor = dlg.GetColor();
}
}
void CMFCApplication3View::OnDrawFreehand()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Freehand;
}
void CMFCApplication3View::OnDrawEraser()
{
// TODO: 在此添加命令处理程序代码
m_DrawType = DrawType::Eraser;
}
菜单设计
编辑框数据传入
void CSetPolygon::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, m_Edit2);
CString str;
m_Edit2.GetWindowTextW(str);
m_count = _ttoi(str);
}
void CSetPenSizeDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT2, m_Edit);
CString str;
m_Edit.GetWindowTextW(str);
m_PenSize = _ttoi(str);
}