防止CScrollView和CToolBar的屏幕闪烁

时间:2010-08-16 06:23:53

标签: mfc

我在滚动视图的顶部显示了一个工具栏。当我在滚动视图上调用invalidate时,我意识到工具栏和滚动视图都有屏幕闪烁问题。

我尝试通过覆盖其擦除后台事件处理程序来解决方法。

此方法适用于滚动视图,但不适用于工具栏。

这是我的代码段。

void MyCScrollView::OnInitialUpdate() {
    CScrollView::OnInitialUpdate();
    // ToolBar is NonFlickeringCToolBar, inherited from CToolBar
    ToolBar.Create(this);
    ToolBar.LoadToolBar(IDR_TOOLBAR);
    ToolBar.ShowWindow(SW_SHOW);
    ToolBar.SetBarStyle(CBRS_ALIGN_TOP | CBRS_SIZE_FIXED);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
}

BOOL MyCScrollView::OnEraseBkgnd(CDC* pDC)
{
    // Override to prevent screen flickering. Works!
    return TRUE;
}

BOOL NonFlickeringCToolBar::OnEraseBkgnd(CDC* pDC) {
    // Override to prevent screen flickering. Doesn't work!
    return TRUE;
} 

这是我覆盖擦除背景事件处理程序之前的屏幕截图。

alt text

这是我覆盖擦除背景事件处理程序后的屏幕截图。不是这样,工具栏仍然保持闪烁,还有其他问题:它的实体背景消失,直到我将鼠标光标移到其身体上。

alt text

我希望

  1. 使滚动视图和工具栏都无闪烁
  2. 工具栏的实体背景仍然存在
  3. 我错过了什么?

1 个答案:

答案 0 :(得分:1)

防止重绘工具栏占用的区域。

BOOL MyCScrollView::PreCreateWindow(CREATESTRUCT& cs)
{
    // Add the WS_CLIPCHILDREN style to avoid repaint problems.
    // Without this, our toolbar will keep flickering.
    cs.style |= WS_CLIPCHILDREN;

    return CView::PreCreateWindow(cs);
}