2010-08-16 167 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); 
}