2011-10-17 3 views
1

salut J'essaye d'implémenter un formulaire qui redimensionne en utilisant le codage. J'ai utilisé la méthode form_paint pour peindre une bordure mais je ne peux pas "peindre" cette bordure. Ce que j'ai l'intention de faire est que comme je redimensionne le formulaire en utilisant un temporisateur pour un "redimensionnement doux", la bordure de formulaire serait mise à jour avec le redimensionnement. que devrais-je faire?dessiner sur des graphiques dessinés en winforms

Pen setupControlPen = new Pen(SystemColors.Control, 16); 
    Pen setupDimGrayPen = new Pen(Color.DimGray, 5); 

dans mon Form_Paint: // dessine une forme frontière

Rectangle newRectangle; 
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    setupGraphics.DrawRectangle(setupDimGrayPen, newRectangle); 

l'intérieur d'un événement click: // j'ai essayé de tirer sur la frontière déjà tracée.

Rectangle newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    setupGraphics.DrawRectangle(setupControlPen, newRectangle); 

merci! Mise à jour: J'ai essayé d'utiliser à la fois l'événement resize_form et le timer pour redessiner, mais je ne peux toujours pas redessiner la bordure chaque fois que je redimensionne le formulaire.

mise à jour 2: la méthode prioritaire fonctionne! en ce qui concerne le setupGraphics:

//global space 
    Graphics setupGraphics; 

    //form_load 
    setupGraphics = this.CreateGraphics(); 

    //so whenever I want to draw something during an event, supposing a button click event to draw a line: 
    setupGraphics.DrawLine(pen, point1, point2); 

Je voudrais demander s'il y a des failles dans cette méthode? ou tout devrait-il être fait à l'intérieur de la méthode form_paint?

+0

Est-ce que votre FormBorderStyle est définie sur None? – LarsTech

+0

oui il est réglé sur aucun – user776914

Répondre

2

Essayez redéfinissant la méthode OnPaintBackground et définir le style de la forme à ResizeRedraw et double tampon il:

public Form1() { 
    InitializeComponent(); 
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); 
} 

protected override void OnPaintBackground(PaintEventArgs e) { 
    e.Graphics.Clear(SystemColors.Control); 

    using (Pen setupDimGrayPen = new Pen(Color.DimGray, 5)) { 
    Rectangle newRectangle; 
    newRectangle = new Rectangle(new Point(0, 0), new Size(this.Width - 1, this.Height - 1)); 
    e.Graphics.DrawRectangle(setupDimGrayPen, newRectangle); 
    } 
} 

Il est pas très clair où setupGraphics est de venir dans votre poste.

+0

Vous ne savez pas si vous devriez encourager la création d'objets dans un événement paint. Le stylo est mieux fait à l'extérieur et éliminé correctement avec la classe.Je dirais que la surcharge de DrawRectange qui prend x, y, largeur et hauteur est meilleure aussi ... Je vous ai fait une mise à jour bien que – musefan

+0

Salut en utilisant la méthode de remplacement protégé fonctionne sans définir le style et cela fonctionne même avec doublebuffered mis à false. J'ai depuis édité ma question avec setupGraphics. – user776914

+0

@ user776914 L'objet Graphics est mieux utilisé à partir des événements Paint. Si vous avez besoin de dessiner quelque chose de différent en fonction d'un button_click, configurez une variable locale pour déterminer avec quel stylo vous voulez dessiner. Appelez Invalidate() sur le formulaire si vous ne redimensionnez pas le formulaire dans l'événement click button pour actualiser les graphiques. – LarsTech

2

Votre événement click redimensionne-t-il réellement le formulaire? Si aucune modification est apportée à la forme alors la forme ne sera pas essayer de repeindre, vous pouvez essayer un de ces ...

form.Invalidate(); 
form.Refresh(); 
paintControl.Invalidate(); 
paintControl.Refresh(); 

PaintControl est pour si vous avez un contrôle autre que la forme que la peinture est effectivement fait, vous ne devez rafraîchir le plus petit contrôle/zone requise

en outre, ne pas oublier de mettre DoubleBuffered à true pour votre formulaire/contrôle

EDIT: Je ne sais pas ce que setupGraphics est? Pourquoi n'utilisez-vous pas l'objet e.Graphics dans les arguments de l'événement Paint?

+0

oh je l'ai déclaré comme: Graphics setupGraphics; dans l'espace global. dans l'événement form_load je l'initialise comme setupGraphics = this.createGraphics(); – user776914

+1

@ user776914: on dirait que cela pourrait être un facteur contributif. Essayez d'utiliser e.Graphics ou OnPaintBackground comme suggéré ailleurs ... l'autre réponse semble bonne – musefan

4

La peinture pour les contrôles de conteneur est optimisée. Cela devient gênant dans votre cas, vous voulez que l'événement Paint se déclenche lorsque la taille du formulaire change. Faites votre constructeur ressembler à ceci:

public Form1() { 
     InitializeComponent(); 
     this.ResizeRedraw = true; 
     this.DoubleBuffered = true; 
    } 

Ou le dessin frontière dans une dérogation pour OnPaintBackground().

+0

sympa ... fois comme ça, je devrais être en mesure d'upvote deux fois! – musefan

Questions connexes