2010-08-16 150 views
2

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

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

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

这是我的代码片段。

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. 坚实的背景的工具栏还在那里

什么我已经错过了?

回答

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); 
}