2010-07-15 18 views
1

J'ai créé un contrôle personnalisé dérivé de Panel. Je l'utilise pour afficher une image utilisant la propriété BackgroundImage. Je redéfinir la méthode OnClick et mettre isSelected à true puis appeler la méthode Invalidate et dessiner un rectangle dans OnPaint substitué. Tout va bien jusqu'à ce que je mette DoubleBuffered à true. Le rectangle est dessiné puis effacé et je n'arrive pas à comprendre pourquoi cela se produit.Un problème de substitution de OnPaint lorsque DoubleBuffered est défini sur

public CustomControl() 
    : base() 
{ 
    base.DoubleBuffered = true; 

    base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); 
} 

protected override void OnPaint(PaintEventArgs pe) 
{ 
    base.OnPaint(pe); 

    PaintSelection(); 
} 

private void PaintSelection() 
{ 
    if (isSelected) 
    { 
     Graphics graphics = CreateGraphics(); 
     graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1); 
    } 
} 

Répondre

6

Dans votre PaintSelection, vous ne devez pas créer un nouvel objet Graphics, car cet objet puisera dans la mémoire tampon avant, qui est ensuite rapidement par le contenu mis à découvert du tampon de retour.

Peinture à l'Graphics passé dans la PaintEventArgs place:

protected override void OnPaint(PaintEventArgs pe) 
{ 
    base.OnPaint(pe); 
    PaintSelection(pe.Graphics); 
} 

private void PaintSelection(Graphics graphics) 
{ 
    if (isSelected) 
    { 
     graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1); 
    } 
} 
+0

Je savais qui était facile, je vous remercie! –