2009-11-10 15 views
8

Po zamknięciu okna podglądu wydruku lub przesunięciu okna podglądu wydruku wciąż pojawia się błąd w poniższym kodzie. Nie mogę zrozumieć, dlaczego tak się dzieje. Zdarza się to w linii g.DrawString(). O ile mogę powiedzieć, nic nie zostało zrezygnowane.Parametr C# jest nieprawidłowy

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

Pierwsza część błędu:

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) 

Każda pomoc będzie mile widziane.

Dzięki.

+0

Co to jest wyjątek? – jason

+0

System.ArgumentException {"Parametr jest nieprawidłowy."} – Nathan

+0

Co zawiera tekst "Tekst"? –

Odpowiedz

20

Napotkałem ten sam błąd niedawno. Powodem było to, że jeden z obiektów został już usunięty ...

Może czcionka jest usuwana gdzie indziej lub sam obiekt graficzny. Nie sądzę, aby pędzel spowodował problemy, ponieważ jest lokalny w stosunku do metody i widzimy, że nie jest zepsuty.

Edit:

Aby dowiedzieć się, czy dany obiekt graficzny umieszczony jest proste: wszystkich jego właściwości wyjątek. Czcionka nie jest jednak łatwa, ponieważ wszystkie właściwości nadal działają. Jednym ze sposobów sprawdzenia, czy czcionka jest usuwana, jest próba sklonowania (można dodać font.Clone() w oknie Watch, aby ją przetestować). Jeśli klon działa, czcionka nie jest usuwana. W przeciwnym razie wygeneruje wyjątek.

+0

Nie widzę jednak niczego tak usposobionego. To jest po prostu mylące, ponieważ wszystko, co rysuję do podglądu wydruku, pochodzi z jego własnej klasy, więc nie rozumiem, dlaczego nawet dotyka formularza. – Nathan

+1

Sprawdź moją edycję, a wyrzucona czcionka nadal wyświetla wszystkie jej właściwości tak, jakby nie zostały usunięte. –

+0

Zawęziłem to teraz, aby rzucić wyjątek w tym.Font.GetHeight(). Jakieś pomysły? – Nathan

1

Czy chcesz, aby twoje współrzędne x/y były jawne (tj. 0.0f zamiast 0)? Oczekuję od tego błędu kompilacji, a nie błędu środowiska wykonawczego, więc prawdopodobnie nie.

+0

Przełączyłem to na sugerowane i nadal otrzymuję błąd. – Nathan

0

Nie zrobiłem zbyt wiele z OnPaint ... Wszystko, co pokazano, dotyczy Prostokątów. Czy obracasz prostokąt lub strunę? Jeśli jest to prostokąt, nie powinien być .DrawRectangle zamiast .DrawString?

0

Jeśli ktoś ma ten sam błąd, dowiedziałem się, że wykonanie transformacji w "osobnych krokach" rozwiązuje problem.

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(); 
      } 
Powiązane problemy