Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

dc. DrawText( "Hello, MFC", -1, &rect,

DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER );

Кроме DrawText, в классе CDC есть еще несколько функций для работы с текстом. Некоторые из них приведены в табл. 5.7. Одна из самых часто используемых – функция TextOut, которая выводит текст подобно DrawText, но принимает в качестве параметров координаты точки начала вывода текста или использует для этого текущую позицию. Оператор:

dc. TextOut( 0, 0, "Hello, MFC" );

выведет строку "Hello, MFC", начиная с левого верхнего угла окна, связанного с контекстом dc. Функция TabbedTextOut при выводе строки заменяет символы табуляции на пробелы (массив позиций табуляции передается в качестве параметра).

По умолчанию, координаты, переданные в TextOut, TabbedTextOut и ExtTextOut, считаются левым верхнем углом описывающего прямоугольника для первого символа строки. Однако интерпретацию координат можно изменить, задав в контексте устройства свойство выравнивания текста. Для этого используется функция CDC::SetTextAlign, например, для выравнивания текста по правой границе:

dc. SetTextAlign( TA_RIGHT );

Чтобы функция TextOut вместо явно указанных координат пользовалась текущей позицией, надо вызвать SetTextAlign с указанием стиля и установленным флагом TA_UPDATECP. Тогда TextOut после вывода каждой строки будет изменять текущую позицию. Так можно вывести несколько строк подряд с сохранением корректного расстояния между ними.

Таблица 5.7. Функции-члены CDC для вывода текста

НЕ нашли? Не то? Что вы ищете?

Функция

Описание

DrawText

Выводит текст с заданным форматированием внутри описывающего прямоугольника

TextOut

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

TabbedTextOut

Выводит символьную строку, содержащую табуляции

ExtTextOut

Выводит символьную строку с возможным заполнением описывающего прямоугольника фоновым цветом или изменением межсимвольного расстояния

GetTextExtent

Вычисляет ширину строки с учетом параметров текущего шрифта

GetTabbedTextExtent

Вычисляет ширину строки с табуляциями с учетом текущего шрифта

GetTextMetrics

Возвращает свойства текущего шрифта (высоту символа, среднюю ширину символа и т. п.)

SetTextAlign

Задает параметры выравнивания для функции TextOut и некоторых других функций вывода

SetTextJustification

Задает дополнительную ширину, необходимую для выравнивания символьной строки

SetTextColor

Задает в контексте устройства цвет вывода текста

SetBkColor

Задает в контексте устройства цвет фона, которым заполняется область между символами при выводе текста

Функции GetTextMetrics и GetTextExtent предназначены для получения свойств текущего шрифта, выбранного в контексте устройства. GetTextMetrics возвращает эти свойства в виде структуры TEXTMETRIC. GetTextExtent (или GetTabbedTextExtent) вычисляет в логических единицах ширину заданной строки с учетом текущего шрифта. Пример использования GetTextExtent – вычисление ширины промежутка между словами, чтобы равномерно распределить текст по заданной ширине. Допустим, надо вывести строку в участке шириной nWidth. Для выравнивания строки по обеим границам можно использовать следующие вызовы:

CString string = "Строка с тремя пробелами ";

CSize size = dc. GetTextExtent( string );

dc. SetTextJustification( nWidth - size. cx, 3 );

dc. TextOut( 0, y, string );

Второй параметр SetTextJustification задает число символов-разделителей в строке. По умолчанию символом-разделителем является пробел. После вызова SetTextJustification, все последующие вызовы TextOut и других текстовых функций будут распределять пространство, заданное первым параметром SetTextJustification', равномерно между всеми символами-разделителями.

2.6 Шрифты GDI и класс CFont

Все текстовые функции-члены CDC пользуются текущим шрифтом, выбранным в контексте устройства. Шрифт – это набор символов определенного размера (высоты) и начертания, у которых есть общие свойства, например, толщина символа (нормальная или жирная). В типографии размер шрифта измеряется в специальных единицах – пунктах. 1 пункт примерно равен 1/72 дюйма. Высота символа шрифта 12 пт равна примерно 1/6 дюйма, но в Windows реальная высота несколько зависит от свойств устройства вывода. Термин "начертание" определяет общий стиль шрифта. Например, Times New Roman и Courier New являются различными начертаниями.

Шрифт – один из типов объектов модуля GDI. В MFC для работы со шрифтами есть класс CFont. Сначала надо создать объект этого класса, а затем с помощью одной из его функций-членов CreateFont, CreateFontIndirect, CreatePointFont или CreatePointFontIndirect создать шрифт в модуле GDI. Функциям CreateFont и CreateFontIndirect можно задавать размер шрифта в пикселах, а CreatePointFont и CreatePointFontIndirect – в пунктах. Например, для создания 12-пунктного экранного шрифта Times New Roman функцией CreatePointFont надо выполнить вызовы (размер задается в 1/10 пункта):

CFont font;

font. CreatePointFont( 120, "Times New Roman" );

Сделать то же самое с помощью CreateFont несколько сложнее, т. к. требуется узнать, сколько в контексте устройства логических единиц приходится на один дюйм по вертикали и затем перевести высоту из пунктов в пикселы:

CClientDC dc(this);

int nHeight = -((dc. GetDeviceCaps(LOGPIXELSY)*12)/72);

CFont font;

font. CreateFont( nHeight, 0, 0, 0, FW_NORMAL, 0, 0, 0,

DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,

DEFAULT_QUALITY, DEFAULT_PITCH ¦ FF_DONTCARE, "Times New Roman" );

Среди множества параметров CreateFont есть толщина, признак курсива и др свойства. Эти же свойства шрифта можно хранить в специальной структуре LOGFONT и передавать ее для создания шрифта в CreatePointFontIndirect, например:

LOGFONT lf;

memset( &lf, 0, sizeof(lf) );

lf. lfHeight = 120;

lf. lfWeight = FW_BOLD;

lf. lfItalic = TRUE;

strcpy( lf. lfFaceName, "Times New Roman" );

CFont font;

font. CreatePointFontIndirect( &lf );

Если вы попытаетесь создать шрифт, не установленный в системе, то GDI попробует подобрать наиболее похожий шрифт из установленных. Хотя внутренний механизм преобразования шрифтов GDI и пытается это сделать, не всегда результаты получаются хорошими. Но, по крайней мере, текст на экран выводиться будет.

2.7 Стандартные объекты GDI

В Windows есть набор предопределенных часто используемых перьев, кистей, шрифтов и других объектов GDI, которые не надо создавать, а можно использовать уже готовые. Они называются стандартными объектами GDI (табл. 5.8). Их можно выбирать в контексте устройства с помощью функции CDC::SelectStockObject или присваивать их существующим объектам CPen, CBrush, и др. с помощью CGdiObject::CreateStockObject. Класс CGdiObject является базовым классом для CPen, CBrush, CFont и других MFC-классов, представляющих объекты GDI.

Таблица 5.8. Часто используемые стандартные объекты GDI

Объект

Описание

NULL_PEN

Пустое (прозрачное) перо

BLACK_PEN

Черное сплошное перо толщиной 1 пиксел

WHITE_PEN

Белое сплошное перо толщиной 1 пиксел

NULL_BRUSH

Пустая (прозрачная) кисть

HOLLOW_BRUSH

То же, что NULL_BRUSH

BLACK_BRUSH

Черная кисть

DKGRAY_BRUSH

Темно-серая кисть

GRAY_BRUSH

Серая кисть

LTGRAY_BRUSH

Светло-серая кисть

WHITE_BRUSH

Белая кисть

ANSI_FIXED_FONT

Моноширинный системный шрифт ANSI

ANSI_VAR_FONT

Пропорциональный системный шрифт ANSI

SYSTEM_FONT

Системный шрифт для пунктов меню, элементов управления и т. п.

SYSTEM_FIXED_FONT

Моноширинный системный шрифт (для совместимости со старыми версиями Windows)

Допустим, требуется нарисовать светло-серый круг без контура. Это можно сделать двумя способами, во-первых:

CPen pen( PS_NULL, 0, (RGB (0, 0, 0)) );

dc. SelectObject( &pen );

CBrush brush( RGB(192, 192, 192) );

dc. SelectObject(&brush);

dc. Ellipse( 0, 0, 100, 100 );

Т. к. прозрачное перо и светло-серая кисть есть среди стандартных объектов GDI, ту же фигуру можно нарисовать так:

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32