Отображение текста DrawString отличается от RichTextBox - C#
Формулировка задачи:
Привет всем.
Вступление
Пишу контрол на подобие грида.
Контрол содержит ряд ячеек. Активная ячейка отображается в RichTextBox, остальные ячейки рисуются при помощи DrawString. Дополнительное условие, фон должен быть моноширинным. (каждый символ имеет одинаковую длину).
Проблема
Возьмем моноширинный шрифт Curier New, 10.
RichTextBox.Text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
ниже прям под ним нарисуем туже строку при помощи DrawString;
Оказывается длинна строки RichTextBox визуально отличается от длинны DrawString.
При некоторых размерах шрифта длинна строк одинаковая, причем на разных компьютерах по разному.
Вопрос:
Как сделать длину строк одинаковой, все зависимости от высоты моноширинного шрифта?
p.s. Ниже пример вывода (количество букв 'а' одинаково, а выглядит по разному )
Ломаю голову не первый день уже...
Font font = new Font("Courier New", 10); //для того чтобы рисовать моноширинным шрифтом. StringFormat stringFormat = System.Drawing.StringFormat.GenericTypographic; stringFormat.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces; //tb - (RichTextBox, границы отключены). tb.Font = font; tb.Text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //Рисуем прям под ним e.Graphics.DrawString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", font, Brushes.Black, 0, tb.Bounds.Height, stringFormat);
Решение задачи: «Отображение текста DrawString отличается от RichTextBox»
textual
Листинг программы
[DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern int DrawText(IntPtr hdc, string lpStr, int nCount, ref Rect lpRect, int wFormat); [DllImport("Gdi32.dll")] private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj); private struct Rect { public int Left, Top, Right, Bottom; public Rect(Rectangle r) { this.Left = r.Left; this.Top = r.Top; this.Bottom = r.Bottom; this.Right = r.Right; } } private const int DT_SINGLELINE = 0x00000020; { Font font = new Font("Courier New", 10); IntPtr hfnt = font.ToHfont(); IntPtr hdc = e.Graphics.GetHdc(); SelectObject(hdc, hfnt); SizeF text_len = e.Graphics.MeasureString(l_text, Font, 0, stringFormat); Rect bounds = new Rect(new Rectangle(0, 0, text_len.Width, text_len.Height)); string draw_text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; int flags = DT_SINGLELINE; DrawText(hdc, draw_text, draw_text.Length, ref bounds, flags); e.Graphics.ReleaseHdc(hdc); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д