49530 (Вывод текста)

2016-07-30СтудИзба

Описание файла

Документ из архива "Вывод текста", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "49530"

Текст из документа "49530"

Вывод текста

Основы вывода текста

Одно из самых больших преимуществ 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. Позже мы будем возвращаться к отдельным полям этой структуры.

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

Несколько сложнее получается с определением ширины символа и длины строки. Это связано с тем, что Windows может применять как шрифты с фиксированной шириной символа (fixed pitch), так и пропорциональные (variable pitch) шрифты. Поэтому в той информации, которую Вы можете получить о шрифте, используются два параметра: максимальная ширина символа tmMaxCharWidth и средняя ширина символа tmAveCharWidth.

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

На практике используют функции, которые позволяет определить точные размеры строки как в высоту, так и в ширину:

DWORD GetTextExtent( hDC, lpsString, wLength );

BOOL GetTextExtentPoint( hDC, lpsString, wLength, lpSize );

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

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

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

BOOL GetCharWidth( hDC, uFirstChar, uLastChar, lpnWidths );

BOOL GetCharABCWidth( hDC, uFirstChar, uLastChar, lpABC );

Функция GetCharWidth() определяет ширину каждого символа, входящего в интервал от uFirstChar до uLastChar и размещает результаты в массиве целых чисел, указанном параметром lpnWidths.

Функция GetCharABCWidth() возвращает более подробную информацию о ширине каждого символа, которая используется только TrueType шрифтами.

Результаты размещаются в массиве структур типа ABC, смысл полей поясним рисунком:

В-третьих, при выводе текста с помощью функции 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 );

Однако эта функция не имеет параметра nTabOrigin, поэтому ее результат может отличаться от результата функции TabbedTextOut(...).

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

BOOL ExtTextOut( hDC, nXStart, nYStart, fuOption, lpRect, lpsString, wLength, lpnDx );

Параметры hDC, nXStart, nYStart, lpsString и wLength используются также, как и в функции TextOut(). Два дополнительных параметра fuOption и lpRect задают прямоугольник, в котором осуществляется вывод текста и метод использования этого прямоугольника.

Если fuOption равно ETO_OPAQUE, то указанный прямоугольник закрашивается текущим цветом фона; если fuOption равно ETO_CLIPPED, то прямоугольник ограничивает область вывода текста. Оба параметра fuOption и lpRect могут быть 0, тогда такой прямоугольник не используется.

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

Функция

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

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

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

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

DT_CENTER

DT_LEFT

DT_RIGHT

задают режим выравнивания текста по горизонтали.

DT_SINGLELINE

указывает, что текст должен размещаться в одной строке

DT_VCENTER

DT_TOP

DT_BOTTOM

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

DT_WORDBREAK

разрешает переносить (разбивать) слова.

DT_EXPANDTABS

разрешает распознавать символы табуляции. По умолчанию используются табулятор на каждой 8 позиции.

DT_TABSTOP

задает шаг табуляции. Старший байт содержит число символов в одном шаге табулятора.

Все описанные ниже флаги несовместимы с флагом DT_TABSTOP:

DT_EXTERNALLEADING

включает в высоту строки пропуск между строк. По умолчанию этого не делается.

DT_NOCLIP

выполняет вывод игнорируя указанный прямоугольник. Это иногда ускоряет процесс вывода.

DT_NOPREFIX

исключает обработку префикса & как подчеркивание текущего символа. По умолчанию префикс & обозначает подчеркнутый символ, последовательность && - одиночный &.

DT_CALCRECT

только вычисляет размер прямоугольника и не осуществляет вывода. Если используется DT_SINGLELINE, то определяется ширина прямоугольника, а если текст многострочный, то вычисляется высота, достаточная для размещения заданного текста при фиксированной ширине.

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

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

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5160
Авторов
на СтудИзбе
439
Средний доход
с одного платного файла
Обучение Подробнее