Поделиться через


Форматирование текста (GDI+)

Чтобы применить к тексту специальное форматирование, инициализируйте объект StringFormat и передайте его адрес методу DrawString класса Graphics .

Чтобы нарисовать отформатированный текст в прямоугольнике, вам потребуются объекты Graphics, FontFamily, Font, RectF, StringFormat и Brush .

Выравнивание текста

В следующем примере текст рисуется в прямоугольнике. Каждая строка текста находится по центру (боковая сторона), а весь блок текста находится по центру (сверху вниз) в прямоугольнике.

WCHAR string[] = 
   L"Use StringFormat and RectF objects to center text in a rectangle.";
                       
FontFamily   fontFamily(L"Arial");
Font         font(&fontFamily, 12, FontStyleBold, UnitPoint);
RectF        rectF(30.0f, 10.0f, 120.0f, 140.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));

// Center-justify each line of text.
stringFormat.SetAlignment(StringAlignmentCenter);

// Center the block of text (top to bottom) in the rectangle.
stringFormat.SetLineAlignment(StringAlignmentCenter);

graphics.DrawString(string, -1, &font, rectF, &stringFormat, &solidBrush);

Pen pen(Color(255, 0, 0, 0));
graphics.DrawRectangle(&pen, rectF);
            

На следующем рисунке показан прямоугольник и текст по центру.

Снимок экрана: окно, содержащее прямоугольник, содержащий шесть строк текста, по центру по горизонтали

Предыдущий код вызывает два метода объекта StringFormat : StringFormat::SetAlignment и StringFormat::SetLineAlignment. Вызов StringFormat::SetAlignment указывает, что каждая строка текста находится по центру в прямоугольнике, заданном третьим аргументом, переданным методу DrawString . Вызов StringFormat::SetLineAlignment указывает, что блок текста находится по центру (сверху вниз) в прямоугольнике.

Значение StringAlignmentCenter является элементом перечисления StringAlignment , объявленного в Gdiplusenums.h.

Установка стоп-вкладок

Вы можете задать позиции табуляции для текста, вызвав метод StringFormat::SetTabStops объекта StringFormat , а затем передав адрес этого объекта StringFormat методу DrawString класса Graphics .

В следующем примере позиции табуляции устанавливаются в точки 150, 250 и 350. Затем в коде отображается список имен и результатов тестирования с вкладками.

WCHAR string[150] = 
   L"Name\tTest 1\tTest 2\tTest 3\n";

StringCchCatW(string, 150, L"Joe\t95\t88\t91\n");
StringCchCatW(string, 150, L"Mary\t98\t84\t90\n");
StringCchCatW(string, 150, L"Sam\t42\t76\t98\n");
StringCchCatW(string, 150, L"Jane\t65\t73\t92\n");
                       
FontFamily   fontFamily(L"Courier New");
Font         font(&fontFamily, 12, FontStyleRegular, UnitPoint);
RectF        rectF(10.0f, 10.0f, 450.0f, 100.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));
REAL         tabs[] = {150.0f, 100.0f, 100.0f};

stringFormat.SetTabStops(0.0f, 3, tabs);

graphics.DrawString(string, -1, &font, rectF, &stringFormat, &solidBrush);

Pen pen(Color(255, 0, 0, 0));
graphics.DrawRectangle(&pen, rectF);
            

На следующем рисунке показан текст с вкладками.

иллюстрация прямоугольника, содержащего четыре столбца текста; каждый столбец имеет левое выравнивание

Приведенный выше код передает три аргумента в метод StringFormat::SetTabStops . Третий аргумент — это адрес массива, содержащего смещения табуляции. Второй аргумент указывает, что в этом массиве есть три смещения. Первый аргумент, передаваемый в StringFormat::SetTabStops , равен 0, что указывает, что первое смещение в массиве измеряется с позиции 0, левой границы ограничивающего прямоугольника.

Рисование вертикального текста

Объект StringFormat можно использовать, чтобы указать, что текст будет нарисован по вертикали, а не по горизонтали.

В следующем примере значение StringFormatFlagsDirectionVertical передается методу StringFormat::SetFormatFlags объекта StringFormat . Адрес этого объекта StringFormat передается методу DrawString класса Graphics . Значение StringFormatFlagsDirectionVertical является элементом перечисления StringFormatFlags , объявленного в Gdiplusenums.h.

WCHAR string[] = L"Vertical text";
                     
FontFamily   fontFamily(L"Lucida Console");
Font         font(&fontFamily, 14, FontStyleRegular, UnitPoint);
PointF       pointF(40.0f, 10.0f);
StringFormat stringFormat;
SolidBrush   solidBrush(Color(255, 0, 0, 255));

stringFormat.SetFormatFlags(StringFormatFlagsDirectionVertical);

graphics.DrawString(string, -1, &font, pointF, &stringFormat, &solidBrush);
            

На следующем рисунке показан вертикальный текст.

Иллюстрация, показывающая окно с текстом, повернутым на 90 градусов по часовой стрелке