Отображение текста DrawString отличается от RichTextBox - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем. Вступление Пишу контрол на подобие грида. Контрол содержит ряд ячеек. Активная ячейка отображается в RichTextBox, остальные ячейки рисуются при помощи DrawString. Дополнительное условие, фон должен быть моноширинным. (каждый символ имеет одинаковую длину). Проблема Возьмем моноширинный шрифт Curier New, 10. RichTextBox.Text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; ниже прям под ним нарисуем туже строку при помощи DrawString; Оказывается длинна строки RichTextBox визуально отличается от длинны DrawString.
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);
При некоторых размерах шрифта длинна строк одинаковая, причем на разных компьютерах по разному. Вопрос: Как сделать длину строк одинаковой, все зависимости от высоты моноширинного шрифта? p.s. Ниже пример вывода (количество букв 'а' одинаково, а выглядит по разному ) Ломаю голову не первый день уже...

Решение задачи: «Отображение текста 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);
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы