C#参数无效错误

时间:2009-11-10 14:52:07

标签: c# exception

关闭打印预览窗口或移动打印预览窗口时,我在以下代码中出现错误。我似乎无法理解为什么会这样。它发生在g.DrawString()行上。据我所知,没有任何事情被处理掉。

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

错误的第一部分:

   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)

任何帮助都将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:20)

我不久前遇到了同样的错误。原因是其中一个物体已被处理......

也许字体被放置在其他地方,或者图形对象本身。我不认为刷子会引起问题,因为它是方法的本地,我们发现它没有被处理掉。

修改

要知道图形对象是否处理起来很容易:它的所有属性都会抛出异常。但是对于字体来说并不容易,因为所有属性仍然有用。我发现检查字体是否被处理的一种方法是尝试克隆它(您可以在Watch窗口中添加font.Clone()来测试它)。如果克隆工作,则不处理该字体。否则会引发异常。

答案 1 :(得分:1)

您是否需要明确地将x / y坐标设为浮点数(即0.0f而不是0)?我希望编译错误,而不是运行时错误,所以可能不会。

答案 2 :(得分:0)

我没有用OnPaint做过那么多......你展示的一切都是关于矩形的。你在旋转一个矩形还是一个字符串?如果它是一个矩形不应该是.DrawRectangle而不是.DrawString?

答案 3 :(得分:0)

如果有人有同样的错误,我发现在&#34;单独的步骤&#34;中执行转换。解决了这个问题。

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