对双缓冲技术的一点理解!

日常笔记 专栏收录该内容
6 篇文章 0 订阅

void CCurve::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
 // TODO: Add your code to draw the specified item
 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

 UINT state = lpDrawItemStruct->itemState;
 
 m_rectCurveBK.CopyRect(&lpDrawItemStruct->rcItem);
 m_rectCurve = m_rectCurveBK;
 m_rectCurve.InflateRect(-30,0,-30,-15);//curve area
 
//pDC->FillRect(&m_rectCurveBK,&m_BkBrush);//直接用此代码清除原来所画的容易,出现闪屏。
 
 CBitmap bitmap;
 bitmap.CreateCompatibleBitmap(pDC, m_rectCurveBK.Width(), m_rectCurveBK.Height());//生成空间的内存位图 
 CDC me;
 me.CreateCompatibleDC(NULL);//生成内存cd 
 me.SelectObject(&bitmap);
 me.SetBkMode(TRANSPARENT);//设置透明字体
 me.SetTextColor(RGB(255,0,0));
     me.FillRect(&m_rectCurveBK,&m_BkBrush);//用内存dc清除原来所画。
 添加绘图函数

    DrawRect(&me); 
    DrawButtonText(&me);//绘制控件文本
    DrawTip(&me);
    DrawCurve(&me);
 
///
 me.SetROP2(R2_WHITE);
 pDC->BitBlt(0, 0, m_rectCurveBK.Width(), m_rectCurveBK.Height(), &me, 0, 0, SRCCOPY);//一次拷贝。

 bitmap.DeleteObject();
 me.DeleteDC();

 ReleaseDC(pDC);   
}

 

 

重绘时可用 InvalidateRect(&m_rectCurveBK);而不是 InvalidateRect(&m_rectCurve);

或则直接调用Invalidate();

 

单独在屏幕上绘制    DrawRect(&me); DrawButtonText(&me); DrawTip(&me); DrawCurve(&me);时,屏幕上可以理解为看见画家整个作画的过程,从打底稿,到上色,所以会出现闪屏。而用了双缓冲技术,则可理解为没有看到作画的过程,直接看到作做好的画,也就是只看到结果,在背后草纸上画好,一次性贴过来。

 

 

另外,需要重载OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
  return false;
 //return CButton::OnEraseBkgnd(pDC);
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值