2009-10-06 8 views
1

que je recherchais sur certains tutoriel GDI, mais tout ce que j'ai trouvé si loin fonctionne avec la méthode OnPaint, qui passe à Paintarguments Graphics. Je n'ai pas trouvé comment démarrer à partir de zéro, je veux dire comment utiliser la classe Graphics elle-même? Ce est tout le code je treid que le travail ne marche pas pour moi tout simplement:Dessiner une ellipse sans méthode OnPaint

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Pen pen= new Pen(Color.Red, 3); 
      Graphics g; 
      g = this.CreateGraphics(); 
    g.DrawEllipse(pen, 150, 150, 100, 100); 
     } 
    } 
} 

Il juste ne rien faire. Je l'ai essayé sous une nouvelle forme, rien.

Merci d'avance!

+0

Et est-il ou ne fonctionnait pas? –

+0

Lorsque vous appelez CreateGraphics, vous devez disposer manuellement de l'objet créé, c'est-à-dire appeler g.Dispose() lorsque vous avez terminé. – Skizz

Répondre

1

Le code est probablement OK, il dessine une ellipse que vous espériez. Toutefois, après l'événement Load, il y aura un événement PaintBackground et un PaintEvent lorsque le formulaire est affiché. Le PaintBackground effacera par défaut le contenu du contrôle, supprimant ainsi l'ellipse que vous venez de dessiner.

La peinture est un processus en deux étapes:

for each (region in set of regions that need updating) 
{ 
    PaintBackground (region) 
    Paint (region) 
} 

Le gestionnaire de fenêtres redessine uniquement les parties du contrôle qui nécessitent une mise à jour, si le contenu du contrôle n'a pas changé ou aucune action de l'utilisateur a changé de contrôle visibilité alors aucune peinture n'est faite. Alors, pourquoi voulez-vous dessiner l'ellipse dans la méthode Load? Habituellement, vous voulez seulement dessiner quelque chose quand quelque chose doit être dessiné, et votre forme est dite quand quelque chose doit dessiner dans les événements PaintBackground et Paint.

Etes-vous préoccupé par le scintillement? Ou est-ce un problème de vitesse? Les ellipses sont rapides à dessiner. Scintillement, cependant, est plus difficile à résoudre. Vous devez créer une image bitmap, dessiner sur l'image bitmap et affecter le bitmap au contrôle lors de l'événement Paint. En outre, faites l'événement PaintBackground ne rien faire - ne pas effacer le contrôle, c'est l'effacement qui provoque le scintillement.

EDIT: Un exemple, j'utilise DevStudio 2005 ici.

  1. Créez une nouvelle application winform C#.
  2. Dans Form1.cs ajouter ce qui suit:

    protected override void OnPaintBackground (PaintEventArgs e) 
    { 
        // do nothing! prevents flicker 
    } 
    
    protected override void OnPaint (PaintEventArgs e) 
    { 
        e.Graphics.FillRectangle (new SolidBrush (BackColor), e.ClipRectangle); 
    
        Point 
        mouse = PointToClient (MousePosition); 
    
        e.Graphics.DrawEllipse (new Pen (ForeColor), new Rectangle (mouse.X - 20, mouse.Y - 10, 40, 20)); 
    } 
    
    protected override void OnMouseMove (MouseEventArgs e) 
    { 
        base.OnMouseMove (e); 
        Invalidate(); 
    } 
    
  3. compiler et exécuter.

+0

Et si j'ai besoin de redessiner toujours un objet spécial en utilisant les paramètres d'entrée? Ma forme suit la souris. – Petr

+0

Pour suivre la souris, traitez l'événement de déplacement de la souris et invalidez le formulaire, le contrôle sera redessiné lors des événements de déplacement de la souris. – Skizz

Questions connexes