筆者曾經在做一個多文檔編輯器的時候需要用到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工程代碼,見下載連接欄。
轉載請註明出處!