如何摆脱控件中的闪烁

How can i get rid of the flickering in my controls

本文关键字:闪烁 控件 何摆脱      更新时间:2023-10-16

Im使用基于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 个小时,但没有运气:\

与其用 Invalidate 使整个窗口无效,只需使需要随InvalidateRect更改的部分无效即可。

发生闪烁是因为在绘制背景时正在擦除和重绘编辑控件。如果它们位于无效矩形之外,则不会发生这种情况。