您的位置:首页 > 其它

MFC双缓冲绘图

2016-03-03 00:43 239 查看

前言

双缓冲绘图是为了避免GDI绘图时,产生的UI闪烁.
双缓冲绘图是先在兼容DC上画好,再贴图到物理DC, 看起来就不闪了.
就像翻书,如果要翻倒100页,快速翻时,看的眼睛都花了.
如果先将第一页的照片放到用户眼前,等翻倒100页之后,再照一张第100页的照片放到用户眼前.
用户就会无闪烁的看到想要的第100页内容.

demo

void CCadByMfcView::OnDraw(CDC* pDC)
{
    CRect rt;
	CCadByMfcDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

    /// 双缓冲绘图(可以避免闪烁和WM_MOUSEMOVE绘图需求引起的残影)

    /// 建立兼容DC
    CDC memdc;
    memdc.CreateCompatibleDC(pDC);

    /// 建立兼容位图
    CBitmap bitmap;
    GetClientRect(&rt);
    bitmap.CreateCompatibleBitmap(pDC, rt.Width(), rt.Height());

    /// 将兼容位图选进兼容DC
    memdc.SelectObject(&bitmap);

    /// 设置兼容DC的背景, 默认背景是黑色的
    CBrush brush(RGB(255, 255, 255)); ///< 白刷子
    memdc.FillRect(&rt, &brush);
	
    /// 在兼容DC上绘图
    /// 画固定数据
    DrawDataList(&memdc);
    /// 画活动数据
    if (NULL != GetShapeCur()) {
        GetShapeCur()->OnDraw(this, &memdc);
    }

    /// 将兼容DC拷贝进物理DC
    pDC->BitBlt(0, 0, rt.Width(), rt.Height(), &memdc, 0, 0, SRCCOPY);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: