Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 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 |


