【问题标题】:How can i get rid of the flickering in my controls我怎样才能摆脱我的控件中的闪烁
【发布时间】: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


【解决方案1】:

不要用Invalidate使整个窗口无效,只需用InvalidateRect使需要更改的部分无效。

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

【讨论】:

  • 我设法通过在 OnPaint() 中手动绘制每个控件来停止闪烁,可以吗?
  • @user1588293 除了它是多余的之外没有什么问题,现在控件在每次失效时被绘制两次。
猜你喜欢
  • 2021-04-17
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多