Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 防止CScrollView和CToolBar的屏幕闪烁_Mfc - Fatal编程技术网

Mfc 防止CScrollView和CToolBar的屏幕闪烁

Mfc 防止CScrollView和CToolBar的屏幕闪烁,mfc,Mfc,我有一个工具栏显示在滚动视图的顶部。当我在scroll view上调用invalidate时,我意识到工具栏和scroll view都存在屏幕闪烁问题 我试图通过重写它们的擦除背景事件处理程序来找到解决方法 此方法适用于滚动视图,但不适用于工具栏 这是我的代码片段 void MyCScrollView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); // ToolBar is NonFlickeringCToolBar,

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

我试图通过重写它们的擦除背景事件处理程序来找到解决方法

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

这是我的代码片段

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