Отображение текста 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);
}