MFC实现对话框上的简单绘图(曲线的绘制)

这里我们介绍在MFC对话框上实现的简单绘图如下图所示:

(GIF不动戳大:))

ezgif-1760387173

我们主要响应MFC对话框的以下3个消息:

WM_LBUTTONDOWN

WM_LBUTTONUP

WM_MOUSEMOVE

先说说基本思路:

当鼠标左键按下的时候,就在WM_MOUSEMOVE消息函数中处理绘图,在鼠标左键抬起后,就停止绘图。所以我们需要一个全局变量来标记当前鼠标的状态,以便在WM_MOUSEMOVE函数中进行是否绘图的判断。

下面看看WM_LBUTTONDOWN的消息处理函数内容:

void CMDDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
draw = true;
lbeg = point;

CDialogEx::OnLButtonDown(nFlags, point);

}
在上面的函数中,我们用draw来标记当前的绘图状态。

lbeg用来标记第一个点的位置(即鼠标按下的点)

接下来处理WM_LBUTTONUP消息:

void CMDDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
draw = false;
lend = point;

CDialogEx::OnLButtonUp(nFlags, point);

}
当鼠标左键抬起的我们就把当前绘图状态,即draw的值设置为false

然后是最重要的,WM_MOUSEMOVE:

void CI::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CPen pen(PS_SOLID, HEAD.bound, RGB(HEAD.RGB[0], HEAD.RGB[1], HEAD.RGB[2]));
dc.SelectObject(&pen);
if (draw == true)
{
dc.MoveTo(lbeg);
dc.LineTo(point);
lbeg = point;
}
CDialogEx::OnMouseMove(nFlags, point);
}

上面的代码中,我们定义了一个CPen变量,这个变量用来设置绘图的画笔的粗细,颜色等等。

当我们判断到绘制状态为true的时候,我们就不断的用MoveTo来将画笔移动到起始点(为了绘制连续的曲线,第一次起始点应该为鼠标左键单击的地方,后面的起始点都为上一次的point值)然后用LineTo函数绘制从起点到终点的直线。

*重要说明**:WM_MOUSEMOVE这个消息不是鼠标一移动就会响应的,它的响应是离散而非连续的。

 

0%