ScrollView + Double Buffer 双缓冲绘图

该博客介绍了如何在ScrollView中实现双缓冲绘图,通过创建兼容的设备上下文(CDC)和位图,实现了快速刷新的效果。核心代码展示了如何在滚动视图中绘制背景并调用Draw函数进行内容绘制,最后使用BitBlt进行位图复制到屏幕,确保滚动视图的平滑显示。

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

void CPaintWithDoubleBufferView::DoMyDraw(CDC* pDC)

{

	CPaintWithDoubleBufferDoc* pDoc = GetDocument();

	ASSERT_VALID(pDoc);



	CDC dc;

	CDC* pDrawDC = pDC;

	CBitmap bitmap;

	CBitmap* pOldBitmap = 0;



	// only paint the rect that needs repainting

	CRect client;

	pDC->GetClipBox(client);

	CRect rect = client;

	DocToClient(rect);



	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);



	pDoc->Draw(pDrawDC, this);



	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);

	}

}
网上大多双缓冲的实现都是以普通的CView来实现的,无法在滚动视图中工作。查了MSDN,发现有个例子DrawCLI中有了完整的实现,以上是核心部分代码。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值