CScrollView双缓冲绘图

笔者曾经在做一个多文档编辑器的时候需要用到CScrollView,为避免绘图闪烁需要用到双缓冲绘图,但是CScrollView的双缓冲与之前做Dialog程序时使用的双缓冲是有区别的,

因为在拖动滚动条的时候CScrollView的视口原点会发生变化,导致以前的代码不能用了,恰巧MS有个叫DrawCli的sample有关于CScrollView双缓冲的代码,但在使用这个代码使用的时候遇到了很多问题,而且它的离屏位图拷贝区域也与Dialog方式有区别,索性自己写一个简单一点的,核心代码如下:


        CRect rcClient;
	GetClientRect(rcClient);

	CDC drawDC;
	drawDC.CreateCompatibleDC(pDC);
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
	drawDC.SelectObject(bitmap);
	drawDC.FillSolidRect(0, 0, rcClient.Width(), rcClient.Height(), RGB(255, 255, 255));
	CPoint ptViewportOrg = pDC->GetViewportOrg();
	drawDC.OffsetViewportOrg(ptViewportOrg.x, ptViewportOrg.y);

	for (int i = 0; i < 20; i++)
	{
		int nTop = i * 70;
		CRect rcRectangle(0, nTop, 300, nTop + 50);
		drawDC.FillSolidRect(rcRectangle, RGB(0, 200, 0));
	}

	drawDC.SetViewportOrg(0, 0);
	CPoint ptWindowOrg(0, 0);
	pDC->DPtoLP(&ptWindowOrg);
	pDC->BitBlt(ptWindowOrg.x, ptWindowOrg.y, rcClient.Width(), rcClient.Height(), &drawDC, 0, 0, SRCCOPY);

这个测试代码绘制了20个矩形,其他程序使用的时候,只需把drawDC当成普通的视口DC即可,本测试例程附vs2010工程代码,见下载连接栏。

转载请注明出处!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章