2009-11-10 60 views
8

Je continue d'obtenir une erreur dans le code suivant lorsque je ferme la fenêtre d'aperçu avant impression ou déplace la fenêtre d'aperçu avant impression. Je n'arrive pas à comprendre pourquoi cela se passe. Cela arrive sur la ligne g.DrawString(). Autant que je sache, rien n'a été éliminé non plus.Le paramètre C# n'est pas valide Erreur

protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Brush textBrush = new SolidBrush(this.ForeColor); 

     float width = TextRenderer.MeasureText(Text, this.Font).Width; 
     float height = TextRenderer.MeasureText(Text, this.Font).Height; 

     float radius = 0f; 

     if (ClientRectangle.Width < ClientRectangle.Height) 
      radius = ClientRectangle.Width * 0.9f/2; 
     else 
      radius = ClientRectangle.Height * 0.9f/2; 

     switch (orientation) 
     { 
      case Orientation.Rotate: 
       { 
        double angle = (_rotationAngle/180) * Math.PI; 
        g.TranslateTransform(
         (ClientRectangle.Width + (float)(height * Math.Sin(angle)) - (float)(width * Math.Cos(angle)))/2, 
         (ClientRectangle.Height - (float)(height * Math.Cos(angle)) - (float)(width * Math.Sin(angle)))/2); 
        g.RotateTransform((float)_rotationAngle); 
        g.DrawString(Text, this.Font, textBrush, 0, 0); 
        g.ResetTransform(); 
       } 
       break; 
     } 
    } 

Première partie de l'erreur:

at System.Drawing.Graphics.CheckErrorStatus(Int32 status) 
    at System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format) 
    at System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, Single x, Single y) 
    at ScanPro.CustomControls.UserLabel.OnPaint(PaintEventArgs e) 

Toute aide serait appréciée.

Merci.

+0

Quelle est l'exception? – jason

+0

System.ArgumentException {"Le paramètre n'est pas valide."} – Nathan

+0

Que contient le 'Texte'? –

Répondre

20

J'ai rencontré la même erreur il n'y a pas longtemps. La raison en était que l'un des objets était déjà disposé ...

Peut-être que la police est disposée ailleurs, ou l'objet graphique lui-même. Je ne pense pas que le pinceau causerait des problèmes, car il est local à la méthode et nous voyons qu'il n'est pas disposé.

Edit:

Pour savoir si oui ou non un objet graphique est disposé est facile: toutes ses propriétés jettent une exception. Ce n'est pas aussi facile pour une police, car toutes les propriétés fonctionnent toujours. Un moyen que j'ai trouvé pour vérifier si la police est disposée ou non est d'essayer de le cloner (vous pouvez ajouter font.Clone() dans la fenêtre Watch pour le tester). Si le clone fonctionne, la police n'est pas éliminée. Sinon, il va lancer une exception.

+0

Je ne vois rien comme étant disposé. C'est juste déroutant parce que tout ce que je dessine à l'aperçu avant impression est tiré de sa propre classe donc je ne comprends pas pourquoi il est même en train de toucher le formulaire. – Nathan

+1

Vérifiez ma modification, une police disposée affiche toujours toutes ses propriétés comme si elle n'est pas disposée. –

+0

Je l'ai réduit maintenant à jeter l'exception à this.Font.GetHeight(). Des idées? – Nathan

1

Avez-vous besoin d'avoir explicitement vos coordonnées x/y être flottantes (c'est-à-dire 0.0f au lieu de 0)? Je m'attendrais à une erreur de compilation de cela, pas une erreur d'exécution donc probablement pas.

+0

Je suis passé à ce que vous avez suggéré et je reçois toujours l'erreur. – Nathan

0

Je n'ai pas fait grand-chose avec OnPaint ... Tout ce que vous montrez concerne les Rectangles. Tournez-vous un rectangle ou une chaîne? Si c'est un rectangle, ne devrait-il pas être .DrawRectangle au lieu de .DrawString?

0

Au cas où quelqu'un aurait la même erreur, j'ai découvert que l'exécution des transformations en "étapes séparées" résout le problème.

using (var graphics = Graphics.FromImage(destImage)) 
      { 
       using (var wrapMode = new ImageAttributes()) 
       { 


        wrapMode.SetWrapMode(WrapMode.TileFlipXY); 
        graphics.CompositingMode = CompositingMode.SourceCopy; 
        graphics.CompositingQuality = CompositingQuality.HighQuality; 
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
        graphics.SmoothingMode = SmoothingMode.HighQuality; 
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
        graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); 

       }    
      } 

      using (var graphics = Graphics.FromImage(destImage)) 
      { 
       var font = new Font(new FontFamily("Arial"), 16, FontStyle.Regular, GraphicsUnit.Pixel); 
       var brush = new SolidBrush(Color.White); 
       graphics.DrawString("text to add", font, brush, 10F, 10F); 
       font.Dispose(); 
       brush.Dispose(); 
      } 
Questions connexes