2008-11-13 7 views
2

Mon application affiche un formulaire en tant qu'enfant du formulaire principal. Sur le formulaire est
Contrôle utilisateur avec un panneau où les graphiques sont rendus. Lorsqu'il est exécuté à partir de Visual Studio en mode débogage, le dessin est souvent rendu comme prévu, imaginez un graphique simplement XY. Si les graphiques du panneau ne sont pas dessinés, l'ajout de deux ou trois points de rupture aux routines de dessin règle généralement le problème. Lorsqu'ils sont exécutés dans Visual Studio en mode édition ou à partir de.exe dans n'importe quel mode, les graphiques ne sont jamais rendus, même si la méthode Paint du contrôle utilisateur est . En redimensionnant le formulaire, vous pouvez à nouveau appeler la repeinte et l'image est maintenant rendue correctement.Problème de dessin des graphiques au contrôle utilisateur

Quelqu'un peut-il me donner une idée de la raison pour laquelle il y a une différence dans le comportement entre débogage et Release modes, d'exécution dans VS et VS côté sur, tout pourquoi sont les points de rupture parfois arranger les choses? Et comment puis-je obtenir les graphiques pour être toujours visible.

Merci,

Rick

alt text http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.pngalt text http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

Répondre

1

Sans plus d'informations, je ne peux pas dire exactement pourquoi vous voyez la différence de comportement (je suggère que vous voyez le même problème depuis vous admettez que la version de débogage ne fonctionne pas toujours non plus), mais vous constaterez que les points d'arrêt résolvent souvent les problèmes de peinture car le retour à Visual Studio finit par invalider toute la surface de peinture, par opposition à une petite partie. Donc, vous faites apparaître l'application et ne peignez pas correctement, vous frappez un point d'arrêt dans le studio visuel, basculez sur certaines variables, revenez à l'application et peignez correctement car OnPaint a été appelé avec le rectangle de découpage approprié pour repeindre toute la surface (et OnPaintBackground est également appelé, voir ci-dessous).

Si tel est le cas, vous devriez pouvoir le répliquer dans la version finale en minimisant et en restaurant votre application. Si cela "corrige" l'affichage de votre contrôle, il est probable qu'il soit causé par un problème avec votre méthode de peinture en supposant qu'il est en train de peindre le contrôle entier quand il ne l'est pas.

Vous pouvez également regarder dans PaintBackground pour vous assurer que vous effacez correctement la surface de votre contrôle. Il est possible que vous quittiez votre ancien affichage et que vous le repeigniez au lieu de partir d'une toile «fraîche».

D'après votre description de ce qui se passe, et la façon dont vous le faites redessiner, ce sont mes meilleures suggestions. J'aurais besoin de plus de détails spécifiques (code de peinture, description spécifique de ce qui se passe - le contrôle n'est-il pas dessiné ou n'affiche-t-il que des parties, etc.) pour fournir une aide plus précise.

1

Je viens de lui donner un tourbillon et il a fait ce que je m'attendais en mode de libération. . . il remplit le panneau avec la couleur Bleu et une grande ellipse jaune. Veuillez publier le nombre minimal d'exemples de code requis pour reproduire le problème. . . peut-être construire de MyPanel ci-dessous.

Le rôle de la minuterie est de s'assurer que nous ne redessinons pas trop souvent. C'est une minuterie à auto-terminaison qui oblige à repeindre tout le contrôle. Cela est nécessaire car les tailles de contenu dessinées personnalisées avec le contrôle.

public class MyPanel : Panel 
    { 
     Timer _resizeRedrawDelayTimer = new Timer(); 
     public MyPanel() 
     { 
      _resizeRedrawDelayTimer.Interval=50; 
      _resizeRedrawDelayTimer.Tick += new EventHandler(_resizeRedrawDelayTimer_Tick); 
     } 

     void _resizeRedrawDelayTimer_Tick(object sender, EventArgs e) 
     { 
      Invalidate(); 
      _resizeRedrawDelayTimer.Stop(); 
     } 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      // don't redraw if still resizing. 
      if (!_resizeRedrawDelayTimer.Enabled) 
      { 
       e.Graphics.FillRectangle(Brushes.Blue, this.ClientRectangle); 
       e.Graphics.FillEllipse(Brushes.Yellow, this.ClientRectangle); 
      } 
      base.OnPaint(e); 
     } 

     protected override void OnResize(EventArgs eventargs) 
     { 
      if (_resizeRedrawDelayTimer.Enabled) 
       _resizeRedrawDelayTimer.Stop(); 
      // restart the timer. 
      _resizeRedrawDelayTimer.Start(); 
      base.OnResize(eventargs); 
     } 
    } 
Questions connexes