代码讨论:
OnDraw()函数的代码: CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap; // 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(pDoc->GetPaperColor()))
return; brush.UnrealizeObject();
pDrawDC->FillRect(client, &brush); if (!pDC->IsPrinting() && m_bGrid)
DrawGrid(pDrawDC); 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);
}
谈谈个人理解:
首先得到裁减区域,然后在该区域内创建位图及Memeory DC,在其中绘制,然后将矩形区域放入图中。
问题:关于dc.OffsetViewportOrg(-rect.left, -rect.top);的意义?
我的理解是只绘制当前clipping rect的左上顶点以右及以下部分!