netlib.narod.ru | < Назад | Оглавление | Далее > |
Еще один способ центрирования текста — более общий метод позиционирования текста — не требует класса StringFormat, но вместо этого использует метод класса Graphics — MeasureString. У него семь версий, вызов самой простой из которых выглядит так:
SizeF sizefText = grfx.MeasureString(str, font);
MeasureString возвращает структуру SizeF, показывающую ширину и высоту строки в пикселах (как вы узнаете в главе 7, можно получить размер и в других единицах измерения). MeasureString — несомненно, второй по важности метод, используемый при отображении текста, — не настолько важный, как DrawString, но без него тоже не обойтись. Я расскажу подробнее о MeasureString в главе 9.
Представьте себе отображенную текстовую строку, потом — прямоугольник, нарисованный вокруг этого текста. Структура SizeF, возвращаемая MeasureString, содержит ширину и высоту этого прямоугольника. Для данного шрифта независимо от строки символов свойство Height структуры SizeF всегда одно и то же. (На самом деле свойство Height обычно не зависит от строки символов. Если строка содержит символы перевода строки, Height является высотой нескольких строк и, следовательно, получается суммированием свойств Height отдельных строк.)
Свойство Width структуры SizeF зависит от символов, содержащихся в строке. Для всех шрифтов, кроме моноширинного, ширина строки текста «i» меньше, чем ширина «W», и MeasureString отражает это отличие.
Мы будем широко использовать MeasureString в этой книге. Чтобы центрировать текст в клиентской области, можно вычесть свойства Width и Height структуры SizeF, возвращаемые MeasureString, из ширины и высоты клиентской области. Эти две разности представляют собой общий горизонтальный и вертикальный отступ текста. Разделив каждое значение на 2, получаем положение левого верхнего угла строки. Вот полный код:
HelloCenteredMeasured.cs
//------------------------------------------------------ // HelloCenteredMeasured.cs (C) 2001 by Charles Petzold //------------------------------------------------------ using System; using System.Drawing; using System.Windows.Forms; class HelloCenteredMeasured: Form { public static void Main() { Application.Run(new HelloCenteredMeasured()); } public HelloCenteredMeasured() { Text = "Hello Centered Using MeasureString"; BackColor = SystemColors.Window; ForeColor = SystemColors.WindowText; ResizeRedraw = true; } protected override void OnPaint(PaintEventArgs pea) { Graphics grfx = pea.Graphics; string str = "Hello, world!"; SizeF sizefText = grfx.MeasureString(str, Font); grfx.DrawString(str, Font, new SolidBrush(ForeColor), (ClientSize.Width - sizefText.Width) / 2, (ClientSize.Height - sizefText.Height) / 2); } }
netlib.narod.ru | < Назад | Оглавление | Далее > |