2015-03-10 2 views
0

J'ai dessiné roundRectangle en utilisant Graphics Path OnPaintEvent et j'ai déjà ajouté mouseevent pour savoir si le curseur était sur le g.p.Redessiner le chemin graphique lorsque mouseMoved

void Round_MouseMove(object sender, MouseEventArgs e) 
     { 
      Point mousePt = new Point(e.X, e.Y); 
      if (_path != null) 
      if (_path.IsVisible(e.Location)) 
       MessageBox.Show("GraphicsPath has been hovered!"); 
     } 

Question: est-il possible de redimensionner ou redessiner (masquer précédente puis dessinez nouveau) un moteur d'exécution GraphicsPath?

+0

Règle générale pour le rendu Winforms: ne dessine que dans les événements Paint ou OnPaint() '; garder trace quelque part ce que vous voulez dessiner (par exemple bitmap, liste de points, objets, etc.); appelez 'Invalidate()' quand vous voulez que l'écran soit redessiné (c'est-à-dire quand les choses que vous gardez trace de dessiner ont changé). De votre question, je suppose que vous avez violé toutes ces règles (une erreur commune pour les nouveaux programmeurs). Donc, l'étape n ° 1 est de comprendre ces règles, et d'étudier des tutoriels et de la documentation qui expliquent pourquoi ces règles existent et comment travailler en leur sein. –

Répondre

0

Appelez Invalidate pour redessiner le Form, afin que le OnPaint(PaintEventArgs e) soit exécuté.

Vérifiez l'exemple suivant:

public sealed partial class GraphicsPathForm : Form 
{ 
    private bool _graphicsPathIsVisible; 

    private readonly Pen _pen = new Pen(Color.Red, 2); 
    private readonly Brush _brush = new SolidBrush(Color.FromArgb(249, 214, 214)); 
    private readonly GraphicsPath _graphicsPath = new GraphicsPath(); 
    private Rectangle _rectangle = new Rectangle(10, 30, 100, 100); 

    public GraphicsPathForm() 
    { 
     InitializeComponent(); 

     _graphicsPath.AddRectangle(_rectangle); 
    } 


    protected override void OnPaint(PaintEventArgs e) 
    { 
     var g = e.Graphics; 
     g.CompositingQuality = CompositingQuality.HighQuality; 
     g.InterpolationMode = InterpolationMode.Bilinear; 
     g.SmoothingMode = SmoothingMode.AntiAlias; 

     g.DrawPath(_pen, _graphicsPath); 

     if (_graphicsPathIsVisible) 
      g.FillPath(_brush, _graphicsPath); 


     base.OnPaint(e); 
    } 

    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     var isVisible = _graphicsPath.IsVisible(e.Location); 

     if (isVisible == _graphicsPathIsVisible) 
      return; 

     const int zoom = 5; 

     if (isVisible) 
     { 
      if (!_graphicsPathIsVisible) 
      { 
       _rectangle.Inflate(zoom, zoom); 
       _graphicsPath.Reset(); 
       _graphicsPath.AddRectangle(_rectangle); 
      } 
     } 
     else 
     { 
      if (_graphicsPathIsVisible) 
      { 
       _rectangle.Inflate(-zoom, -zoom); 
       _graphicsPath.Reset(); 
       _graphicsPath.AddRectangle(_rectangle); 
      } 
     } 

     _graphicsPathIsVisible = isVisible; 
     Invalidate(); 

     base.OnMouseMove(e); 
    } 
} 

J'espère que ça aide.

+0

je l'ai vu et ça marche! ty ... il remplit la couleur de chaque mousemove ... mais il est possible de faire un changement de rectangle si on le survole? – Elegiac

+0

j'ai essayé rectangle.Inflate mais il ne fonctionne toujours pas pour moi ... – Elegiac

+0

@Elegiac oui sûr que c'est possible. Vous devez stocker le rectangle dans une var, changer la taille et ajouter de nouveau à '_graphicsPath'. Je vais essayer de modifier mon exemple. – dbvega