MFC单文档项目动态绘制十字线
因为最近的一个项目涉及到了这方面的内容,所以基于自己已学的知识,在网上搜索了许多相关的资料,这些资料各有可取之处,但相对来说比较杂散,不够凝练。在经过一番整理及代码实践后,我将我对于该设计的过程编写成了这篇文档。
功能说明
实现在客户区以鼠标位置为中心绘制十字线。
点击鼠标左键开始绘制,移动鼠标则动态的根据鼠标位置进行绘制,坐标标准为客户区坐标,非屏幕坐标;再次点击鼠标左键停止绘制。
主要是运用了CDC类的SetROP2函数,该函数中的R2_NOT参数可以指定绘制屏幕像素的反色,这样在绘制时就不会将原有的图像擦除,同时,擦除上一次绘制的十字线也是用反色操作实现的。
主要代码说明
1、参考文档中对于SetROP2函数的说明
2、对文档类添加成员变量和成员函数
3、在构造函数中对点击标志位初始化
4、在绘制函数中绘制一个黄色矩形以测试绘制的十字线是否会擦除原有图形
5、创建单文档项目的步骤
5.1、选择MFC项目,并选择自定义的保存路径
5.2、选择单文档项目,并选择MFC标准样式
接下来的创建步骤可以直接一直点下一步,或者根据需要选择相关扩展功能。
主要代码段
void CROPDraw1View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
m_PointOld = m_PointNow; //记录上一次鼠标的坐标,这个坐标对每一次鼠标按下事件来说就是按下时的坐标,对每一次鼠标移动事件来说就是上一次移动时的坐标
m_PointNow = point; //记录当前鼠标坐标
//主要绘制代码
if (m_ClickFlag)//如果鼠标左键点击事件发生,对点击事件的说明:点击一次画十字标记,再次点击删除
{
dc.SetROP2(R2_NOT);//选择反色绘制模式
dc.MoveTo(m_PointOld.x, m_CClientRect.top);
dc.LineTo(m_PointOld.x, m_CClientRect.bottom);
dc.MoveTo(m_CClientRect.left, m_PointOld.y);
dc.LineTo(m_CClientRect.right, m_PointOld.y);
dc.SetROP2(R2_NOT);
dc.MoveTo(m_PointNow.x, m_CClientRect.top);
dc.LineTo(m_PointNow.x, m_CClientRect.bottom);
dc.MoveTo(m_CClientRect.left, m_PointNow.y);
dc.LineTo(m_CClientRect.right, m_PointNow.y);
}
CView::OnMouseMove(nFlags, point);
}
void CROPDraw1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
GetClientRect(&m_CClientRect);//记录客户区矩形
m_PointNow = point;
m_PointOld = point;
dc.SetROP2(R2_NOT);
dc.MoveTo(point.x, m_CClientRect.top);
dc.LineTo(point.x, m_CClientRect.bottom);
dc.MoveTo(m_CClientRect.left, point.y);
dc.LineTo(m_CClientRect.right, point.y);
if (m_ClickFlag) m_ClickFlag = false; //加入该判断避免重复执行反色操作
else m_ClickFlag = true;
CView::OnLButtonDown(nFlags, point);
}
注意
*添加鼠标点击消息的事件响应函数是通过文档类的属性窗口添加的
选择类视图,在文档类处右击鼠标,弹出属性窗口,或者直接左键点击文档类,在右边会弹出属性窗口,选中消息图标,往下翻找到对应消息。
总结
虽然我尽量将自己的意思表达清除,但是也还是可能出现一些漏掉的地方,如果需要解答可私聊我,短期内应该能得到答复。
我不是学软件出身的,对于一些概念可能理解的不是很到位,如果有专业人士发现文档中出现的错误,欢迎在评论区指正,不尽感激。
后续可能还会出更多的关于MFC或是之前出过的迪文屏使用案例,欢迎交流学习。