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工程代碼,見下載連接欄。

轉載請註明出處!

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