Параметр C # неверен - PullRequest
       10

Параметр C # неверен

8 голосов
/ 10 ноября 2009

Я получаю сообщение об ошибке в следующем коде при закрытии окна предварительного просмотра или перемещении окна предварительного просмотра Я не могу понять, почему это происходит. Это происходит в строке 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 ]

20 голосов
/ 10 ноября 2009

Я столкнулся с той же ошибкой не так давно. Причина была в том, что один из объектов уже был уничтожен ...

Возможно, шрифт располагается где-то еще, или сам графический объект. Я не думаю, что кисть вызовет проблемы, потому что она локальна для метода, и мы видим, что она не удаляется.

Edit:

Узнать, расположен ли графический объект, легко: все его свойства выдают исключение. Это не так просто для шрифта, потому что все свойства все еще работают. Один из способов, который я нашел, чтобы проверить, расположен шрифт или нет, это попытаться клонировать его (вы можете добавить font.Clone () в окне Watch, чтобы проверить его). Если клон работает, шрифт не удаляется. В противном случае он выдаст исключение.

1 голос
/ 10 ноября 2009

Вам нужно, чтобы ваши координаты x / y были плавающими (то есть 0.0f вместо 0)? Я ожидал бы ошибки компиляции, а не ошибки времени выполнения, поэтому, вероятно, нет.

0 голосов
/ 14 мая 2015

В случае, если у кого-то есть такая же ошибка, я обнаружил, что выполнение преобразований в «отдельных шагах» решает проблему.

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();
            }
0 голосов
/ 10 ноября 2009

Я не так много сделал с OnPaint ... Все, что вы показываете, касается прямоугольников. Вы вращаете прямоугольник или строку? Если это прямоугольник, не должен ли он быть .DrawRectangle вместо .DrawString?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...