MFC双缓冲不会复制位图

时间:2019-02-28 00:03:37

标签: c++ mfc

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。

这就是我得到的结果。您可以清楚地看到在窗口顶部边缘附近画了一条绿线。我不确定我搞砸了哪一部分。

result


更新:

感谢所有帮助。我对bitblt参数进行了一些随机调整,并得到了不同的结果。

pDC->BitBlt(0, -400, currWin.Width(), currWin.Height(), &shadowMem, 0, 0, SRCCOPY);

update

当我试图找出问题时,-400是一个随机数。看来,当我将位图从shadowMem复制到pDC时,不知何故与坐标不正确。

我还找不到原因,但是如果我将此代码复制到一个新项目中,它将完全正常。我认为我可能与pDC设置为MM_ANISOTROPIC模式有关。

1 个答案:

答案 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);
}

结果:

enter image description here