Как нарисовать строку в расширенном формате на winform? - PullRequest
2 голосов
/ 22 марта 2011

Мне нужно написать строку текста в расширенном формате в форме Windows.Как мне этого добиться?

Ответы [ 5 ]

5 голосов
/ 22 марта 2011

Если не форматированное текстовое поле, то вам нужно нарисовать текст, используя GDI +. Проверьте, помогает ли .

2 голосов
/ 22 марта 2011

Вы должны разбить строку на «куски» с одинаковым форматированием и нарисовать каждый «кусок».

Используйте Graphics.MeasureString для вычисления позиций и Graphics.DrawString для окончательного рисования.

Простой пример кода (не решает перенос слов, изображений и т. Д.):

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();

        this.Paint += new PaintEventHandler(Form1_Paint);
        this.SizeChanged += new EventHandler(Form1_SizeChanged);
    }

    void Form1_SizeChanged(object sender, EventArgs e) {
        this.Invalidate();
    }

    public class RichText {
        public Font Font { get; set; }
        public Color? TextColor { get; set; }
        public string Text { get; set; }

        public RichText() { }
        public RichText(string text) {
            this.Text = text;
        }
        public RichText(string text, Font font) : this(text) {
            this.Font = font;
        }
        public RichText(string text, Color textColor) : this(text) {
            this.TextColor = textColor;
        }
        public RichText(string text, Color textColor, Font font) : this(text, textColor) {
            this.Font = font;
        }
    }
    void Form1_Paint(object sender, PaintEventArgs e) {
        var arial_8 = new Font("Arial", 8);
        var webdings_10 = new Font("Webdings", 10);

        var richTexts = new RichText[]{
            new RichText("Default text.")
            , new RichText("Default green text.", Color.Green)
            , new RichText("Regular arial 8.", arial_8)
            , new RichText("Bold arial 8.", new Font(arial_8, FontStyle.Bold))
            , new RichText("Regular webdings 10.", webdings_10)
            , new RichText("Regular blue webdings 10.", Color.Blue, webdings_10)
        };

        var g = e.Graphics;

        Point textPosition = new Point(0, 0);
        int maxWidth = this.ClientSize.Width;
        foreach (var richText in richTexts) {
            var text = richText.Text;
            if (string.IsNullOrEmpty(text)) { continue; }

            var font = richText.Font ?? Control.DefaultFont;
            var textColor = richText.TextColor ?? Control.DefaultForeColor;

            using (var brush = new SolidBrush(textColor)) {
                var rslt_Measure = g.MeasureString(text, font);
                if (rslt_Measure.Width + textPosition.X > maxWidth) {
                    // this code does not solve word-wraping
                    var rslt_Line = g.MeasureString("\r\n", font);
                    Point tmpTextPosition = new Point(0, textPosition.Y + (int)rslt_Line.Height);

                    g.DrawString(text, font, brush, tmpTextPosition);
                    var newPosition = tmpTextPosition;
                    newPosition.X += (int)rslt_Measure.Width;
                    textPosition = newPosition;
                }
                else {
                    g.DrawString(text, font, brush, textPosition);
                    var newPosition = textPosition;
                    newPosition.X += (int)rslt_Measure.Width;
                    textPosition = newPosition;
                }
            }
        }
    }
}

EDIT:

Если вы хотите обработать RTF, возможно, эти ссылки будут полезны:

1 голос
/ 03 июня 2011

В дополнение к коду TcKs следующий сегмент решит функциональность переноса слов:

        private void pictureBox2_Paint(object sender, PaintEventArgs e)
    {
        var arial_8 = new Font("Arial", 8);
        var webdings_10 = new Font("Webdings", 10);

        var richTexts = new RichText[] {
        new RichText("Default text and this is the lengthy string to check the display. One more line to verify again")
        , new RichText("Default green text. this is the lengthy string to check the display. One more line to verify again", Color.Green)
        , new RichText("Regular arial 8.", arial_8)
        , new RichText("Bold arial 8.", new Font(arial_8, FontStyle.Bold))
        };

        var g = e.Graphics;

        Point textPosition = new Point(0, 0);
        int maxWidth = this.pictureBox2.ClientSize.Width;
        foreach (var richText in richTexts)
        {
            var text = richText.Text;
            if (string.IsNullOrEmpty(text)) { continue; }

            var font = richText.Font ?? Control.DefaultFont;
            var textColor = richText.TextColor ?? Control.DefaultForeColor;

            using (var brush = new SolidBrush(textColor))
            {
                string[] strs = text.Split(new string[] { " " }, StringSplitOptions.None);
                int fontheight = (int)g.MeasureString("\r\n", font).Height;
                foreach (string val in strs)
                {
                    var measure = g.MeasureString(val, font);
                    if (measure.Width + textPosition.X > maxWidth)
                    {
                        var newPosition = textPosition;
                        newPosition.X = 0;
                        newPosition.Y = textPosition.Y + fontheight;
                        textPosition = newPosition;
                    }

                    g.DrawString(val, font, brush, textPosition);

                    var nextposition = textPosition;
                    nextposition.X = textPosition.X + (int)measure.Width;
                    textPosition = nextposition;

                }
            }
        }
    }
1 голос
/ 22 марта 2011

Будет ли элемент управления RichTextBox работать только для чтения, что вам нужно?

0 голосов
/ 22 марта 2011

Как оказалось, нет никакого стандартного способа рисовать RTF-строку в графическом контексте.Поэтому у меня есть два способа действовать:

  1. Разобрать строку rtf вручную.Разделите его на куски и опирайтесь на графический контекст, как показано в ответе TcKs
  2. Второй способ - это своего рода обходной путь, но он полностью готов к использованию.Посмотрите на эту ссылку или на эту

Спасибо всем за помощь!

...