MFC之双缓存实现鼠标划线

来源:互联网 发布:linux tftp服务器 cps 编辑:程序博客网 时间:2024/05/29 13:20

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的首博)

1 0