2009-11-10 46 views
8

Recibo un error en el siguiente código cuando cierro la ventana de vista previa de impresión o muevo la ventana de vista previa de impresión. Parece que no puedo entender por qué sucede esto. Sucede en la línea g.DrawString(). Por lo que puedo decir, tampoco se ha descartado nada.C# El parámetro no es válido Error

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

Primera parte del error:

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) 

se agradecería cualquier ayuda.

Gracias.

+0

¿Cuál es la excepción? – jason

+0

System.ArgumentException {"El parámetro no es válido."} – Nathan

+0

¿Qué hay en 'Texto'? –

Respuesta

20

Encontré el mismo error no hace mucho tiempo. La razón era que uno de los objetos ya estaba dispuesto ...

Tal vez la fuente se está desechando en otro lugar, o el objeto gráfico en sí. No creo que el cepillo cause problemas porque es local al método y vemos que no está dispuesto.

Editar:

saber si o no un objeto gráfico está dispuesto es fácil: todas sus propiedades lanzan una excepción. Sin embargo, no es tan fácil para una fuente, porque todas las propiedades siguen funcionando. Una forma que encontré para verificar si la fuente está dispuesta o no es tratar de clonarla (puede agregar font.Clone() en la ventana Inspección para probarla). Si el clon funciona, la fuente no está eliminada. De lo contrario arrojará una excepción.

+0

No veo nada como desechado sin embargo. Es simplemente confuso porque todo lo que dibujo para Print Preview se está extrayendo de su propia clase, así que no entiendo por qué está tocando el formulario. – Nathan

+1

Revise mi edición, una fuente eliminada todavía muestra todas sus propiedades como si no estuviera dispuesta. –

+0

Lo he estrechado ahora arrojando la excepción en este. Font.GetHeight(). ¿Algunas ideas? – Nathan

1

¿Necesita explícitamente que sus coordenadas x/y sean flotantes (es decir, 0.0f en lugar de 0)? Me esperaba un error de compilación de eso, no un error de tiempo de ejecución, por lo que probablemente no.

+0

Cambié eso a lo que sugirió y sigo recibiendo el error. – Nathan

0

No he hecho tanto con OnPaint ... Todo lo que muestra es acerca de Rectangles. ¿Estás rotando un rectángulo o una cuerda? Si es un rectángulo, ¿no debería ser .DrawRectangle en lugar de .DrawString?

0

En caso de que alguien tenga el mismo error, descubrí que realizar las transformaciones en "pasos separados" resuelve el problema.

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(); 
      } 
Cuestiones relacionadas