一、开发环境
Visual Studio,MFC,单文档
二、程序功能
1.实现设置画笔属性,选择画笔粗细的功能
2.实现颜色选择功能
3.实现油漆桶填充功能
4.实现画直线和铅笔画功能
5.实现特殊形状绘制(矩形、三角形、圆、椭圆)功能
6.实现局部放大功能
7.实现插入位图功能
8.实现保存所绘制图形的功能
9.实现橡皮擦功能
10.实现添加文本功能
三、功能实现
我们首先创建了单文档的应用程序MFC_PAINT,然后主要在CMFC_PAINTView.cpp和CMFC_PAINTView.h这两个文件里面写主要的实现代码。
绘图类CMFC_PAINTView,继承自CView,在这个类里面定义了需要用到的成员变量和成员函数。
class CMFC_PAINTView : public CView
{
public:
int m_PenSize;
int m_TextID;
COLORREF m_PenColor, m_BrushColor;
CPoint m_PointBegin, m_PointEnd;
CEdit* m_Edit = nullptr;
CPoint m_TextPos = CPoint(0, 0);
CPoint m_MagnifyCenter;
int m_MagnifyWidth;
int m_MagnifyHeight;
//我们主要通过改变枚举变量的具体的值来切换相应的功能。
enum DrawType {
LineSegment, Circle, Rectangle, Ellips, Eraser, Pencil, Magnify, Text, Fill, myLoadImage, Triangle
}m_DrawType;
// Generated message map functions
protected:
//{
{AFX_MSG(CMFC_PAINTView)
//这些是在Menu栏添加相应的事件处理函数自动生成的成员函数,我们通过该
//事件处理函数改变DrawType的值,然后再在三个消息处理函数中用Switch-case
//语句区分相应的功能,为各个功能添加具体的实现代码。
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnDrawLine(); //线段
afx_msg void OnMenueraser(); //橡皮擦
afx_msg void OnMenupencil(); //铅笔
afx_msg void OnMenumagnify(); //放大
afx_msg void OnMenutext(); //添加文字
afx_msg void OnMenucircle(); //圆
afx_msg void OnMenuellips(); //椭圆
afx_msg void OnMenurectangle(); //矩形
afx_msg void OnMenusize(); //画笔大小
afx_msg void OnMenucolor(); //画笔颜色
afx_msg void OnMenufill(); //油漆桶工具
afx_msg void OnMenubrushcolor(); //油漆桶填充颜色
afx_msg void OnFileSave(); //保存图片
afx_msg void OnFileOpen(); //打开位图
//}}AFX_MSG
};
接下来我们分别讲解一下各个功能的具体实现:
1 铅笔
首先是铅笔功能,使用铅笔功能用户可以在画板上任意画画,实现该功能的原理是:用m_PointBegin和m_PointEnd两个成员变量记录鼠标移动时的位置用MoveTo和LineTo函数绘制多条首尾顺序相连的极短直线。
具体代码如下:
case DrawType::Pencil:
{
m_PointBegin = m_PointEnd;
m_PointEnd = point;
dc.MoveTo(m_PointBegin);
dc.LineTo(m_PointEnd);
break