18108

Вывод текста в окно приложения

Доклад

Информатика, кибернетика и программирование

Вывод текста в окно приложения. Контекст отображения представляет собой структуру в памяти описывающую окно. В этой структуре находятся характеристики окна используемые для вывода в него текста и графических изображений такие как цвет фона и цвет кисти используемой...

Русский

2013-07-06

73 KB

4 чел.

Вывод текста в окно приложения.

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

Функция TextOut -  используется  для вывода текста. Она имеет пять параметров:

BOOL TextOut(HDC hdc, int nXStart, int nYStart,

       LPCSTR lpszString, int cbString);

Первый параметр (hdc) определяет используемый контекст отображения. При обработке сообщения WM_PAINT контекст отображения создается функцией BeginPaint для того окна, идентификатор которого указывается этой функции в качестве первого параметра.

Второй (nXStart) и третий (nYStart) параметры задают координаты (x, y) начальной позиции, начиная с которой будет выполняться вывод текста.

Четвертый параметр (lpszString) является дальним указателем на выводимую строку, длина которой определяется последним, пятым параметром (cbString).

Функция TextOut не имеет параметров, определяющих шрифт, размер букв, цвет фона, цвет букв и т. п. Все эти характеристики текста хранятся в структуре контекста отображения. Идентификатор контекста отображения передается функции TextOut в качестве первого параметра.

Когда вы создаете контекст отображения, Windows заполняет соответствующую структуру значениями по умолчанию.

Используемая система координат также определяется в контексте отображения. По умолчанию в левом верхнем углу внутренней области окна (client area), ограниченной сверху заголовком, а с других сторон рамкой, находится начало координат - точка с координатами (0,0). Ось x направлена слева направо, ось y - сверху вниз. Изменяя контекст отображения, вы можете выбрать другую систему координат, например расположив начало координат в центре внутренней области окна.

Функция ExtTextOut

Функция ExtTextOut обеспечивает более широкие возможности по сравнению с функцией TextOut и, соответственно, имеет большее количество параметров:

BOOL WINAPI ExtTextOut(HDC hdc,

  int nXStart, int nYStart,

  UINT fuOptions, const RECT FAR* lprc,

  LPCSTR lpszString, UINT cbString, int FAR* lpDx);

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

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

Параметры nXStart и nYStart определяют соответственно X- и Y-координаты начальной позиции вывода текста. Если перед вызовом этой функции вы установили режим обновления текущей позиции (вызвав функцию SetTextAligh с параметром TA_UPDATECP), параметры nXStart и nYStart игнорируются. Текст будет выведен начиная с текущей позиции, которая устанавливается за последним выведенным ранее символом.

Параметр fuOptions позволяет определить тип ограничивающей прямоугольной области, заданной параметром lprc. Этот параметр задается в виде двух флагов, которые можно объединять логической операцией ИЛИ.

Первый флаг имеет имя ETO_CLIPPED. Если указан этот флаг, прямоугольная область, заданная параметром lprc, определяет область ограничения для вывода текста.

Второй флаг имеет имя ETO_OPAQUE. Этот флаг позволяет закрасить прямоугольную область цветом, заданным при помощи функции SetBkColor.

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

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

Длина строки символов задается в байтах параметром cbString.

Параметр lpDx позволяет задать расстояние между отдельными символами. Если этот параметр указан как NULL, при выводе текста расстояние между символами определяется шрифтом, выбранным в контекст отображения. Если же в качестве этого параметра указать дальний адрес массива значений типа int, вы сможете определять индивидуальное расстояние между отдельными символами. Элемент массива с индексом n определяет расстояние между n-м и n+1-м символами строки. Размер массива должен быть равен значению, указанному в параметре cbString.

Функция ExtTextOut при нормальном завершении возвращает ненулевое значение (TRUE). В противном случае возвращается значение FALSE.

Функция TabbedTextOut

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

Приведем прототип функции:

LONG WINAPI TabbedTextOut(HDC hdc,

  int xPosStart, intyPosStart,

  LPCSTR lpszString, int cbString,

  int cTabStops, int FAR* lpnTabPositions, int nTabOrigin);

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

Параметры xPosStart и yPosStart определяют соответственно X- и Y-координаты начальной позиции вывода текста. Если перед вызовом этой функции вы установили режим обновления текущей позиции (вызвав функцию SetTextAligh с параметром TA_UPDATECP), параметры xPosStart и yPosStart игнорируются. Текст будет выведен начиная с текущей позиции, которая устанавливается за последним выведенным ранее символом.

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

Длина строки символов задается в байтах параметром cbString.

Параметр cTabStops определяет количество значений в массиве позиций символов табуляции. Если значение этого параметра равно 1, расстояние между символами табуляции определяется первым элементом массива, адрес которого передается через параметр lpnTabPositions.

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

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

Функция TabbedTextOut возвращает размер (в логических единицах) области, занятой выведенной строкой. Старшее слово возвращаемого значения содержит высоту строки, младшее - ширину строки.

Функция DrawText

Функция DrawText предназначена для форматированного вывода текста в прямоугольную область окна:

int WINAPI DrawText(HDC hdc,

  LPCSTR lpsz, int cb,

  RECT FAR* lprc, UINT fuFormat);

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

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

Длина строки символов задается в байтах параметром cb.

Параметр lprc является дальним указателем на структуру типа RECT, определяющую координаты верхнего левого и правого нижнего углов прямоугольной области, в которую будет выведен текст. Текст может быть выравнен и отформатирован внутри этой области в соответствии со значением, указанным параметром fuFormat.

Параметр задается как набор флагов с использованием операции логического ИЛИ:

Значение

Описание

DT_BOTTOM

Выравнивание текста по верхней границе прямоугольника, заданного параметром lprc. Этот флаг должен использоваться в комбинации с флагом DT_SINGLELINE

DT_CALCRECT

Определение высоты и ширины прямоугольника без вывода текста. Если указан этот флаг, функция DrawText возвращает высоту текста. Если выводимый текст состоит из нескольких строк, функция использует ширину прямоугольника, заданную параметром lprc, и расширяет базу этого прямоугольника до тех пор, пока прямоугольник не вместит в себя последнюю строку текста. Если текст состоит из одной строки, функция изменяет правую сторону прямоугольника до тех пор, пока последний символ строки не поместится в прямоугольник.
В структуру, заданную параметром lprc, после возврата из функции будут записаны размеры прямоугольной области, использованной для вывода текста

DT_CENTER

Центрирование текста по горизонтали

DT_EXPANDTABS

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

DT_EXTERNALLEADING

Вывод текста выполняется с учетом межстрочного расстояния (external leading), определенного для выбранного шрифта разработчиком шрифтов

DT_LEFT

Выравнивание текста по левой границе прямоугольной области, заданной параметром lprc

DT_NOCLIP

Вывод текста выполняется без ограничения области вывода. Этот режим увеличивает скорость вывода текста

DT_NOPREFIX

Выключение директивы подчеркивания &. По умолчанию символ & используется для того, чтобы вывести следующий символ с выделением подчеркиванием. Для вывода самого символа & его следует повторить дважды. Флаг DT_NOPREFIX выключает этот режим

DT_RIGHT

Выравнивание текста по правой границе прямоугольной области, заданной параметром lprc

DT_SINGLELINE

Текст состоит только из одной строки. Символы возврата каретки и перевода строки не вызывают перехода на следующую строку

DT_TABSTOP

Установить точки останова по символам табуляции

DT_TOP

Выравнивание текста по верхней границе прямоугольной области, заданной параметром lprc. Флаг используется только для текста, состоящего из одной строки

DT_VCENTER

Выравнивание текста по вертикали. Флаг используется только для текста, состоящего из одной строки. Если текст состоит из одной строки, необходимо вместе с этим флагом указывать флаг DT_SINGLELINE

DT_WORDBREAK

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

Если перед вызовом функции вы установили режим обновления текущей позиции (вызвав функцию SetTextAligh с параметром TA_UPDATECP), текст будет выведен начиная с текущей позиции, которая устанавливается за последним выведенным ранее символом. Свертка слов при этом не выполняется.

Функция DrawText в случае успешного завершения возвращает высоту прямоугольной области, использованной для вывода текста.

Изменение режимов вывода текста

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

Функция SetTextAlign позволяет определить выравнивание прямоугольной области, используемой для вывода текста, относительно указанных координат вывода. Эта функция имеет следующий прототип:

UINT WINAPI SetTextAlign(HDC hdc , UINT fuAlign);

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

Второй параметр, fuAlign, состоит из трех наборов битовых флагов. Флаги из каждого набора можно объединять при помощи логической операции ИЛИ.

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

Символическое имя флага

Описание

TA_CENTER

Выравнивание по центру

TA_LEFT

Выравнивание по левой границе. Этот способ выравнивания используется по умолчанию

TA_RIGHT

Выравнивание по правой границе

Вторая группа флагов отвечает за выравнивание текста по вертикали:

Символическое имя флага

Описание

TA_BASELINE

Выравнивание по базовой линии шрифта

TA_TOP

Выравнивание по верхней границе. Этот режим используется по умолчанию

TA_BOTTOM

Выравнивание по нижней границе

Третья группа флагов отвечает за обновление текущей позиции вывода текста:

Символическое имя флага

Описание

TA_NOUPDATECP

Не обновлять текущую позицию после вывода текста функциями TextOut и ExtTextOut. Этот режим используется по умолчанию

TA_UPDATECP

Обновлять текущую позицию после вывода текста функциями TextOut и ExtTextOut

Вы можете узнать состояние флагов выравнивания, выбранных в контекст отображения, при помощи функции GetTextAlign:

UINT WINAPI GetTextAlign(HDC hdc);

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

Можно изменить цвет текста. Для этого необходимо вызвать функцию SetTextColor:

COLORREF WINAPI SetTextColor(HDC hdc, COLORREF clrref);

Параметр hdc определяет контекст отображения, для которого вы собираетесь изменить цвет текста.

Структура clrref определяет цвет.

Функция SetTextColor возвращает значение цвета, которое использовалось для вывода текста раньше.

Тип данных COLORREF определен в файле windows.h следующим образом:

typedef DWORD COLORREF;

Для указания цвета удобно использовать макрокоманду RGB, определенную в файле windows.h:

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) |

  ((WORD)(g)<<8)) | (((DWORD)(BYTE)(b))<<16)))

В качестве параметров для этой макрокоманды вы можете указывать интенсивность отдельных цветов в диапазоне от 0 до 255:

Параметр

Цвет

r

Красный

g

Зеленый

b

Голубой

Для определения отдельных цветовых компонент из возвращаемого функцией SetTextColor значения удобно использовать макрокоманды GetRValue, GetGValue и GetBValue, определенные в файле windows.h:

#define GetRValue(rgb)      ((BYTE)(rgb))

#define GetGValue(rgb)      ((BYTE)(((WORD)(rgb)) >> 8))

#define GetBValue(rgb)      ((BYTE)((rgb)>>16))

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

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

COLORREF WINAPI GetTextColor(HDC hdc);

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

Обработка сообщения WM_PAINT

Сообщение WM_PAINT передается функции окна, если стала видна область окна, скрытая раньше другими окнами, если вы изменили размер окна или выполнили операцию свертки (пролистывания) изображения в окне. Приложение может передать функции окна сообщение WM_PAINT явным образом, вызывая функции UpdateWindow, InvalidateRect или InvalidateRgn.

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

Для ответа на этот вопрос вспомним о втором параметре функции BeginPaint, который является указателем на структуру PAINTSTRUCT:

HDC BeginPaint(HWND hwnd, PAINTSTRUCT FAR * lpps);

Структура PAINTSTRUCT определена в файле windows.h следующим образом:

typedef struct tagPAINTSTRUCT

{

 HDC  hdc;

 BOOL fErase;

 RECT rcPaint;

 BOOL fRestore;

 BOOL fIncUpdate;

 BYTE rgbReserved[16];

} PAINTSTRUCT;

Поле hdc после вызова функции BeginPaint будет содержать идентификатор контекста отображения (тот же самый, что и возвращаемый самой функцией BeginPaint).

Начальные координаты и размер области, подлежащей обновлению в процессе обработки сообщения WM_PAINT, передаются через поле rcPaint. Это поле представляет собой структуру типа RECT, описывающую прямоугольную область:

typedef struct tagRECT

{

  int left;

  int top;

  int right;

  int bottom;

} RECT;

Поля left, top, right и bottom задают координаты области следующим образом:

Поле

Описание

left

x-координата верхнего левого угла области

top

y-координата верхнего левого угла области

right

x-координата правого нижнего угла области

bottom

y-координата правого нижнего угла области

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

Поле fErase структуры PAINTSTRUCT определяет необходимость стирания фона окна в области, подлежащей обновлению. Если это поле установлено в состояние TRUE, функция BeginPaint посылает функции окна сообщение WM_ERASEBKGND.

Как правило, сообщение WM_ERASEBKGND передается функции DefWindowProc, которая при получении этого сообщения перерисовывает фон соответствующей области окна (используя кисть, определенную при регистрации класса окна). Если поле fErase содержит значение FALSE, фон окна не изменяется.

Остальные поля структуры PAINTSTRUCT используются Windows, приложение не должно изменять их содержимое.

Если окно содержит несколько областей, подлежащих обновлению, приложение получает только одно сообщение WM_PAINT, в котором определена область, охватывающая все указанные выше области.

Рассмотрим некоторые функции, имеющие отношение к сообщению WM_PAINT.

Функция UpdateWindow имеет следующий прототип:

void UpdateWindow(HWND hwnd);

Эта функция посылает сообщение WM_PAINT функции окна, идентификатор которого задан в качестве параметра hwnd. Сообщение посылается в обход очереди сообщений приложения, и только в том случае, если для окна существует непустая область обновления. Если в окне обновлять нечего, сообщение WM_PAINT не посылается.

При помощи функции InvalidateRect вы можете объявить любую область окна как требующую обновления. Прототип функции:

void InvalidateRect(HWND hwnd, LPRECT lprc, BOOL fErase);

Первый параметр (hwnd) функции является идентификатором окна, для которого выполняется операция. Второй параметр (lprc) - дальний указатель на структуру типа RECT, определяющую прямоугольную область, подлежащую обновлению. Третий параметр (fErase) определяет необходимость стирания фона окна. Если этот параметр задан как TRUE, фон окна подлежит стиранию (см. поле fErase структуры PAINTSTRUCT).

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

void ValidateRect(HWND hwnd, LPRECT lprc);

Первый параметр определяет идентификатор окна, второй является дальним указателем на структуру типа RECT, определяющую прямоугольную область, которая должна быть исключена из области обновления. Если в результате вызова функции ValidateRect в окне не остается областей, подлежащих обновлению, сообщение WM_PAINT удаляется из очереди сообщений приложения.

Подводя итог, отметим еще раз несколько моментов, важных для понимания методов, с помощью которых приложение Windows рисует в своих окнах.

Приложение должно выполнять вывод в окно "централизованно" в функции окна при получении сообщения WM_PAINT.

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

Используя специальные функции, приложение в любой момент времени может определить любую область окна как подлежащую (или не подлежащую) обновлению и послать самому себе в соответствующую функцию окна сообщение WM_PAINT.


 

А также другие работы, которые могут Вас заинтересовать

77354. On practice of views design in computer visualization systems 13.5 KB
  For correct nd effective visul representtion it is necessry to understnd ccurtely wht sttes nd fetures of the given object re under interest becuse representtion of fetures sttes nd chnges of sttes there is primry gol of visuliztion. View one my define s the...
77355. ONE APPROACH TO COMPUTING ON DEMAND 26.5 KB
  Consider sitution when we wnt to provide remote ccess to such progrm using the grphicl interfce. It is not esy for mthemticin to upgrde his progrm to the scenrio described bove. This project contins description how to run the progrm list of input dt wy to trnsfer it to the progrm nd the wy to collect the results.
77356. Описание параллельных вычислений при помощи замыканий 35 KB
  Переменная n из множества NMES принимает значение истина только в том случае когда вычислен блок данных с именем являющимся и именем n. Для вычисления в функцию F передаются 1 список аргументов RGS 2 битовый вектор со значениями переменных NMES и 3 вычисленные блоки данных имена которых совпадают с именами переменных из...
77357. ПСИХОЛОГИЧЕСКИЕ АСПЕКТЫ ФЕНОМЕНА ПРИСУТСТВИЯ В ВИРТУАЛЬНОЙ СРЕДЕ 103 KB
  Цель данной работы – определить круг основных понятий связанных с человеческим фактором в контексте виртуальной реальности. В литературе приводятся такие понятия как виртуальная реальность среда виртуальной реальности виртуальная среда иммерсивная виртуальная среда присутствие англ.
77358. О реальности автоматизации отладки счетных программ 26.5 KB
  Современные отладчики позволяя осуществлять мониторинг по ходу исполнения программы помогают в локализации ошибок. Для таких систем нужна эталонная программа или эталонный запуск сохраняющий информацию о ходе выполнения программы. В частности о неправильности может сигнализировать сбой программы типа деления на ноль некорректного обращения к памяти или срабатывания ssertусловия. В случае плавающей ошибки анализируя выдачи программы при разных запусках можно попытаться обнаружить отличающиеся значения.
77359. Средства визуальной поддержки процесса распараллеливания последовательных программ 187 KB
  Одной из важных задач поддержки и организации супервычислений является задача распараллеливания огромных объемов прокладных программ, созданных в предшествующую эпоху для последовательных ЭВМ. Эти программы успешно решали задачи математической физики, моделирования химических процессов, небесной механики и др. После появления современных параллельных вычислителей с 1000 и 10 000 процессоров встает проблема превращения надежных и проверенных кодов в эффективные и мобильные параллельные программы.
77360. Параллельный рендеринг воксельной графики 27.5 KB
  В данной статье описывается разработка средств распараллеливание воксельной графики используемой для представления больших объемов данных получаемых в результате компьютерного моделирования сложных процессов. Обычно данных представляются в виде 3х мерного массива. Затем вычисляется ближайшая точка пересечения этого луча с областью данных параллелограммом. После этого алгоритм движется по трёхмерному массиву данных с шагом в одну ячейку до попадания в не пустую точку.
77361. Вопросы выбора архитектуры интерактивного взаимодействия с параллельными программами 120 KB
  озможность интерактивного взаимодействия с суперкомпьютерной программой при проведении расчётов по сравнению с пакетной обработкой задач может существенно повысить эффективность труда исследователя. Однако организация такого взаимодействия сопряжена с рядом трудностей связанных с устоявшейся методикой программирования и проведения расчётов. Один из ключевых моментов построения такого взаимодействия – выбор правил и принципов построения связи со счетными программами.
77362. DATAFLOW-BASED DISTRIBUTED COMPUTING SYSTEM 39.5 KB
  The method is bsed on the following concepts: storge tsk nd rule. Storge stores nmed dt on which three opertions could be pplied – crete write red nd delete. Every item in the storge is selfsufficient nd contins dt some metinformtion nd hs unique nme. The term tsk identifies the progrm which could red dt with specific nmes from the storge nd generte new dt items which will be written into the storge s result of tsk execution.