Смекни!
smekni.com

Вывод текста (стр. 2 из 3)

Последний параметр lpnDx указывает на массив целых чисел, который содержит расстояния между каждым символом строки и следующим за ним. Если этот параметр NULL, то используются стандартные промежутки.

Функция

int DrawText( hDC, lpszString, wLength, lpRect, fuFormat );

осуществляет вывод текста в указанный прямоугольник, осуществляя простейшие операции форматирования текста. Первые три параметра этой функции аналогичны таким–же параметрам функции TextOut(), за одним исключением: Вы можете указать длину строки равной -1, тогда Windows будет предполагать, что это asciiz строка (оканчивающаяся нулевым байтом) и сам вычислит ее длину.

Два последних параметра определяют прямоугольник, в который Вы хотите осуществить вывод, и правила размещения текста в этом прямоугольнике.

Параметр fuFormat может содержать следующие флаги:

DT_CENTERDT_LEFTDT_RIGHT задают режим выравнивания текста по горизонтали.
DT_SINGLELINE указывает, что текст должен размещаться в одной строке
DT_VCENTERDT_TOPDT_BOTTOM используются только с DT_SINGLELINE и указывают размещение строки текста по вертикали.
DT_WORDBREAK разрешает переносить (разбивать) слова.
DT_EXPANDTABS разрешает распознавать символы табуляции. По умолчанию используются табулятор на каждой 8 позиции.
DT_TABSTOP задает шаг табуляции. Старший байт содержит число символов в одном шаге табулятора.
Все описанные ниже флаги несовместимы с флагом DT_TABSTOP:
DT_EXTERNALLEADING включает в высоту строки пропуск между строк. По умолчанию этого не делается.
DT_NOCLIP выполняет вывод игнорируя указанный прямоугольник. Это иногда ускоряет процесс вывода.
DT_NOPREFIX исключает обработку префикса & как подчеркивание текущего символа. По умолчанию префикс & обозначает подчеркнутый символ, последовательность && - одиночный &.
DT_CALCRECT только вычисляет размер прямоугольника и не осуществляет вывода. Если используется DT_SINGLELINE, то определяется ширина прямоугольника, а если текст многострочный, то вычисляется высота, достаточная для размещения заданного текста при фиксированной ширине.

Последняя рассматриваемая нами функция для вывода текста используется сравнительно редко. Она часто применяется системой отображения меню для указания недоступных пунктов, закрашиваемых серым цветом. Для этого пришлось разработать отдельную функцию потому, что не все видеоадаптеры и мониторы обеспечивают достаточное число градаций серого цвета (например, монохроматические мониторы). В этом случае используется вывод линии не чистым цветом, а смешанным.

Так как Windows использует в качестве цвета текста только чистый цвет, то пришлось разработать специальную функцию, позволяющую осуществлять вывод смешанным цветом. Основная идея ее работы заключается в следующем:

BOOL GrayString( hDC, hBrush, lpfnDraw, lParam, cChars, nX, nY, nWidth, nHeight );

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

выполняется операция OR между выведенным текстом и кистью, состоящей из черных и белых точек в шахматном порядке (Функция PatBlt(), ROP код равен 0xFA0089 (DPo))

полученный битмап переносится на контекст-приемник изображения с помощью операции BitBlt() с ROP–кодом 0xB8074A (PSDPxax), реализующей следующие действия:

( ( destination ^ pattern ) & source ) ^ pattern

в результате все пикселы контекста–приемника, соответствующие белым пикселам созданного битмапа, остаются неизмененными, а все пикселы, соответствующие черным пикселам битмапа, оказываются закрашены кистью, заданной параметром hBrush в вызове функции GrayString().

Остальные параметры этой функции:

hDC - контекст-приемник изображения;

lpfnDraw - функция, осуществляющая вывод текста в промежуточный контекст устройства. Если этот параметр NULL, то используется TextOut(), иначе Вы должны передать адрес связанной с вашим приложением функции (см. процедуру MakeProcInstance() ), имеющей следующий вид:

BOOL CALLBACK GrayStringProc( hDC, lpParam, cChars ) {

// drawing text

return 1;}

параметры lParam и cChars передаютсяизфункции GrayString(); hDC указываетпромежуточныйконтекстустройства. Вывод надо осуществлять начиная с позиции 0,0;

Функция должна вернуть не 0, если все в порядке. Значение 0 указывает на ошибку и приводит к завершению работы функции GrayString().

lParam - если параметр lpfnDraw равен NULL, то lParam является дальним указателем на выводимую строку символов, иначе это может быть любое значение, используемое функцией GrayStringProc();

cChars - число символов в выводимой строке;

nX и nY - позиция для вывода

nWidth - размеры создаваемого промежуточного битмапа, который будет nHeight - принимать строку.

Некоторые особенности применения функции GrayString():

контекст-приемник изображения должен использовать координаты MM_TEXT

атрибуты контекста–приемника НЕ копируются в промежуточный контекст устройства, он использует значения атрибутов по умолчанию;

если cChars равно 0, то GrayString() предполагает, что lParam является указателем на asciiz строку (оканчивающаяся нулевым байтом) и вычисляет ее длину

если nWidth и nHeight равны 0, то GrayString() будет сам вычислять размеры битмапа для строки, указанной параметрами lParam и cChars

большинство современных адаптеров позволяют отображать достаточное число оттенков серого для вывода серых строк. Вы можете проверить, какой метод надо использовать (GrayString() или TextOut() с серым цветом текста), воспользовавшись функцией

rgbGrayText= GetSysColor( COLOR_GRAYTEXT );

если rgbGrayText равно 0 (черный цвет), то Вы должны использовать функцию GrayString(), иначе Вы можете установить серый цвет и воспользоваться функцией TextOut():

SetTextColor( hDC, rgbGrayText ); ...

Шрифты

После изучения основных средств работы с текстом мы перейдем к изучению шрифтов. Для того, что бы дальнейший материал был более понятным, нам надо разобраться с основами классификации шрифтов в Windows. При рассмотрении данной классификации следует иметь в виду ее условность и неизбежное применение типографических терминов. В настоящее время не существует общепринятой системы классификации шрифтов, более того многие термины трактуются совершенно различным образом в разных системах классификации. (Так, например, italic может обозначать наклонный шрифт, наклонный курсив или узкий шрифт, у которого горизонтальные штрихи толще вертикальных).

Все шрифты в Windows могут быть разделены на две группы:

шрифты устройства

шрифты GDI

Со шрифтами устройств мы разбираться не будем, так как это очень специфичные шрифты и их свойства жестко определены возможностями аппаратуры. Основное внимание мы сосредоточим на шрифтах GDI.

Классификация шрифтов GDI

Для шрифтов GDI может быть выделено несколько классифицирующих признаков, определяющих особенности шрифта.

по наклону символов:

Обычно типы Slanted и Italic между собой не разделяют, как правило применяется термин Italic для обозначения всякого наклонного шрифта.

по ширине отдельных символов:

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

По ширине линии, используемой для отображения символа:

В иных системах классификации эту характеристику иногда заменяют на количественное отношение ширины горизонтальных линий к ширине вертикальных. Такая характеристика называется контрастностью шрифта. Fixed Stroke шрифты имеют контрастность 1:1, нормальная контрастность соответствует 4:5, средний контраст - 1:2 и т.д.

По оформлению символов:

Этот признак тоже может быть представлен более широко, так как оформление засечек чрезвычайно различно - они могут быть перпендикулярны штрихам, соединяться с ними под значительными углами, по-разному сопрягаться с штрихом (со скруглением или без), иметь различную форму.

по “жирности” символов:

Этот критерий называют также “весом” символов, при этом говорят об особо легких, легких, нормальных и пр. шрифтах. Оценивают его по среднему количеству закрашенных (черных) точек в одной строке, длиной 1000 точек. Типичными значениями являются 400 (нормальный шрифт) и 700 или 800 (жирный шрифт) по размеру символов. Размер определяется высотой символа, выраженной в точках. Так, например, говорят о шрифте высотой 12 точек. С точки зрения типографии наиболее применимые шрифты 8-10 точек, шрифты 6 и меньше точек считаются мелкими, 12 и более, крупными.

При отображении на дисплее этими размерами следует пользоваться очень осторожно, так как вертикальное разрешение экрана явно недостаточно для качественного изображения применяемых размеров шрифта (6-10 точек).

По этой причине для дисплеев предусмотрена специальная характеристика, называемая “логический дюйм”. Как правило один логический дюйм соответствует примерно 1.4-1.5 обыкновенного. При использовании логического дюйма вместо нормального изображения всех объектов увеличиваются, что несколько компенсирует низкую разрешающую способность экрана.

Когда мы рассматривали системы координат устройства, то мы отмечали систему MM_TWIPS, в которой одной единице соответствует 1/20 часть точки (1/1440 дюйма). Эта система активно применяется при работе с принтером. Однако при работе с экраном эта система становиться менее удобной, так как удобнее было бы применять логический дюйм вместо физического. Для этого нам придется самим спроектировать требуемую систему координат: