2009-11-10 14 views
8

Ich erhalte immer einen Fehler im folgenden Code, wenn ich das Druckvorschau-Fenster schließe oder das Druckvorschau-Fenster verschiebe. Ich kann nicht verstehen, warum das passiert. Es passiert in der g.DrawString() Zeile. Soweit ich das beurteilen kann, wurde auch nichts entsorgt.C# -Parameter ist nicht gültig Fehler

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; 
     } 
    } 

Erster Teil des Fehlers:

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) 

Jede Hilfe würde geschätzt.

Danke.

+0

Was ist die Ausnahme? – jason

+0

System.ArgumentException {"Parameter ist nicht gültig."} – Nathan

+0

Was ist in 'Text'? –

Antwort

20

Ich habe vor nicht allzu langer Zeit den gleichen Fehler festgestellt. Der Grund war, dass eines der Objekte bereits entsorgt wurde ...

Vielleicht wird die Schriftart irgendwo anders platziert, oder das Grafikobjekt selbst. Ich glaube nicht, dass der Pinsel Probleme verursachen würde, weil er für die Methode lokal ist und wir sehen, dass er nicht entsorgt wird.

Edit:

Um zu wissen, ob ein Grafikobjekt angeordnet ist, ist einfach: alle seine Eigenschaften eine Ausnahme werfen. Es ist jedoch nicht so einfach für eine Schriftart, weil alle Eigenschaften noch funktionieren. Eine Möglichkeit, um zu überprüfen, ob die Schriftart entsorgt wird oder nicht, besteht darin, sie zu klonen (Sie können font.Clone() im Watch-Fenster hinzufügen, um sie zu testen). Wenn der Klon funktioniert, wird die Schriftart nicht entfernt. Andernfalls wird eine Ausnahme ausgelöst.

+0

Ich sehe jedoch nichts als entsorgt. Es ist nur verwirrend, weil alles, was ich in der Seitenansicht gezeichnet habe, aus seiner eigenen Klasse stammt, so dass ich nicht verstehe, warum es das Formular überhaupt berührt. – Nathan

+1

Überprüfen Sie meine Bearbeitung, eine entsorgte Schriftart zeigt immer noch alle Eigenschaften an, als wäre sie nicht entsorgt. –

+0

Ich habe es jetzt darauf eingegrenzt, die Ausnahme bei this.Font.GetHeight() zu werfen. Irgendwelche Ideen? – Nathan

1

Müssen die x/y-Koordinaten explizit float sein (d. H. 0.0f statt 0)? Ich würde damit einen Kompilierfehler erwarten, kein Laufzeitfehler also wahrscheinlich nicht.

+0

Ich habe das auf das umgestellt, was Sie vorgeschlagen haben, und ich bekomme immer noch den Fehler. – Nathan

0

Ich habe nicht so viel mit OnPaint getan ... Alles, was Sie zeigen, ist über Rechtecke. Drehen Sie ein Rechteck oder eine Schnur? Wenn es ein Rechteck ist, sollte es nicht .DrawRectangle anstelle von .DrawString sein?

0

Falls jemand den gleichen Fehler hat, fand ich heraus, dass die Durchführung der Transformationen in "separaten Schritten" das Problem löst.

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(); 
      } 
Verwandte Themen