tags:

views:

229

answers:

4

I keep getting an error in the following code when I close the print preview window or move the print preview window. I can't seem to understand why this is happening. It happens on the g.DrawString() line. As far as I can tell nothing has been disposed of either.

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

First part of the 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)

Any help would be appreciated.

Thanks.

+1  A: 

Do you need to explicitly have your x/y coordinates be float (i.e. 0.0f instead of 0)? I would expect a compile error from that, not a runtime error so probably not.

Brian Schroth
I switched that over to what you suggested and I am still getting the error.
Nathan
A: 

This may help you.

http://blog.lavablast.com/post/2007/11/The-Mysterious-Parameter-Is-Not-Valid-Exception.aspx

Scott
I've look this already but thanks for the suggestion.
Nathan
A: 

I encountered the same error not long ago. The reason was that one of the objects was already disposed...

Maybe the font is being disposed somewhere else, or the graphics object itself. I don't think the brush would cause problems though because it's local to the method and we see that it's not disposed.

Edit:

To know whether or not a graphics object is disposed is easy: all of it's properties throw an exception. It's not as easy for a font though, because all properties still work. One way that I found to check whether the font is disposed or not is to try to clone it (you can add font.Clone() in the Watch window to test it). If the clone works, the the font is not disposed. Otherwise it will throw an exception.

Meta-Knight
I don't see anything as disposed though. It is just confusing because everything I draw to Print Preview is being drawn from it's own class so I don't understand why it is even touching the form is doing.
Nathan
Check my edit, a disposed font still displays all of it's properties as if it's not disposed.
Meta-Knight
I have narrowed it now to it throwing the exception at this.Font.GetHeight(). Any ideas?
Nathan
Just ran a quick test and Font.GetHeight throws an exception when the font is disposed. So that's the problem. The font is being disposed after it has been drawn for the first time, so on the second pass, it fails. Check all references to the form's Font property and make sure it doesn't get disposed.
Meta-Knight
A: 

I haven't had done that much with OnPaint... Everything you show is about Rectangles. Are you rotating a rectangle or a string? If it is a rectangle shouldn't it be .DrawRectangle instead of .DrawString?

Kevin