Docsity
Docsity

Подготовься к экзаменам
Подготовься к экзаменам

Учись благодаря многочисленным ресурсам, которые есть на Docsity


Получи баллы для скачивания
Получи баллы для скачивания

Заработай баллы, помогая другим студентам, или приобретай их по тарифом Премиум


Руководства и советы
Руководства и советы

Вывод текста учебное пособие по информатике , Руководство, Проектов, Исследование из Информатика

Вывод текста учебное пособие по информатике

Вид: Руководство, Проектов, Исследование

2016/2017

Загружен 12.04.2017

refbank20586
refbank20586 🇷🇺

9 документы

1 / 21

Toggle sidebar

Сопутствующие документы


Частичный предварительный просмотр текста

Скачай Вывод текста учебное пособие по информатике и еще Руководство, Проектов, Исследование в формате PDF Информатика только на Docsity! Вывод текста Основы вывода текста Одно из самых больших преимуществ Windows заключается в достаточно легком использовании большого количества разнообразных высококачественных шрифтов. На этой лекции мы должны будем познакомиться с основными правилами вывода текста и применения шрифтов. Сначала мы будем разбираться с основными средствами вывода текста. С одной из функций, осуществляющих вывод мы уже встречались: BOOL TextOut( hDC, nXStart, nYStart, lpsString, wLength ); Эта функция осуществляет вывод строки текста, заданной параметром lpsString, длиной wLength символов, начиная с указанной позиции (nXStart, nYStart) на заданном контексте устройства hDC. Это самая простая функция, осуществляющая вывод текста в Windows. Однако результат ее применения определяется многими дополнительными параметрами. Во-первых, цвет выведенного текста задается тремя разными атрибутами контекста устройства: текущим цветом текста, текущим цветом фона и режимом заполнения фона. Ранее мы уже рассматривали эти атрибуты и способы их изменения. Для манипуляций с этими атрибутами предназначены функции: COLORREF SetTextColor( hDC, crColor ); COLORREF GetTextColor( hDC ); COLORREF SetBkColor( hDC, crColor ); COLORREF GetBkColor( hDC ); int SetBkMode( hDC, nMode ); int GetBkMode( hDC ); Для задания цвета символов используется функция SetTextColor(), которая устанавливает в качестве цвета символов ближайший чистый цвет, доступный на устройстве. Для задания цвета фона используются два другие атрибута контекста устройства. Если установлен режим заполнения фона OPAQUE (используется по умолчанию), то для заполнения фона под текстом используется текущий цвет фона, который может и не совпадать с фоном окна, который закрашивается кистью. В тех случаях, когда фон под текстом не надо изменять, используется режим TRANSPARENT (при этом атрибут “цвет фона” игнорируется). Во-вторых, при выводе текста задается его начальная позиция. Определение и использование этой начальной позиции не так-то и просто. Для того, что бы разобраться с этим, нам придется ввести несколько новых терминов, использующихся для определения размера символов и строк. Символ может размещаться в своей ячейке на некотором расстоянии от всех четырех границ. Для того, что бы можно было определить точные характеристики символов, предназначена специальная функция: BOOL GetTextMetrics( hDC, lpTEXTMETRIC ); Эта функция заполняет структуру TEXTMETRIC информацией о текущем применяемом шрифте. Сейчас мы рассмотрим только некоторые поля этой структуры, которые определяют размеры символов. Для этого мы приведем изображение символов, на котором будут проставлены размеры так, как они называются в структуре TEXTMETRIC. Позже мы будем возвращаться к отдельным полям этой структуры. В-третьих, при выводе текста с помощью функции TextOut() (или ExtTextOut()), используется еще один атрибут GDI, который называется “режим выравнивания текста”. Он устанавливается и проверяется с помощью функций: UINT SetTextAlign( hDC, nAlign ); UINT GetTextAlign( hDC ); Этот атрибут указывает, как надо располагать строку текста относительно указанной начальной точки. Обычно указанная точка задает положение верхнего левого угла строки. Однако с помощью функции SetTextAlign() вы можете установить и иной режим выравнивания. Параметр nAlign указывает положение какой точки задается: по горизонтали по вертикали TA_LEFT (по умолчанию) TA_TOP (по умолчанию) TA_CENTER TA_BASELINE TA_RIGHT TA_BOTTOM В некоторых случаях с помощью режима выравнивания можно обойтись без вычисления ширины строки самим, а переложить эту работу на Windows. Для этого существует дополнительные режимы выравнивания TA_UPDATECP и TA_NOUPDATECP (по умолчанию). Если используется режим TA_UPDATECP, то координаты, указывающие положение точки вывода текста игнорируются, а вместо них используется атрибут контекста устройства “положение текущей точки”. После операции вывода эта текущая точка перемещается на правую границу выведенного текста. Для начальной установки текущей точки в нужную позицию (или при переходе со строки на строку) Вы можете воспользоваться функцией: DWORD MoveTo( hDC, nX, nY ); В-четвертых, на вывод текста влияют атрибуты контекста устройства, выравнивающие длины строк. Для этого GDI содержит две функции, изменяющие интервалы между словами и символами. Первая функция int SetTextCharacterExtra( hDC, nExtraSpace ); устанавливает интервал между двумя соседними символами. С ее помощью легко можно “разрядить” строку или слово так, что бы ее длина оказалась равна требуемой величине. Вторая функция используется для задания ширины символов, используемых для разделения слов в строке. Каждый шрифт содержит символ, который называется “символ–разделитель” (Break Char). Какой символ является разделителем, можно определить по значению поля .tmBreakChar структуры TEXTMETRIC, так как для разных шрифтов могут быть установлены разные символы–разделители. Обычно это пробел. int SetTextJustification( hDC, nExtraSpace, cBreakChars ); Эта функция изменяет ширину символа–разделителя таким образом, что бы cBreakChars, встреченных в строке, увеличили ее ширину на nExtraSpace единиц. Дополнительные функции для вывода текста Рассмотренная функция TextOut() является простейшей. У нее много ограничений. Например, она не распознает управляющих символов в строке типа табуляции, перевода строки и возврата каретки. В некоторых случаях возможно применение иных функций, осуществляющих вывод текста. Если строка текста содержит символы табуляции, то Вы должны вместо функции TextOut() использовать функцию: LONG TabbedTextOut( hDC, nXStart, nYStart, lpsString, wLength, cTabStops, lpnTabPositions, nTabOrigin); Первые 5 параметров этой функции используются так же, как и в функции TextOut(), а три дополнительных применяются таким образом: Параметр lpnTabPositions содержит массив x–координат точек, в которых происходит остановка табулятора. Он должен быть упорядочен в возрастающем порядке. Параметр cTabStops задает число таких точек. Есть две особенности в применении этих параметров: если оба они равны 0, то табулятор будет останавливаться через каждых 8 средних ширин символов. если массив содержит только одно число N (и cTabStops равно 1), то табулятор будет останавливаться через каждые N единиц. Параметр nTabOrigin указывает x–координату, начиная от которой отсчитываются положения табулятора. Функция возвращает размер выведенной строки. С введением этой функции пришлось ввести еще одну функцию, которая определяет размеры строки, содержащей символы табуляции: DWORD GetTabbedTextExtent( hDC, lpsString, wLength, cTabStops, lpnTabPositions ); градаций серого цвета (например, монохроматические мониторы). В этом случае используется вывод линии не чистым цветом, а смешанным. Так как 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 часть точки (1/1440 дюйма). Эта система активно применяется при работе с принтером. Однако при работе с экраном эта система становиться менее удобной, так как удобнее было бы применять логический дюйм вместо физического. Для этого нам придется самим спроектировать требуемую систему координат: // установим систему координат с несбалансированными // масштабными коэффициентами по осям SetMapMode( hDC, MM_ANISOTROPIC ); // в одном логическом дюйме должно быть, как и в обычном, 1440 точек // поэтому 1440 логическим единицам SetWindowExt( hDC, 1440, 1440 ); // должно соответствовать столько физических ед., сколько // их находится в одном логическом дюйме. SetViewportExt( hDC, GetDeviceCaps( hDC, LOGPIXELSX ), GetDeviceCaps( hDC, LOGPIXELSY ) ); Такую систему координат удобно применять в системах, реализующих WYSIWYG технологию. Одним из важнейших признаков является тип шрифта, который определяет возможности его применения на различных устройствах. В Windows шрифты делятся на три группы, в зависимости от их организации: Поясним основные различия шрифтов: Растровые шрифты: Представляют из себя набор битовых образов отображаемых символов. TrueType шрифты отличаются от остальных шрифтов еще и тем, что позволяют использовать различные интервалы между разными символами. При этом выделяют пары символов (kerning pairs) и для них задают относительное смещение (приближение или удаление), для получения наиболее качественного текста. Задание “кернинга” осуществляется разработчиком шрифта. Другой важнейший признак классификации шрифтов связан с расположением символов в кодовой таблице. К сожалению, разработчики Windows не предусмотрели серьезной поддержки многоязычных сред. Считается, что шрифт может относиться к одной из четырех возможных групп шрифтов. При этом под ANSI подразумевается та кодовая таблица, которая принята в данной версии Windows. Строго говоря, ANSI существует только лишь в англоязычном варианте Windows. Так, например, все русификаторы заменяют стандартную кодовую таблицу ANSI на собственную, содержащую русские буквы. При этом, с точки зрения Windows, она будет все равно считаться ANSI. В русифицированном варианте кодовой таблицы Windows русские буквы занимают места с 192 по 255 включительно. Аналогично, под OEM подразумевается кодовая таблица, принятая в DOS. Обычно это 437 кодовая таблица, однако возможно применение и других кодовых таблиц. Как правило, для русификации DOS применяется альтернативная кодировка ГОСТ, на основе которой была разработана 866 кодовая таблица (входила в состав MS DOS 4.0 распространяемом на территории СССР). Кодовая таблица SYMBOL в Windows обозначает шрифт, состоящий из разных не–алфавитных символов, например стрелок, пиктограммок и пр. и последняя кодовая таблица SHIFTJIS имеет очень специфичное применение, рассчитанное на японскую азбуку KANJI. В этой азбуке предусмотрены некоторые символы, задаваемые последовательностью из двух байт.
Docsity logo