BOOL CPaintView::OnEraseBkgnd(CDC* /*pDC*/)
{
//return CPaintView::OnEraseBkgnd(pDC);
return true;
}
void CPaintView::OnDraw(CDC* pDC)
{
CDC shadowMem;
CBitmap shadowBit, *pOldBmp;
CRect currWin;
GetClientRect(currWin);
shadowMem.CreateCompatibleDC(pDC);
shadowBit.CreateCompatibleBitmap(pDC,currWin.Width(), currWin.Height());
pOldBmp = (CBitmap*)shadowMem.SelectObject(&shadowBit);
shadowMem.FillSolidRect(0, 0, currWin.Width(), currWin.Height(), RGB(0, 255, 0));
shadowMem.Rectangle(330, 300, 400, 500);
pDC->BitBlt(0, 0, currWin.Width(), currWin.Height(), &shadowMem, 0, 0, SRCCOPY);
shadowMem.SelectObject(pOldBmp);
}
代码非常简单直观。我创建了一个新的CDC和一个位图,将它们设置为与当前CDC兼容。向新的CDC添加了新的位图。然后,它将内存CDC填充为绿色,并在其上绘制一个矩形。然后将内存CDC的位图复制到当前CDC。
这就是我得到的结果。您可以清楚地看到在窗口顶部边缘附近画了一条绿线。我不确定我搞砸了哪一部分。
更新:
感谢所有帮助。我对bitblt参数进行了一些随机调整,并得到了不同的结果。
pDC->BitBlt(0, -400, currWin.Width(), currWin.Height(), &shadowMem, 0, 0, SRCCOPY);
当我试图找出问题时,-400是一个随机数。看来,当我将位图从shadowMem复制到pDC时,不知何故与坐标不正确。
我还找不到原因,但是如果我将此代码复制到一个新项目中,它将完全正常。我认为我可能与pDC设置为MM_ANISOTROPIC模式有关。
答案 0 :(得分:0)
正如@RemyLebeau在评论中建议的那样,您的Rectangle
通话可能未达到您的期望或期望。
如果选择钢笔和画笔,然后绘制一个(或多或少)大小完全在客户区域内的矩形,我们可以很容易地看到结果。例如:
void CdoublebufferingView::OnDraw(CDC* pDC)
{
CDC shadowMem;
CBitmap shadowBit, * pOldBmp;
CRect currWin;
GetClientRect(currWin);
shadowMem.CreateCompatibleDC(pDC);
shadowBit.CreateCompatibleBitmap(pDC, currWin.Width(), currWin.Height());
pOldBmp = (CBitmap*)shadowMem.SelectObject(&shadowBit);
shadowMem.FillSolidRect(0, 0, currWin.Width(), currWin.Height(), RGB(0, 255, 0));
shadowMem.SelectObject(GetStockObject(DKGRAY_BRUSH));
shadowMem.SelectObject(GetStockObject(WHITE_PEN));
shadowMem.Rectangle(50, 50, currWin.Width() - 100, currWin.Height() - 100);
pDC->BitBlt(0, 0, currWin.Width(), currWin.Height(), &shadowMem, 0, 0, SRCCOPY);
shadowMem.SelectObject(pOldBmp);
}
结果: