笔者曾经在做一个多文档编辑器的时候需要用到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工程代码,见下载连接栏。
转载请注明出处!