Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Рисование текста на Graphics


Автор: mr.Anderson 19.12.2009, 02:01
Казалось бы, все просто. Пытаюсь нарисовать текст на графиксе и вывести на форму. Код рисования текста такой:
Код

public class Text
{
    ...

    public Bitmap GetBitmap()
    {
        Font font = new Font("Courier New", 9, FontStyle.Regular);
        Bitmap text = new Bitmap((int) font.Size * _text.Length, 25);
        Graphics gp = Graphics.FromImage(text);
        gp.DrawString(_text, font, Brushes.Black, 0, text.Height / 2 - font.Size);
        return text;
    }
}

Ну и, соответственно, вывод на форму:
Код

Graphics gp = pbox.CreateGraphics();
gp.DrawImage(new Text("12345").GetBitmap(), 0, 0);

В результате получаю вот это:
user posted image
Я знаю, что я рисую текст как-то неправильно. Задача такова: создать прямоугольный битмап размером четко таким, чтобы туда вписался текст заданного размера и шрифта, а также, разумеется, заданного содержания. Я не могу понять, как просчитать размер битмапа. То, как он просчитывается сейчас - это топорно, грубо и вообще ни в какие рамки не лезет (чего стоит одно упоминание высоты 25, необязательно она такая, может быть и другой). Плюс, как видно на картинке, цифры почему-то как будто объедены по бокам, неровные и некрасивые. Почему так? Мне нужен нормальный четкий текст.

Автор: NightmareZ 19.12.2009, 04:27
Код

public Bitmap GetBitmap(Graphics gfx)
{
    using (Font font = new Font("Courier New", 9, FontStyle.Regular))
    {
        SizeF bitmapSize = gfx.MeasureString(_text, font);
        Bitmap text = new Bitmap((int)bitmapSize.Width, (int)bitmapSize.Height);
        using (Graphics gp = Graphics.FromImage(text))
            gp.DrawString(_text, font, Brushes.Black, 0, 0);
        return text;
    }
}


Код

using (Graphics gp = CreateGraphics())
    gp.DrawImage(new Text("12345").GetBitmap(gp), 0, 0);


А текст калечно выводится, потому что на прозрачном битмапе рисуешь.
Если его предварительно залить каким-нить непрозрачным цветом
Код

public Bitmap GetBitmap(Graphics gfx)
{
    using (Font font = new Font("Courier New", 9, FontStyle.Regular))
    {
        SizeF bitmapSize = gfx.MeasureString(_text, font);
        Bitmap text = new Bitmap((int)bitmapSize.Width, (int)bitmapSize.Height);
        using (Graphics gp = Graphics.FromImage(text))
        {
            gp.Clear(SystemColors.Control);
            gp.DrawString(_text, font, Brushes.Black, 0, 0);
        }
        return text;
    }
}

то получишь вполне нормальный текст
user posted image

Это фича от Microsoft  smile 

Автор: mr.Anderson 19.12.2009, 18:28
Большое человеческое спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)