2009-08-25 7 views
3

Je rencontre d'étranges artefacts de dessin que j'espère que quelqu'un pourrait m'aider à cerner. Fondamentalement, j'ai un panneau ancré à gauche qui est censé avoir un fond dégradé qui n'a pas fonctionné correctement. J'ai changé les couleurs pour le débogageManuel Peinture Numéro

screenshot http://img509.imageshack.us/img509/5650/18740614.png

Le panneau est accosté à gauche, et dispose d'un contrôle transparent sur elle (d'où vous pouvez voir les petits bouts de rouge le long des bords où le contrôle transparent a été correctement peint , ramasser la couleur de fond).

Lorsque je redimensionne le panneau lentement, je reçois des lignes rouges en bas, que je m'attendais à recouvrir avec des remplissages jaunes. Le code que je utilise est comme suit:

// Construction 
sidePanel.Paint += new PaintEventHandler(OnPaint); 

private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    Panel pb = sender as Panel; 
    PaintControl(pb.Width, pb.Height, sender, e, true); 
} 

private static void PaintControl(int width, int height, object sender, PaintEventArgs e, bool sidebar) 
{ 
    Rectangle baseRectangle = new Rectangle(0, 0, width -1, height-1); 

    using (LinearGradientBrush gradientBrush = new LinearGradientBrush(baseRectangle, WizardBaseForm.StartColour, WizardBaseForm.EndColour, 90)) 
    { 
     e.Graphics.Clear(Color.Yellow); 
     e.Graphics.DrawRectangle(Pens.Red, baseRectangle); 
     e.Graphics.FillRectangle(Brushes.Yellow, baseRectangle); 
    } 
} 

protected override void OnResize(EventArgs e) 
{ 
    base.OnResize(e); 
    this.Invalidate(); 
} 

L'effet global de c'est que je ne reçois pas soit une belle couleur unie ou un remplissage dégradé agréable quand je remets à la côte.

Répondre

3

Je suggère de créer votre propre panneau, dériver de panneau et placez les éléments suivants dans le constructeur:

this.SetStyle(ControlStyles.AllPaintingInWmPaint 
       | ControlStyles.OptimizedDoubleBuffer 
       | ControlStyles.ResizeRedraw 
       | ControlStyles.DoubleBuffer 
       | ControlStyles.UserPaint 
       , true); 
+0

Assez juste. Fonctionne comme un charme. Je ne comprends toujours pas pourquoi le problème original s'est manifesté bien? – Ian

+0

C'est parce que lorsque vous redimensionnez, l'événement paint ne se déclenche pas. Donc vous devez le forcer avec le ResizeRedraw, le reste n'est pas obligatoire mais aider avec l'amélioration de leurs propres petites manières. Le scintillement de votre formulaire était auparavant parce que vous définissiez le style pour le formulaire et non le panneau. C'est un monde amusant, le monde de la peinture manuelle! – ThePower

1

Ajouter suivante Nouveau (après InitializeComponents):

this.SetStyle(ControlStyles.ResizeRedraw, true); 

Ceci est d'assurer la peinture sur Redimensionner.

Il existe peu de styles supplémentaires que vous pouvez essayer (AllPaintingInWmPaint, UserPaint ...), mais leur configuration dépend de votre cas particulier et de ce que vous voulez faire exactement. Dans le cas où toute la peinture est faite par vous dans l'événement Paint, je les définirais.

+0

Josip. Si j'ajoute ceci alors tout le formulaire semble aller très flickery quand je commence à redimensionner les choses ... – Ian

+0

Vous devez les ajouter juste pour le panneau. – ThePower