CScrollView中双缓冲画图

该博客详细介绍了在CScrollView中使用双缓冲进行绘图的方法,包括创建兼容设备上下文,绘制到离屏位图,填充背景,以及如何在需要更新的矩形区域内使用BitBlt进行高效重绘。通过这种方式,可以实现平滑快速的窗口重绘效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 利用MoveTo LineTo在ScrollView的OnDraw中采用双缓冲画图时,拖动滚动条总不刷新,于是找到MSDN的例子,看了一下,修改后可以了。代码如下:

void CDrawTestView::OnDraw(CDC* pDC)
{
 CDrawTestDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //------------------ 
    CDC dc;
 CDC* pDrawDC = pDC;
 CBitmap bitmap;
 CBitmap* pOldBitmap;
 
 // only paint the rect that needs repainting
 CRect client;
 pDC->GetClipBox(client);
 CRect rect = client;

 CClientDC dcLpDp(this);
 OnPrepareDC(&dcLpDp, NULL);
 dcLpDp.LPtoDP(rect);
 rect.NormalizeRect();
 
 if (!pDC->IsPrinting())
 {
  // draw to offscreen bitmap for fast looking repaints
  if (dc.CreateCompatibleDC(pDC))
  {
   if (bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()))
   {
    OnPrepareDC(&dc, NULL);
    pDrawDC = &dc;
    
    // offset origin more because bitmap is just piece of the whole drawing
    dc.OffsetViewportOrg(-rect.left, -rect.top);
    pOldBitmap = dc.SelectObject(&bitmap);
    dc.SetBrushOrg(rect.left % 8, rect.top % 8);
    
    // might as well clip to the same rectangle
    dc.IntersectClipRect(client);
   }
  }
 }
 
 // paint background
 CBrush brush;
 if (!brush.CreateSolidBrush(RGB(255,255,255)))
  return;
 
 brush.UnrealizeObject();
 pDrawDC->FillRect(client, &brush);
  
 pDrawDC->MoveTo(0,0);
 pDrawDC->LineTo(1000,500);
 
 if (pDrawDC != pDC)
 {
  pDC->SetViewportOrg(0, 0);
  pDC->SetWindowOrg(0,0);
  pDC->SetMapMode(MM_TEXT);
  dc.SetViewportOrg(0, 0);
  dc.SetWindowOrg(0,0);
  dc.SetMapMode(MM_TEXT);
  pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
   &dc, 0, 0, SRCCOPY);
  dc.SelectObject(pOldBitmap);
 }
 //-----------------------------------
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值