2010-07-16 10 views
2

je le code exemple suivant, que je pense à la couleur du panneau sur le rouge de forme dès qu'il charge:Dessin sur un panneau dans le constructeur d'une forme

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     drawstuff(); 
    } 

    public void drawstuff() 
    { 
     using (Graphics g = panel1.CreateGraphics()) 
     { 
      g.Clear(Color.Red); 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     drawstuff(); 
    } 
} 

Cependant, pour une raison quelconque ne dessine pas sur le panneau lorsque j'appelle ma fonction drawstuff() du constructeur comme ça. Lorsque j'appuie sur le bouton pour appeler drawstuff(), cela fonctionne très bien.

Quelqu'un peut-il expliquer ce qui se passe ici?

+0

Essayez le panneau invalidant à la fin de l'appel à DrawStuff. (myPanel.Invalidate()); –

+0

@SnOrfus - J'ai essayé Invalidate() à un moment donné, et il ne l'a pas corrigé. Je pense que le problème fondamental est que j'essaie de dessiner avant le début du cycle de peinture normal, comme indiqué dans la réponse ci-dessous. – WildCrustacean

+0

@SnOrfus: INFIRMER à la fin d'une action de tirage personnalisé sera _faire sure_ il est effacé immédiatement. –

Répondre

4

ce qui se passe ici?

Vous devancez l'effacement/la peinture du formulaire. Il est dessiné puis effacé lorsque les formulaires s'affichent (pour la 1ère fois).

Vous pouvez essayer l'événement FormCreate (je ne suis pas tout à fait sûr), mais le mettre dans le cas montré devrait certainement travailler.

Mais sachez que les résultats de DrawStuff() disparaîtront lorsque vous minimisez/ou cliquez sur Restaurer les autres fenêtres à l'avant.

Pensez à utiliser un indicateur d'état (DoDrawStuff()) et faire le dessin réel en cas panel1_Paint.

+0

Sans aucun doute dans l'événement Paint – colithium

+0

J'ai essayé l'événement montré et il semble que cela a le même problème. C'est une bonne suggestion cependant d'utiliser un drapeau, puis faire le dessin dans l'événement Paint, je vais examiner cela. – WildCrustacean

1

pourrait être plus facile de créer votre propre panneau personnalisé et passer outre OnPaint ...

public class MyCustomPanel : Panel 
{ 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 

     e.Graphics.Clear(Color.Red); 
    } 
}