2010-08-16 2 views
2

J'ai une barre d'outils affichée en haut de la vue défilement. Lorsque j'appelle invalide en mode défilement, je me rends compte que la barre d'outils et la vue déroulante ont un problème de scintillement d'écran.Empêche le scintillement de l'écran pour CScrollView et CToolBar

Je tente d'avoir une solution de contournement en remplaçant leur gestionnaire d'événements d'arrière-plan d'effacement.

Cette méthode fonctionne pour l'affichage déroulant, mais pas pour la barre d'outils.

Voici mon extrait de code.

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

Voici la capture d'écran avant de remplacer le gestionnaire d'événement d'effacement d'arrière-plan.

alt text

Voici le tournage de l'écran après avoir passer outre le gestionnaire d'événements d'arrière-plan d'effacement. Non, la barre d'outils continue à clignoter, avec un problème supplémentaire: son arrière-plan est parti jusqu'à ce que je place le curseur de la souris sur son corps.

alt text

Je souhaite

  1. Marque défilante et barre d'outils à la fois non vacillante
  2. fond solide pour la barre d'outils toujours là

Tout ce que j'avais manqué?

Répondre

1

Empêche la redéfinition de la zone occupée par la barre d'outils.

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