双缓冲绘图

双缓冲绘图

普通绘图

  • 普通绘图:每次绘制直接在目标窗口进行绘制
    而大量的绘制操作是需要时间的,所以会造成不停的闪。

双缓存绘图

  • 双缓冲绘图:先创建一块内存,直接对内存操作
    画完之后在贴到窗口上,只对窗口进行了一次操作,消耗的时间极少,所以更优秀。

  • 步骤: 1. 创建一块内存DC
    2. 创建一块兼容位图(一块指定大小的内存 == 画布)
    3. 内存DC选择兼容位图
    4. 设置内存画刷
    5. 复制信息到窗口DC
    6. 删除内存DC,释放窗口DC


实例代码

//MFC双缓冲绘图

void CCADView::OnDraw(CDC* pDC)
{
    CRect rc;
    GetClientRect(rc);

    //双缓存
    //1, 创建一个内存DC
    CDC memDC;
    memDC.CreateCompatibleDC(pDC);

    //2, 创建兼容位图
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());

    //3,内存DC选择内存画布
    memDC.SelectObject(bitmap);

    //填充背景颜色
    CBrush brush(RGB(255,255,255));
    memDC.FillRect(rc, &brush); 

    //4,设置画刷颜色
    memDC.SelectObject(::GetStockObject(BLACK_BRUSH));


    //绘图代码
    ...

    //5. 复制信息到DC
    pDC->BitBlt(0,0,rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);    
}

//SDK代码

void  OnDraw()
{
    RECT    rc ;
    HDC     hdc, memdc;
    HBITMAP hBitmap, hOldBitmap;

    ::GetClientRect(hwnd, &rc);

    hdc = GetDC( hwnd );

    //1.创建内存DC
    memdc = ::CreateCompatibleDC( hdc );

    //2.创建兼容位图
    hBitmap  = ::CreateCompatibleBitmap( hdc, rc.right, rc.right );

    //3.内存DC选择内存画布
    hOldBitmap = (HBITMAP)::SelectObject( memdc, hBitmap );

    //背景刷成白色
    ::FillRect(hBitmap, &rc, (HBRUSH)::GetStockObject( WHITE_BRUSH ) );



    ::BitBlt(hdc,       //贴到哪个窗口 
            rc.left,    //窗口起始x
            rc.top,     //窗口起始y
            rc.right,   //窗口结束x
            rc.bottom,  //窗口结束y
            memdc,      //内存DC
            0,          //内存画布的起始x
            0,          //内存画布的起始y
            SRCCOPY);


    //删除内存dc
    ::DeleteDC( memdc );

    //释放窗口DC
    ::ReleaseDC( hwnd, hdc );

    //删除对象
    ::DeleteObject( hBitmap );

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值