防止CScrollView和CToolBar的屏幕闪烁
问题描述:
我有一个工具栏显示在滚动视图的顶部。当我在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;
}
这里是我重写擦除后台事件处理程序之前的屏幕拍摄。
这里后,我重写擦除背景事件处理程序的屏幕拍摄。不是这样,工具栏仍然保持闪烁,还有一个额外的问题:其坚实的背景消失,直到我将鼠标光标放在其身体上。
我希望
- 制作滚动视图和工具栏都无闪烁
- 坚实的背景的工具栏还在那里
什么我已经错过了?
答
防止重绘工具栏占用的区域。
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);
}