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。
这就是我得到的结果。您可以清楚地看到靠近窗口顶部边缘的一条小绿线。我不确定我搞砸了哪一部分。
更新:
感谢所有的帮助。我对 bitblt 参数进行了一些随机调整,得到了不同的结果。
pDC->BitBlt(0, -400, currWin.Width(), currWin.Height(), &shadowMem, 0, 0, SRCCOPY);
当我试图找出问题时,-400 是一个随机数。看来,当我将位图从 shadowMem 复制到 pDC 时,不知何故它与坐标不匹配。
我还没有找到原因,但是如果我将此代码复制到一个新项目中,它工作得很好。我想我可能与我的 pDC 设置的 MM_ANISOTROPIC 模式有关。
解决方案
正如@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);
}
结果:
推荐阅读
- heroku - Can I disable Heroku's slugignore?
- python - Scope of return type hints in Python
- javascript - Converting date and time to JavaScript date format
- python - import another python class file to the main file in jupyter notebook on mac
- java - 在表格下方显示每种产品的总金额
- asp.net-core - Blazor Javascript isolation with NPM dependencies
- java - JpaSpecification using Generics. Works with string, but issues with Date and joined fields
- c++ - How to link libraries properly using CMakeLists.txt for MinGW?
- reactjs - How can i run reactjs locally on mac other than the npx create-react-app?
- database - 在 Mule 4 中,如何使用数据库连接器保存从数据库中检索的数据?