我在滚动视图的顶部显示了一个工具栏。当我在滚动视图上调用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;
}
这是我覆盖擦除背景事件处理程序之前的屏幕截图。
这是我覆盖擦除背景事件处理程序后的屏幕截图。不是这样,工具栏仍然保持闪烁,还有其他问题:它的实体背景消失,直到我将鼠标光标移到其身体上。
我希望
我错过了什么?
答案 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);
}