MFC之双缓存实现鼠标划线
本文实现的是MFC中一个简单的鼠标划线功能,目的是为了实现像电脑中的画图软件中画线一样的效果:鼠标点击后开始划线,随着鼠标的移动,直线也移动变化,最终释放鼠标时完成一条直线的绘制。
为避免绘画中的闪烁,采取了双缓存机制进行绘画。
(一)visual studio2013,创建MFC程序
(二)程序代码
主要是在默认生成的View文件中修改:
1、在MFCTest1View.h头文件中创建变量
private:
CPoint origin;
CPoint end;
BOOL m_bDraw=FALSE;
CDC BufferDC;
CBitmap BufferBitmap;
2、OnDraw()函数
// CMFCTest1View 绘制
void CMFCTest1View::OnDraw(CDC* pDC)
{
CRect rc;
GetClientRect(&rc);
if (BufferDC.GetSafeHdc() == NULL){
BufferDC.CreateCompatibleDC(pDC);
BufferBitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
BufferDC.SelectObject(&BufferBitmap);
BufferDC.FillSolidRect(0, 0, rc.Width(), rc.Height(), RGB(255, 255, 255));
}
pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &BufferDC, 0, 0, SRCCOPY);
// TODO: 在此处为本机数据添加绘制代码
}
3、添加的鼠标响应事件
// CMFCTest1View 消息处理程序
void CMFCTest1View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
BufferDC.SetROP2(R2_NOTXORPEN);
origin= end = point;
m_bDraw =TRUE;
CView::OnLButtonDown(nFlags, point);
}
void CMFCTest1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//BufferDC.MoveTo(origin);
//BufferDC.LineTo(point);
m_bDraw = FALSE;
CView::OnLButtonUp(nFlags, point);
}
void CMFCTest1View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_bDraw == TRUE){
BufferDC.MoveTo(origin);
BufferDC.LineTo(end);
BufferDC.MoveTo(origin);
BufferDC.LineTo(point);
end = point;
Invalidate(FALSE);
}
CView::OnMouseMove(nFlags, point);
}
/第一次写,先简单记录一下,以后再改进了哈~/
(void*Zhou的首博)