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.


 

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

21711. Оценка вероятностей возможных последствий от нарушений электроснабжения потребителей 181.5 KB
  Оценка вероятностей возможных последствий от нарушений электроснабжения потребителей Для решения широкого класса задач эксплуатации и проектирования с учётом фактора надёжности необходимо определение вероятностей возникновения возможных последствий от нарушения электроснабжения потребителей которые сводятся к следующим: вероятность возникновения катастрофических и аварийных ситуаций исследование которых необходимо для нормирования надёжности электроснабжения; вероятность возникновения отдельных составляющих ущерба их величина и...
21712. ИСПЫТАНИЯ НА НАДЕЖНОСТЬ ЭМС. КОНТРОЛЬНЫЕ ИСПЫТАНИЯ 2.49 MB
  Показатели надежности экспериментальными методами могут быть получены по результатам либо испытаний – специальных или совмещенных либо наблюдением за функционированием объекта в условиях эксплуатации. Методы испытаний организуются специально с целью определения показателей надежности объем их обычно заранее планируется условия функционирования объектов устанавливаются исходя из требований оценки конкретных показателей. Показатели надежности таких объектов оцениваются в основном либо по результатам совмещенных испытаний при которых...
21713. СТАТИСТИЧЕСКИЕ МЕТОДЫ ОЦЕНКИ, АНАЛИЗА И КОНТРОЛЯ НАДЕЖНОСТИ 358.5 KB
  Сбор информации об отказе элементов технических систем В общем комплексе мероприятий по обеспечению надёжности любого изделия сбор статистической информации об отказах и оценка показателей надёжности в условиях эксплуатации являются последним заключительным этапом. При этом появляется возможность оценить реальные значения показателей надежности и следовательно оценить эффективность мероприятий по обеспечению надёжности на всех этапах – проектирование производство испытания монтаж эксплуатация. Поэтому особое значение приобретает вопрос...
21714. ИСПЫТАНИЯ НА НАДЕЖНОСТЬ ЭМС. ОПРЕДЕЛИТЕЛЬНЫЕ ИСПЫТАНИЯ 3.06 MB
  При определительных испытаниях могут оцениваться законы распределения отказов и их параметры. При определительных испытаниях могут оцениваться законы распределения отказов и их параметры. Однако существует универсальный план испытаний позволяющий по единой методике проводить статистическую оценку величины Р для изделий с любым законом распределения. Полученные данные по отказам изделий в результате испытаний или по данным эксплуатации подвергаются статистической обработке для получения следующих результатов: определения вида функции...
21715. Планирование эксперимента при ускоренных испытаниях электрических машин 102 KB
  ТЕМА № 2 Регрессионный анализ установившихся режимов электрической системы Для этой цели целесообразно использование регрессионного моделирования сложной системы. При этом с использованием имеющихся программ расчета установившегося режима на ЭВМ проводятся целенаправленные исследования в результате которых получаются регрессионные модели для анализа или управления. Такие модели могут быть получены при регрессионном анализе или методом планирования многофакторного эксперимента МПЭ. При этом для построения линейных моделей используется полный...
21716. Законы распределения отказов 2.99 MB
  Законы распределения отказов Случайной называется величина которая в результате испытаний может принять то или иное значение причем заранее неизвестно какое именно. Если задан ряд распределений вероятностей для значений случайной величины X то математическое ожидание определяется по формуле Показателями характеризующими степень рассеяния случайной величины около своего математического ожидания являются дисперсия и среднее квадратическое отклонение: Для более полного описания случайных величин вводятся понятия функции распределения...
21717. Экономико-организационные проблемы разгрузки предприятий при дефиците мощности и прохождении максимумов нагрузки в энергосистеме 113.5 KB
  Экономикоорганизационные проблемы разгрузки предприятий при дефиците мощности и прохождении максимумов нагрузки в энергосистеме До настоящего времени работы по созданию экономически обоснованных рекомендаций по управлению электропотреблением промышленных предприятий практически не имели ни методической базы ни руководящих указаний позволяющих обеспечивать минимум экономических потерь от изменения режимов функционирования. Выполнение отмеченных условий связано с трудностями изза неопределенности а в отдельных случаях элементарного незнания...
21718. Задачи надёжности электроснабжения 203.5 KB
  Чтобы качественно сравнивать между собой события по степени их возможности нужно с каждым событием связать определенное число которое тем больше чем более возможно событие его вероятность. Найти вероятность исправной работы РП. Если вероятность одного события не изменяется от того произошло или не произошло другое событие то такие события называются независимыми и наоборот. Вероятность суммы n несовместных событий равна сумме вероятностей этих событий: где .