首页 > 解决方案 > 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。

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

结果


更新:

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

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

更新

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

我还没有找到原因,但是如果我将此代码复制到一个新项目中,它工作得很好。我想我可能与我的 pDC 设置的 MM_ANISOTROPIC 模式有关。

标签: c++mfc

解决方案


正如@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);
}

结果:

在此处输入图像描述


推荐阅读