【发布时间】:2014-04-07 15:28:32
【问题描述】:
我使用基于 MFC 对话框的程序有一个 activex 资源管理器和 2 个编辑框。 在 OnPaint() 上,我使用 BitBlt 绘制背景图像,如下所示:
CDC mTempDC;
CBitmap mBitmap;
mTempDC.CreateCompatibleDC(&dc);
mBitmap.CreateCompatibleBitmap(&dc, m_BMBackgroundSize.cx, m_BMBackgroundSize.cy);
mTempDC.SelectObject(&mBitmap);
// Background
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(&mTempDC);
dcMemory.SelectObject(&m_BMBackground);
mTempDC.BitBlt(0,0,m_BMBackgroundSize.cx,m_BMBackgroundSize.cy,&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
}
dc.BitBlt(0,0,m_BMBackgroundSize.cx, m_BMBackgroundSize.cy,&mTempDC,0,0,SRCCOPY);
mTempDC.DeleteDC();
在 OnMouseMove() 中,我检查鼠标是否在某个区域,如果是,我调用 Invalidate(1) 并且每次我在该特定区域中移动鼠标时程序都会开始闪烁。 我确实尝试过 OnEraseBkgnd 返回 TRUE,但没有运气。 我发现的唯一解决方法是自己手动重绘编辑框,如下所示:
pCtrl = GetDlgItem(IDC_EDIT1);
pCtrlDC = pCtrl->GetDC();
mTempDC.BitBlt(5, 31, 580, 183, pCtrlDC, 0, 0, SRCCOPY);
我不确定这是否是一种好方法,但它有效,我用谷歌进行了大量的研究和测试 5 个小时,但没有运气:\
【问题讨论】:
-
要消除闪烁,通常必须先绘制内存设备上下文。
-
哦,双缓冲的失传艺术……(不过是一个很好的谷歌术语)。
-
我猜你们都没有读过代码,我正在使用第二个缓冲区将我所有的东西都绘制到它上面,然后我才在 DC 上绘制该缓冲区。
标签: c++ user-interface mfc draw