Операционная система Microsoft Windows использует способ вывода текста на экран, кардинально отличающийся от вывода текста средствами MS-DOS (как это было описано нами в предыдущих лекциях). В MS-DOS работало только одно приложение, и весь экран отводился исключительно под её нужды. Программа могла рисовать текст в любой позиции экрана, где угодно и, главное, когда ей было угодно.
В Windows и других оболочках с WM_PAINT, о котором было сказано в предыдущих лекциях. Получив такое сообщение, функция окна должна выполнить перерисовку всего окна или его части, в зависимости от дополнительной информации, полученной вместе с сообщением WM_PAINT. Для облегчения работы по отображению содержимого окна весь вывод в окно обычно выполняют в одном месте приложения - при обработке сообщения WM_PAINT в функции окна.
Алгоритм приложения должен быть продуман таким образом, чтобы в любой момент времени, после получения сообщения WM_PAINT, функция окна могла бы перерисовать своё окно или её часть, заданную своими координатами. Последнее нетрудно сделать, если приложение где-то в памяти хранит своё текущее состояние, пользуясь которым функция окна может перерисовать своё окно.
Это, в-общем, не означает, что приложение должно хранить в памяти битовый образ окна и восстанавливать его по-необходимости, хотя и это можно сделать. Приложение должно хранить информацию, на основании которой оно может в любой момент времени перерисовать окно. Например, при обработке текстовой информации, приложение Windows должно сохранять промежуточные и окончательные результаты расчётов в оперативной памяти, чтобы оно могло "по требованию", в любой момент времени выдать на экран (или на принтер, другое графическое устройство) промежуточные и окончательные результаты расчётов. Таким образом, программа Windows отличается от консольной программы-фильтра тем, что она хранит и обрабатывает начальные, промежуточные и конечные результаты работы "все сразу", а не считывая данные и осуществляя вывод данных "в процессе их последовательности поступления". Значит, программа Windows, в отличие от консольной программы-фильтра, обладает "памятью прошлых периодов". И эту особенность необходимо активно использовать.
Для вывода текста на экран дисплея в окно приложения используются функции TextOut, DrawText, ExtTextOut и TabbedTextOut. Все эти функции используют контекст отображения, и наследуют из него параметры рисования (атрибуты текста), такие как выравнивание и цвет символов. Эти атрибуты текста задаются функциями SetTextAlign и SetTextColor. Только после вызова этих функция для изменения контекста можно выводить текст в устройство.
Описание функций TextOut, ExtTextOut, DrawText и TabbedTextOut смотри в приложении № I (пункт 12.7) к данной лекции.
Примечание. Кроме выравнивания и цвета текста, в атрибутах контекста можно сменить шрифт, которым будет выводиться текст на устройство. По-умолчанию используется
При выводе текста в окно или на устройство широко используются метрики шрифта. Основные метрики шрифта представлены на рисунке 12.1.
(рис 12.1) Метрики текста.Среди метрик шрифта чаще всего используются следующие параметры:
tm.tmMaxCharWidth, - определяющий максимальную ширину литеры шрифта (используется как ширина символа по-умолчанию);tm.tmHeight, - определяющий высоту прописных символов;tm.tmHeight + tm.tmExternalLeading - задающий высоту символа вместе с вертикальным отступом по-умолчанию. Численно равно "одному интервалу" при выводе строки символов.Эти метрики можно присвоить переменным, отвечающим за положение текста в окне, при инициализации приложения, а потом использовать для вывода текста в окно в обработчике сообщения WM_PAINT (смотри пример программы в приложении № IV лекции 9). Более подробно о шрифтах и о метриках шрифтов смотри в работах [35, 38].
В качестве функций, осуществляющих вывод в указанный контекст неформатированного текста, можно привести функции PrintHDC, PrintLn и PrintTabbedHDC, текст которых приведён в приложении № IV лекции 9. Эти функции автор рекомендует к использованию для вывода текст в Windows.
Однако прежде чем использовать эти функции, Вы должны инициализировать метрики шрифтов, хранящиеся в глобальных переменных и используемые в указанных выше функциях. Это можно сделать при помощи фрагмента кода, представленного в приложении № II (пункт 12.8) к данной лекции.
В предыдущей части лекции мы рассмотрели вопрос о выводе текста в окно приложения. Однако, как Вы заметили, для вывода в него текста необходимо проделать множество дополнительных операций. А что делать, чтобы вывести просто предупреждение пользователю, например, сообщить об ошибочном действии? Что же, посылать каждый раз сообщение WM_PAINT? А если надо прервать выполнение программы? К счастью, для вывода текста с предупреждением можно использовать функцию вывода "всплывающих сообщений" MessageBox. Именно эта функция использовалась в [38] для демонстрации первого приложения Windows. Программирование многих приложений
Функция MessageBox является порождением от так называемых диалоговых панелей ("окон диалога"), вызываемых приложениями Windows и служащих для "упорядоченного ввода-вывода" с использованием "ресурсов приложений". В принципе, на таких языках, как Delphi, Visual Basic и др., программирование с использованием диалоговых панелей является основным и даже единственным способом создания диалоговых программ. Особенностью окон диалога является:
На этих особенностях основана работа программ "мастеров" ("Wizard"), когда происходит последовательное уточнение параметров и проведение полезных действий программы путём последовательного вывода диалоговых окон и уточнения характера дальнейших действий.
Что касается функции MessageBox, то её назначение - это информирование пользователя о каких либо событиях и "нештатных ситуаций" при работе с программой. Её следует использовать:
Примечание. Большая "защищённость" Windows Vista по сравнению с Windows XP от вредоносных программ в основном обеспечивается большим количеством "заглушек" в этой операционной системе (наряду, конечно же, с исправлением грубых ошибок в системных библиотеках);
Во "всплывающем сообщении" может быть от одной до трёх кнопок, значения которых назначены по-умолчанию для каждого из стилей сообщения. Кроме того, Вы можете задать пиктограмму и звук, сопровождающий его появление, используя один из предопределённых стилей сообщения. Некоторые стили Вы можете комбинировать, указывая их константы, разделённые знаком "логического ИЛИ" в соответствующих полях. И, конечно же, Вы можете произвольно менять текст сообщения и текст заголовка сообщения по своим нуждам. В-общем, дерзайте!
Описание параметров функции MessageBox смотри в приложении № III (пункт 12.11) к данной лекции.
На данной лекции Вы познакомились с функциями текстового вывода в окно приложения средствами WinAPI и SDK Windows. Это поможет Вам написать простейшие "просмотрщики" ("вьюеры") текстовых данных. Также Вы познакомились с окнами "всплывающих сообщений" (
Итак, Вы познакомились с функциями текстового вывода в различных языках программирования: Ассемблер, Си/C++, "почти все" разновидности Бейсика, Perl, Python и Prolog. Также автор коснулся темы вывода текста в стандартное окно Windows.
При написании данного курса автор не скрывал, что его лекции направлены, прежде всего, для написания программ текстовых фильтров и вьюеров. Со своей задачей автор справился. Теперь студенты, с помощью имеющихся знаний, могут писать любые текстовые фильтры и вьюеры для операционных систем MS-DOS, Windows и Linux.
Ограничением данных программ является возможность их запуска только из командной строки. Однако никто не мешает сделать над этими командами "надстройку с графическим интерфейсом" (в терминологии Linux - "Front End"). Эта задача является более лёгкой, чем программирование фильтров, и с ними обязан справиться любой системный программист.
| ФУНКЦИЯ | TEXTOUT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL TextOut( ; где - контекст устройства вывода;int nXStart - начальная горизонтальная координата в окне (в пикселях), с которой начинается вывод текста;int nYStart - начальная вертикальная координата в окне (в пикселях), с которой начинается вывод текста;LPSTR lpszString - дальний указатель на выводимую строку текста;cbString - длина выводимой символьной строки в байтах; |
| НАЗНАЧЕНИЕ: | Выводит текст в окно с атрибутами контекста по-умолчанию; |
| ОПИСАНИЕ: | Функция выводит текст в окно с параметрами контекста, заданными по-умолчанию или изменённые в процессе обработки сообщения WM_PAINT. По-умолчанию шаг координат в окне - один пиксель, начало координат находится в левом верхнем углу рабочей области окна, ось X направлена вправо, а ось Y - вниз; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE - при удачном выводе текста и FALSE в случае неудачи; |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ФУНКЦИЯ | EXTTEXTOUT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI ExtTextOut( ; где - контекст устройства вывода;int nXStart - начальная горизонтальная координата в окне (в пикселях), с которой начинается вывод текста;int nYStart - начальная вертикальная координата в окне (в пикселях), с которой начинается вывод текста;UINT fuOptions - флаги, позволяющие определить тип ограничивающей прямоугольной области, заданной параметром: lprc. Этот параметр задаётся в виде двух флагов, которые можно определить логической операцией ИЛИ ;const RECT FAR *lprc - дальний указатель на структуру типа RECT. Он определяет прямоугольную область, используемую для ограничения и закрашивания (смотри флаги в примечании). Если вместо него указать значение NULL, то область ограничения не используется;LPSTR lpszString - дальний указатель на выводимую строку текста;cbString - длина выводимой символьной строки в байтах;int FAR *lpDx - этот параметр позволяет задать расстояние между отдельными символами. Если вместо этого параметра указано значение NULL, то при выводе текста расстояние между символами определяется шрифтом, выбранным в контекст отображения. Если же в качестве этого параметра указать дальний адрес массива значений int, то Вы сможете определить индивидуальные расстояния между отдельными символами. Размер массива должен быть равен значению, указанному в параметре: cbString ; |
| НАЗНАЧЕНИЕ: | Выводит строку символов в рабочую область окна. Имеет расширенные параметры вывода; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE - при удачном выводе текста и FALSE в случае неудачи; |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ПРИМЕЧАНИЕ: | Флаги в параметре функции fuOptions могут принимать следующие значения:ETO_CLIPPED - указывает, что прямоугольная область, заданная параметром lprc, определяет область ограничения для вывода текста;ETO_OPAQUE - позволяет закрасить прямоугольную область цветом, заданным при помощи функции SetBkColor ; |
| ФУНКЦИЯ | TABBEDTEXTOUT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | LONG WINAPI TabbedTextOut( ; где - контекст устройства вывода;int nXStart - начальная горизонтальная координата в окне (в пикселях), с которой начинается вывод текста;int nYStart - начальная вертикальная координата в окне (в пикселях), с которой начинается вывод текста;LPSTR lpszString - дальний указатель на выводимую строку текста;cbString - длина выводимой символьной строки в байтах;int cTabStops - определяет количество значений в массиве позиций символов табуляции. Если значение этого параметра равно 1, расстояние между символами табуляции определяется первым элементом массива, адрес которого передаётся через параметр: lpnTabPositions ;int FAR *lpnTabPositions - определяет адрес массива целых чисел, определяющих расположение символов табуляции. Массив должен быть отсортирован в порядке увеличения значений;int nTabOrigin - определяет логическую X координату начальной позиции, относительно которой происходит расширение символов табуляции; |
| НАЗНАЧЕНИЕ: | Функция предназначена для вывода текстовых строк, содержащих символы табуляции; |
| ОПИСАНИЕ: | Эту функцию удобно использовать для вывода текстовых таблиц; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Функция возвращает размер (в логических единицах) области, занятой выведённой строкой. Старшее слово возвращаемого значения содержит высоту строки, младшее - ширину строки; |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ФУНКЦИЯ | DRAWTEXT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | int WINAPI DrawText( ; где - контекст устройства вывода. Этим контекстом не может быть контекст метафайла;LPSTR lpszString - дальний указатель на выводимую строку текста;cbString - длина выводимой символьной строки в байтах;RECT FAR *lprc - дальний указатель на структуру типа RECT, определяющую координаты левого верхнего и правого нижнего углов прямоугольной области, в которую будет выведен текст. Текст может быть выровнен и отформатирован внутри этой области в соответствии со значением, указанным параметром fuFormat ;UINT fuFormat - параметр задаётся как набор флагов с использованием операции логического ИЛИ. Полный список используемых флагов перечислен в таблице 12.1. |
| НАЗНАЧЕНИЕ: | Функция предназначена для форматированного вывода текста в прямоугольную область окна; |
| ОПИСАНИЕ: | Если перед выводом функции Вы включили режим обновления текущей позиции вывода (вызвав функцию SetTextAlign с параметром: TA_UPDATECP ), то текст будет выведен начиная с текущей позиции вывода, которая устанавливается за последним выведенным ранее символом. Перенос слов при этом не выполняется; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | В случае успешного завершения функция возвращает высоту прямоугольной области, использованной для вывода текста; |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| Флаг | Описание |
|---|---|
DT_BOTTOM |
Выравнивание текста по верхней границе прямоугольника, заданного параметром lprc. Этот флаг должен использоваться в комбинации с флагом DT_SINGLELINE |
DT_CALCRECT |
Определение высоты и ширины прямоугольника без вывода текста. Если указан этот флаг, функция DrawText возвращает высоту текста. Если выводимый текст состоит из нескльких строк, функция использует ширину прямоугольника, заданную параметром lprc, и расширяет базу этого прямоугольника до тех пор, пока прямоугольник не вместит в себя последнюю строку текста. Если текст состоит из одной строки, функция изменяет правую сторону прямоугольника до тех пор, пока последний символ строки не поместится в прямоугольник.В структуру, заданную параметром |
DT_CENTER |
Центрирование текста по горизонтали. |
DT_EXPANDTABS |
Расширение символов табуляции. По-умолчанию каждый символ табуляции расширяется на восемь символов. |
DT_EXTERNALLEADING |
Вывод текста выполняется с учётом |
DT_LEFT |
Выраввнивание текста по левой границе прямоугольной области, заданной параметром lprc. |
DT_NOCLIP |
Вывод текста выполняется без ограничения области вывода. Этот режим увеличивает скорость вывода текста. |
DT_NOPREFIX |
Выключение директивы подчёркивания . По-умолчанию символ "" используется для того, чтобы вывести следующий символ с выделением подчёркиванием. Для вывода самого символа "" его нужно повторить дважды. Флаг DT_NOPREFIX выключает этот режим. |
DT_RIGHT |
Выравнивание текста по правой границе прямоугольной области, заданного параметром lprc. |
DT_SINGLELINE |
Текст состоит только из одной строки. Символы возврата каретки и перевода строки не вызывают перехода на следующую строку. |
DT_TABSTOP |
Установить точки останова по символам табуляции. |
DT_TOP |
Выравнивание текста по верхней грангице прямоугольной области, заданной параметром lprc. Данный флаг используется совместно с флагом DT_SINGLELINE. |
DT_VCENTER |
Выравнивание текста по вертикали. Данный флаг используется вместе с флагом DT_SINGLELINE. |
DT_WORDBREAK |
Выполнение свёртки слов в пределах заданной параметром lprc прямоугольной области. Если слово не помещается в строке, оно может быть перенесено на следующую строку текста. |
| ФУНКЦИЯ | SETTEXTALIGN |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | UINT WINAPI SetTextAlign( ; где - контекст устройства вывода;UINT fuAlign - набор из трёх битовых флагов, управляющими выравниванием и |
| НАЗНАЧЕНИЕ: | Функция управляет выравниванием и |
| ОПИСАНИЕ: | Первый набор флагов используется при выравнивании воображаемого прямоугольника, ограничивающего текст, по горизонтали относительно указанных выше функций. Второй набор флагов отвечает за выравнивание текста по вертикали. И, наконец, третья группа флагов отвечает за обновление текущей позиции вывода в строке. Если указан флаг: TA_UPDATECP, то вывод текста продолжится с прежней позиции вывода, а координаты: nXStart и nYStart в функциях вывода текста игнорируются; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Прежнее значение параметров выравнивания и |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| Флаг | Описание |
|---|---|
| Выравнивание по горизонтали | |
TA_LEFT |
Выравнивание по левой границе. Координаты соответствуют левой границе воображаемого прямоугольника, охватывающего текст (используется по-умолчанию). |
TA_CENTER |
Выравнивание по центру. Координаты соответствуют центру воображаемого прямоугольника, охватывающего текст. |
TA_RIGHT |
Выравнивание по правой границе воображаемого прямоугольника, охватывающего текст. |
| Выравнивание по вертикали | |
TA_TOP |
Выравнивание по верхней границе. Координаты соответствуют верхней границе воображаемого прямоугольника, охватывающего текст (используется по-умолчанию). |
TA_BASELINE |
Выравнивание по базовой линии выбранного шрифта. |
TA_BOTTOM |
Выравнивание по нижней границе воображаемого прямоугольника, охватывающего текст. |
| Текущая позиция вывода текста | |
TA_NOUPDATECP |
Не изменять значение текущей позиции вывода текста (используется по-умолчанию). |
TA_UPDATECP |
После использования функций TextOut и ExtTextOut вычислять новое значение текущей позиции вывода текста. |
| ФУНКЦИЯ | GETTEXTALIGN |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | UINT WINAPI GetTextAlign( , где - контекст устройства вывода; |
| НАЗНАЧЕНИЕ: | Возвращает текущее состояние флагов выравнивания текста в текущем контексте вывода; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Текущее значение параметров выравнивания и |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ФУНКЦИЯ | SETTEXTCOLOR |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | COLORREF WINAPI SetTextColor( ; где - контекст устройства вывода;COLORREF clrref - структура, определяющая цвет (в данном случае выводимых символов); |
| НАЗНАЧЕНИЕ: | функция меняет цвет выводимых символов; |
| ОПИСАНИЕ: | функция изменяет в контексте текущего устройства вывода Windows |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Прежнее значение цвета текста в контексте вывода; |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ФУНКЦИЯ | GETTEXTCOLOR |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | COLORREF WINAPI GetTextColor( ; где - контекст устройства вывода; |
| НАЗНАЧЕНИЕ: | функция выводит цвет символов; |
| ОПИСАНИЕ: | функция выводит в контексте текущего устройства вывода Windows |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Текущее значение цвета текста в контексте вывода, в виде структуры: COLORREF (смотри приложение №I к лекции 11, пункт 11.3); |
| ПЕРЕНОСИМОСТЬ: | Только WinAPI; |
| ФУНКЦИЯ | GETTEXTEXTENT |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | DWORD GetTextExtent( ; где - контекст устройства вывода;LPCSTR lpszString - дальный константный указатель на выводимую строку;int cbString - число литер (байт) в строке; |
| НАЗНАЧЕНИЕ: | Данная функция вычисляет ширину и высоту строки текста, использующего текущий шрифт для вычисления своего размера (в единицах логических координат).; |
| ОПИСАНИЕ: | Функция выдаёт значения в единицах логических координат области вывода. Для вывода текста в стандартной системе координат рабочей области окна единицей логических координат принят один пиксель. Ширина строки расчитывается как сумма ширины и интервалов всех литер, входящих в текст. Это справедливо не для всех устройств, поэтому на них функция возвращает неверные значения. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Двойное слово, в котором младшее слово содержит значение ширины строки текста (в логических единицах), а старшее слово - высоту строки в логических единицах. В случае неудачи или ошибки функция возвращает нулевое значение; |
| ПЕРЕНОСИМОСТЬ: | Только WinApi; |
Операционная система Windows содержит в себе сложную подсистему по работе со шрифтами. Приложения Windows могут выводить текст с использованием различных шрифтов. Многие программы, такие как текстовые процессоры, позволяют выводить текст с использованием различных шрифтов, различной высоты и ширины. Но высота и ширина шрифта - это не все характеристики шрифтов. В полиграфии используется очень сложная
Подробней о классификации гарнитур шрифтов, определения кегля и других терминов, связанных со шрифтами, смотрите любую литературу по полиграфии или дизайну.
В Windows, кроме того, все шрифты можно разделить по технологии изготовления на "растровые", "контурные" ("векторные") и масштабируемые (изготовленные с помощью разных технологий, например: True Type Fonts, Open Type Fonts, Adobe Type I). Растровые шрифты состоят из отдельных пикселей, и используются при выводе текста на экран монитора или на принтер. Для обеспечения приемлемого качества текста в Windows имеется набор растровых шрифтов с одной гарнитурой, но разным кеглем. Если попытаться выполнить масштабирование растрового шрифта в сторону увеличения размера литер, наклонные линии и закругления будут изображаться в виде "лестницы".
Контурные шрифты больше подходят для плоттеров. При масштабировании таких шрифтов можно достичь лучших результатов, чем при масштабировании растровых шрифтов. Однако при этом трудно регулировать толщину штрихов шрифта.
Масштабируемые шрифты сохраняют начертание символов при любом изменении размеров, поэтому они чаще используются при подготовке документов. Однако, как правило, эти шрифты нельзя использовать при рисовании символов на плоттере и в качестве шрифтов элементов оформления (меню, диалоговых панелей и т.п.).
В примерах данного курса мы будем использовать так называемый SYSTEM_FONT.
Переменная ширина букв усложняет задачу вывода текста, так как длина текстовой строки зависит не только от количества букв в строке, но и от того, из каких литер состоит строка. Для подсчёта длины текстовой строки в пикселях предназначена функция GetTextExtent, описанная в Приложении № I(пункт 12.7) к данной лекции.
Для получения информации о шрифте, выбранном в контекст устройства, предназначена функция GetTextMetrics. Её описание смотри ниже.
| ФУНКЦИЯ | GETTEXTMETRICS |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | BOOL WINAPI GetTextMetrics( , где - указывает на контекст устройства, для которого требуется получить информацию о метриках шрифта;TEXTMETRIC FAR* lptm - дальний указатель на структуру TEXTMETRIC, в которую будет записана информация о метриках шрифта для указанного контекста устройства; |
| НАЗНАЧЕНИЕ: | Получает информацию о метриках шрифта для указанного контекста; |
| ОПИСАНИЕ: | |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | TRUE в случае успешного завершения, и FALSE в противном случае; |
| ПЕРЕНОСИМОСТЬ: | Только Windows; |
Структура TEXTMETRIC описана в файле windows.h следующим образом:
typedef struct tagTEXTMETRIC
{
int tmHeight;
int tmAscent;
int tmDescent;
int tmInternalLeading;
int tmExternalLeading;
int tmAveCharWidth;
int tmMaxCharWidth;
int tmWeight;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE PitchAndFamily;
BYTE tmCharSet;
int tmOverhang;
int tmDigitizedAspectX;
int tmDigitizedAspectY;
} TEXTMETRIC;
Описание этих полей смотрите в таблице 12.3.
Хорошо спроектированные приложения позволяют Вам выбирать для отображения текста произвольные шрифты. Поэтому приложение никогда не должно ориентироваться на конкретные размеры шрифта, а должно определять параметры шрифта динамически, во время выполнения программы, используя функцию GetTextMetrics.
Пример функций для определения параметров шрифта по-умолчанию и вывода текста с указанными метриками приведён ниже. Следует отметить, что эти функции используют глобальные переменные nXChar, nYChar, nXCurrentPosition, nYCurrentPosition, ps, tm, nMaxNumLines, nMaxLenngthLines, nScrollPos и др.
| Поле | Описание |
|---|---|
int tmHeight |
Равна сумме значений tmAscent и tmDescent, и равна высоте шрифта. |
int tmAscent |
Представляет собой высоту символов от базовой линии до верха приписных букв, с учётом таких элементов, как |
int tmDescent |
Определяет пространство, занимаемое буквами ниже базовой линии. |
int tmInternalLeadiing |
Определяет размер выступающих элементов букв (например, |
int tmExternalLeading |
Определяет минимальный межстрочный интервал, рекомендуемый разработчиком шрифта. |
int tmAveCharWidth |
Содержит в себе среднее значение ширины строчных букв шрифта. Это значание приблизительно равно ширине латинской буквы: "x". |
int tmMaxCharWidth |
Определяет ширину самой широкой букве в шрифте. Для моноширинной гарнитуры это значение совпадает со значением tmAveCharWidth. |
int tmWeight |
|
BYTE tmItalic |
|
BYTE tmUnderlined |
|
BYTE tmStruckOut |
|
BYTE tmFirstChar |
|
BYTE tmLastChar |
|
BYTE tmDefaultChar |
|
BYTE tmBreakChar |
|
BYTE tmPitchAndFamily |
|
BYTE tmCharSet |
|
int tmOverhang |
|
int tmDigitizedAspectX |
|
int tmDigitizedAspectY |
Примечание: в данных примерах используется вертикальная полоса прокрутки окна. Более подробно о полосах прокрутки смотри в приложении № IV к данной лекции.
| ФУНКЦИЯ | MESSAGEBOX |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | int WINAPI MessageBox( hwndParent, lpszText, lpszTitle, fuStyle ), гдеHWND hwndParent - идентификатор родительского окна, создающего диалоговую панель;LPSTR lpszText - дальний указатель на строку текста, выводимую в рабочую область диалоговой панели;LPSTR lpszTitle - дальний указатель на строку текста, отображающейся в заголовке диалогового окна;UINT fuStyle - флаг, определяющий стиль и внешний вид диалоговой панели. Константы, определяющие эти флаги, находятся в таблице 12.4; |
| НАЗНАЧЕНИЕ: | Функция выводит диалоговую панель с сообщением, заданным пользователем; |
| ОПИСАНИЕ: | Функция MessageBox создаёт на экране диалоговую панель с текстом, заданным параметром: lpszText и заголовком, заданным параметром lpszTitle. Если заголовок указан как NULL, используется заголовок по умолчанию - строка "Error". Параметр hwndParent указывает идентификатор родительского окна, создающего диалоговую панель. Этот параметр можно указать как NULL, тогда у диалоговой панели не будет рабочего окна. Вы также можете вызвать функцию из MessageBox из функции диалога, в этом случае этот параметр должен содержать идентификатор окна диалоговой панели. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Одна из следующих констант, определённых в таблице 12.5; |
| ПЕРЕНОСИМОСТЬ: | Только Windows. |
| Флаг | Описание |
|---|---|
| Количество и тип кнопок | |
MB_ABORTRETRYIGNORE |
Диалоговое окно содержит три кнопки с надписями: "Abort", "Retry", "Ignore". |
MB_OK |
Диалоговое окно содержит одну кнопку "Ok". |
MB_OKCANCEL |
Панель содержит две кнопки с надписями "Ok", "Cancel". |
MB_RETRYCANCEL |
Панель содержит две кнопки с надписями "Retry, Cancel". |
MB_YESNO |
Панель содержит две кнопки с надписями: "Yes", "No". |
MB_YESNOCANCEL |
Панель содержит три кнопки с надписями: "Yes", "No", "Cancel". |
| Номер кнопки по-умолчанию | |
MB_DEFBUTTON1 |
Первая кнопка используется по-умолчанию. |
MB_DEFBUTTON2 |
Вторая кнопка используется по-умолчанию. |
MB_DEFBUTTON3 |
Третья кнопка используется по-умолчанию. |
| Управление модальностью диалоговой панели | |
MB_APPLMODAL |
Cоздаётся модальная диалоговая панель. Окно, указанное параметром hwndParent, преводится в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью. Пользователь может переключиться на другое приложение. Этот стиль используется по-умолчанию. |
MB_SYSTEMMODAL |
Пока не завершиться работа с диалоговой панелью, все остальные приложения переводятся в неактивое состояние. |
MB_TASKMODAL |
Аналогично MB_APPLMODAL, за исключением того, что если параметр hwndParent имеет значение NULL, блокируются все окна верхнего уровня, принадлежащие заданной задаче. Этот стиль используется тогда, когда идентификатор родительского окна неизвестен, но тем не менее требуется перевести все окна текущего приложения в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью. |
| Создание пиктограммы: | |
MB_ICONASTERISK |
Буква "i" на синем фоне |
MB_ICONEXCLAMATION |
Восклицательный знак в жёлтом круге. |
MB_ICONHAND |
Надпись: "STOP" на красном фоне (как автомобильный знак). |
MB_ICONINFORMATION |
Буква "i" на синем фоне |
MB_ICONQUESTION |
Знак вопроса в зелёном круге. |
MB_ICONSTOP |
Надпись: "STOP" на красном фоне (как автомобильный знак). |
| Константа | Описание |
|---|---|
IDABORT |
Нажата клавиша: "Abort". |
IDCANCEL |
Нажата клавиша: "Cancel". |
IDIGNORE |
Нажата клавиша: "Ignore". |
IDNO |
Нажата клавиша: "No". |
IDOK |
Нажата клавиша: "Ok". |
IDRETRY |
Нажата клавиша: "Retry". |
IDYES |
Нажата клавиша: "Yes". |
Полосы прокрутки широко используются в приложениях Windows для просмотра текста или изображения, не помещающегося в окне. Полосы прокрутки бывают горизонтальными и вертикальными. Горизонтальная и вертикальная полосы прокрутки посылают в функцию родительского окна сообщения WM_HSCROLL и WM_VSCROLL соответственно. Поэтому функция обработки сообщений родительского окна должна обрабатывать эти сообщения. Параметр WParam сообщений несёт информацию о действии, которое выполнялось над полосой прокрутки.
Во-первых, Вы можете создать полосу прокрутки с помощью функции CreateWindow, указав предопределённый класс окна "scrollbar". Этот способ аналогичен способу
Второй способ создания полос чрезвычайно прост, но с его помощью можно создать только одну горизонтальную и одну вертикальную полосы прокрутки, расположенные по краям окна. Для того чтобы эта полосы прокрутки появились в окне, при регистрации класса окна в третьем параметре функции CreateWindow необходимо указать стиль окна WS_VSCROLL, или WS_HSCROLL, или оба стиля вместе.
Пример 12.1.
hwnd = CreateWindow( szClassName, szWindowTitle, // Стиль окна WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL );
Сообщения от полосы прокрутки рассматриваются в таблице 12.6.
| Константы WParam сообщений для полсы прокрутки | |
|---|---|
| Флаг полосы просмотра | Описание |
SB_LEFT |
Сдвиг влево на начало документа (горизонтальная полоса прокрутки) |
SB_TOP |
Сдвиг вверх на начало документа (вертикальная полоса прокрутки) |
SB_LINELEFT |
Сдвиг влево на одну строку |
SB_LINEUP |
Сдвиг вверх на одну строку |
SB_PAGELEFT |
Сдвиг на одну страницу влево |
SB_PAGEUP |
Сдвиг на одну страницу вверх |
SB_RIGHT |
Сдвиг вправо в конец документа (горизонтальная полоса прокрутки) |
SB_BOTTOM |
Сдвиг вниз в конец документа (вертикальная полоса прокрутки) |
SB_LINERIGHT |
Сдвиг вправо на одну строку |
SB_LINEDOWN |
Сдвиг вниз на одну строку |
SB_PAGERIGHT |
Сдвиг на одну страницу вправо |
SB_PAGEDOWN |
Сдвиг на одну страницу вниз |
SB_THUMBPOSITION |
Сдвиг в абсолютную позицию. Текущая позиция определяется младшим словом параметра lParam |
SB_ENDSCROLL |
Сообщение приходит в момент, когда вы отпускаете клавишу мыши после работы с полосой просмотра. Это сообщение обычно игнорируется (передаётся функции DefWindowProc ) |
SB_THUMBTRACK |
Перемещение ползунка просмотра. Текущая позиция определяется младшим словом параметра lParam |
Для полосы прокрутки определены понятия "текущая позиция" и "диапазон изменения значений позиции". При передвижении ползунка вдоль полосы прокрутки текущая позиция принимает дискретные значения внутри диапазона изменения значений позиции. Если ползунок находится в самом левом или самом верхнем положении, текущая позиция является минимальной. Если ползунок находится в самом правом или самом нижнем положении, текущая позиция является максимальной.
После того, как Вы создали полосу прокрутки, её необходимо проинициализировать, указав диапазон изменений значений позиции. Для этого необходимо вызвать функцию: SetScrollRange, описанную ниже:
| ФУНКЦИЯ | SETSCROLLRANGE |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void WINAPI SetScrollRange( hwnd, fnBar, nMin, nMax, fRedraw ), гдеHWND hwnd - определяет идентификатор окна, имеющего полосу прокрутки, или идентификатор полосы прокрутки, созданного как орган управления;int fnBar - определяет один из типов полосы прокрутки. Его значения смотри в Таблице 12.7;nMin и nMax определяют соответственно минимальное и максимальное значение для диапазона позиций. Разность между nMax и nMin не должны превышать числа 32767;BOOL fRedraw - Определяет, нужно ли перерисовывать полосу прокрутки для отражения изменений. Если значение равно TRUE, то полоса прокрутки будет перерисована, и FALSE - полоса прокрутки остаётся без изменений; |
| НАЗНАЧЕНИЕ: | Функция устанавливает диапазон значений позиции для полосы прокрутки; |
| ОПИСАНИЕ: | |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Функция не возвращает значений; |
| ПЕРЕНОСИМОСТЬ: | Только Windows; |
Всегда можно узнать диапазон для полосы просмотра, вызвав функцию GetScrollRange:
| ФУНКЦИЯ | GETSCROLLRANGE |
| ОПРЕДЕЛЕНА В: | <windows.h> |
| СИНТАКСИС: | void WINAPI SetScrollRange( hwnd, fnBar, lpnMin, lpnMax ), гдеHWND hwnd - определяет идентификатор окна, имеющего полосу прокрутки, или идентификатор полосы прокрутки, созданного как орган управления;int fnBar - определяет один из типов полосы прокрутки. Его значения смотри в Таблице 12.7;(int FAR*), lpnMin и lpnMax будет записано соответственно минимальное и максимальное значение для диапазона позиций. Разность между nMax и nMin не должны превышать числа 32767; |
| НАЗНАЧЕНИЕ: | Функция выдаёт диапазон значений позиции для полосы прокрутки; |
| ОПИСАНИЕ: | |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Функция не возвращает значений; |
| ПЕРЕНОСИМОСТЬ: | Только Windows; |
Другие функции,
| Значения флага fnBar функций работы с полосами прокрутки | |
|---|---|
| Значение | Описание |
SB_CTL |
Установка диапазона полосы прокрутки, созданной как орган управления класса "scrollbar". В этом случае параметр hwnd функции SetScrollRange и других должен содержать идентификатор органа управления, полученный при его создании функцией CreateWindow |
SB_HORZ |
Установка диапазона горизонтальной полосы прокрутки, при создании которой был использован стиль окна WS_HSCROLL. Параметр функции hwnd должен содержать идентификатор окна, имеющий эту полосу прокрутки. |
SB_VERT |
Установка диапазона вертикальной полосы прокрутки, при создании которой был использован стиль окна WS_VSCROLL. Параметр функции hwnd должен содержать идентификатор окна, имеющий эту полосу прокрутки. |
Пример программы на основе библиотек WinAPI для вывода текста в рабочее окно с вертикальной полосой прокрутки.
Данная программа оптимизирована под среду разработки Borland C/C++ 3.1.
/* Файл TEXTOUTS.H с объявлениями функций и переменных*/
#ifndef MAXTEXTBUFFSIZE
#define MAXTEXTBUFFSIZE 80 // Максимальная ширина строки в символах
#endif
/* #ifndef MAXTEXTSTRINGS
#define MAXTEXTSTRINGS 24 // Максимальное число строк в окне
#endif */
#ifndef __WINDOWS_H
#include <windows.h>
#endif
#ifndef __TEXTOUTS_H
#define __TEXTOUTS_H
// Методы
// "Удержание" позиции прокрутки в "правильных" границах
void vnormalize( void );
void WINAPI setVScrollPos( int ); // Установка текущей позиции скроллинга
int WINAPI getVScrollPos(); // Выдача текущей позиции скроллинга
void WINAPI setMaxVScrol( int ); // Установка максимального количества строк
int WINAPI getMaxVScroll(); // Выдача максимального количества строк
void WINAPI TextMetricsInit( HDC ); // Установка параметров шрифтов
void WINAPI vPageUp( int ); // Перемещение рабочей области окна на экран вверх
void WINAPI vPageDown( int ); // Перемещение рабочей области окна на экран вниз
void WINAPI PrintHDC_scroll( HDC, const char * ); // Печать строки без переноса на новую строку
void WINAPI PrintLnHDC_scroll( HDC, const char * ); // Печать строки с переносом на новую строку
void WINAPI PrintInitHDC_scroll( void ); // Данная функция инициализирует позиции вывода текста при обработке прерывания WM_PAINT
#endif
/* Файл View0000.CPP */
// ------------------------------------
// Вывод текста в рабочую область окна
// с вертикальной полосой прокрутки
// ----------------------------------------
#define STRICT
#include <windows.h>
#include <mem.h>
BOOL InitApp(HINSTANCE);
LRESULT CALLBACK _export WndProc(HWND, UINT, WPARAM, LPARAM);
char const szClassName[] = "ViewerAppClass";
char const szWindowTitle[] = "Viewer0000 Application";
// =====================================
// Функция WinMain
// =====================================
#pragma argsused
int PASCAL
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
MSG msg; // структура для работы с сообщениями
HWND hwnd; // идентификатор главного окна приложени
if(!InitApp(hInstance))
return FALSE;
hwnd = CreateWindow(
szClassName, // имя класса окна
szWindowTitle, // заголовок окна
WS_OVERLAPPEDWINDOW | WS_VSCROLL, // стиль окна
CW_USEDEFAULT, // задаем размеры и расположение
CW_USEDEFAULT, // окна, принятые по умолчанию
CW_USEDEFAULT,
CW_USEDEFAULT,
0, // идентификатор родительского окна
0, // идентификатор меню
hInstance, // идентификатор приложени
NULL); // указатель на дополнительные
// параметры
if(!hwnd)
return FALSE;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(msg, 0, 0, 0))
{
DispatchMessage(msg);
}
return msg.wParam;
}
// =====================================
// Функция InitApp
// =====================================
BOOL
InitApp(HINSTANCE hInstance)
{
ATOM aWndClass; // атом для кода возврата
WNDCLASS wc; // структура для регистрации
// класса окна
memset(wc, 0, sizeof(wc));
// Определяем стиль класса окна, при
// использовании которого окно требует
// перерисовки в том случае, если
// изменилась его ширина или высота
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.lpszMenuName = (LPSTR)NULL;
wc.lpszClassName = (LPSTR)szClassName;
aWndClass = RegisterClass(wc);
return (aWndClass != 0);
}
/* Файл WINPROC.CPP с примерами функций */
// =====================================
// Функция WndProc
// =====================================
#define STRICT
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "textouts.h"
#define MAXTEXTSTRINGS 20 // Переопределённое значение высоты экрана в строках
// Переменные
static int nVScrollPos; // Текущая позиция вертикальной полосы прокрутки
static int nMaxVScrolled; // Максимальное значение позиции
static int nxCurPos; // Текущая горизонтальная позиция вывода в окне
static int nyCurPos; // Текущая вертикальная позиция вывода в окне
static int cxChar; // Ширина символов
static int cyChar; // Высота строки с символами
static char otladka[80]; // Данные для отладки
LRESULT CALLBACK _export
WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static WORD cxClient, cyClient;
HDC hdc; // индекс контекста устройства
PAINTSTRUCT ps; // структура для рисовани
TEXTMETRIC tm; // Структура для записи метрик шрифта
switch (msg)
{
case WM_CREATE:
{
// Получаем контекст отображения,
// необходимый для определения метрик шрифта
hdc = GetDC(hwnd);
// Заполняем структуру информацией
// о метрике шрифта, выбранного в
// контекст отображени
GetTextMetrics( hdc, tm );
// Запоминаем значение ширины для самого широкого символа
cxChar = tm.tmMaxCharWidth;
// Запоминаем значение высоты букв с учётом междустрочного интервала
cyChar = tm.tmHeight + tm.tmExternalLeading;
// Инициализируем текущую позицию вывода текста
nxCurPos = cxChar/2; // Текущая горизонтальная позиция вывода в окне
nyCurPos = 0; // Текущая вертикальная позиция вывода в окне
// Задаём начальное значение позиции
nVScrollPos = 0;
nMaxVScrolled = MAXTEXTSTRINGS;
// Освобождаем контекст
ReleaseDC(hwnd, hdc);
// Задаем диапазон изменения значений
SetScrollRange(hwnd, SB_VERT, 0, nMaxVScrolled, FALSE);
// Устанавливаем ползунок в начальную позицию
SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE);
return 0;
}
// Определяем размеры внутренней области окна
case WM_SIZE:
{
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
}
// Сообщение от вертикальной полосы просмотра
case WM_VSCROLL:
{
switch(wParam)
{
case SB_TOP:
{
nVScrollPos = 0;
break;
}
case SB_BOTTOM:
{
nVScrollPos = nMaxVScrolled;
break;
}
case SB_LINEUP:
{
nVScrollPos -= 1;
break;
}
case SB_LINEDOWN:
{
nVScrollPos += 1;
break;
}
case SB_PAGEUP:
{
nVScrollPos -= cyClient / cyChar;
break;
}
case SB_PAGEDOWN:
{
nVScrollPos += cyClient / cyChar;
break;
}
case SB_THUMBPOSITION:
{
nVScrollPos = LOWORD(lParam);
break;
}
// Блокируем для того чтобы избежать
// мерцания содержимого окна при
// перемещении ползунка
case SB_THUMBTRACK:
{
return 0;
}
default:
break;
}
// Ограничиваем диапазон изменения значений
vnormalize();
// Устанавливаем ползунок в новое положение
SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE);
// Обновляем окно
InvalidateRect(hwnd, NULL, TRUE);
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd, ps);
/* Эти операторы используется для тестировани
sprintf( otladka, "nVScrollPos = %d\n", nVScrollPos );
MessageBox( hwnd, otladka, NULL, MB_OK ); */
// Инициализируем позицию вывода текста
PrintInitHDC_scroll();
// Выводим текст
PrintLnHDC_scroll(hdc, "Это первая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "Это следующая строка");
PrintLnHDC_scroll(hdc, "А это последняя строка");
EndPaint(hwnd, ps);
return 0;
}
// Обеспечиваем управление полосой просмотра
// при помощи клавиатуры
case WM_KEYDOWN:
{
// В зависимости от кода клавиши функция окна
// посылает сама себе сообщения, которые
// обычно генерируются полосой просмотра
switch (wParam)
{
case VK_HOME:
{
SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0L);
break;
}
case VK_END:
{
SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0L);
break;
}
case VK_UP:
{
SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0L);
break;
}
case VK_DOWN:
{
SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0L);
break;
}
case VK_PRIOR:
{
SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0L);
break;
}
case VK_NEXT:
{
SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0L);
break;
}
}
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
// "Удержание" позиции прокрутки в "правильных" границах
void vnormalize( void )
{
if(nVScrollPos < 0) nVScrollPos = 0;
if( nVScrollPos > nMaxVScrolled ) nVScrollPos = nMaxVScrolled;
return;
};
void WINAPI PrintHDC_scroll( HDC hdc, const char *str )
{
char buf[MAXTEXTBUFFSIZE];
char temp[MAXTEXTBUFFSIZE];
int i, y;
// Обрезание входной строки при превышении её длины.
// Это нужно, чтобы не было ошибки "переполнение буфера"
memset( temp, '\0', MAXTEXTBUFFSIZE );
strncpy( temp, str, MAXTEXTBUFFSIZE );
// Вычисляем начальную позицию для вывода
y = nyCurPos + cyChar * (- nVScrollPos);
// Подготавливаем в рабочем буфере
// и выводим в окно, начиная с текущей
// позиции название параметра
sprintf(buf, "%s", temp);
i = strlen(temp);
TextOut(hdc,
nxCurPos, y, buf, i);
// Увеличиваем текущую позицию по
// горизонтали на ширину символа
nxCurPos += cxChar*i;
return;
}
void WINAPI PrintLnHDC_scroll( HDC hdc, const char *str )
{
char buf[MAXTEXTBUFFSIZE], temp[MAXTEXTBUFFSIZE];
int i, y;
// Обрезание входной строки при превышении её длины.
// Это нужно, чтобы не было ошибки "переполнение буфера"
memset( temp, '\0', MAXTEXTBUFFSIZE );
strncpy( temp, str, MAXTEXTBUFFSIZE );
// Вычисляем начальную позицию для вывода
y = nyCurPos + cyChar * (- nVScrollPos);
// Подготавливаем в рабочем буфере
// и выводим в окно, начиная с текущей
// позиции название параметра
sprintf(buf, "%s", temp);
i = strlen(temp);
TextOut(hdc,
nxCurPos, y, buf, i);
// Увеличиваем текущую позицию по
// вертикали на высоту символа
// и переносим начало вывода на новую строку
nyCurPos += cyChar;
nxCurPos = cxChar/2;
return;
}
void WINAPI PrintInitHDC_scroll( )
{
/* Данная функция инициализирует позиции вывода текста при
обработке прерывания WM_PAINT перед собственно выводом
текста */
nyCurPos = 0; // Начальная позиция вывода в окно 0
nxCurPos = cxChar / 2; // Начальная горизонтальная позиция -- половина от ширины символа
return;
}
/* Файл описания модулей VIEW0000.DEF */
; =====================================
; Файл определения модуля VIEW0000
; =====================================
NAME VIEW0000
DESCRIPTION 'Приложение VIEW0000, (C) 2010, yudenisov'
EXETYPE windows
STUB 'winstub.exe'
STACKSIZE 5120
HEAPSIZE 4096
CODE preload moveable discardable
DATA preload moveable multiple
Вывод текста в рабочую область экрана осуществляется только при обработке прерывания WM_PAINT. Собственно перед выводом текста необходимо провести так называемую "инициализацию окна", вызвав функцию: PrintInitHDC_scroll без параметров. Эта функция устанавливает начальную позицию вывода в рабочей области окна при её перерисовке (отступ сверху - 1 интервал, отступ слева - 0,5 от ширины литеры указанного шрифта). Это необходимо сделать, поскольку при каждом приёме сообщения WM_PAINT окно перерисовывается заново.
Затем идут собственно функции вывода текста в окно PrintHDC_scroll и PrintLnHDC_scroll.
Первая из этих функций выводит текст в окно без перехода на другую строку. Новый вывод будет производиться в той же строке, начальная позиция которой будет равна "числу напечатанных символов" * "максимальную ширину литера шрифта". В Бейсике это эквивалентно командам:
TAB("позиция"); PRINT "строка";
Вторая функция после вывода строки переносит новую позицию вывода в начало следующей строки таблицы - вертикальный сдвиг в 1 интервал и начальная горизонтальная позиция - половина ширины символа от рамки окна. Обе функции в качестве параметров воспринимают контекст устройства и выводимую на экран строку текста.
Обработка нажатия клавиш на клавиатуре и изменение позиции вертикальной полосы просмотра происходит отдельно от вывода текста. При этом изменяются только специальные переменные, содержащие дополнительную информацию для вывода текста. После этого происходит вызов сообщения: "WM_PAINT", и текст выводится в рабочую область окна. Остальные функции и параметры претерпели мало изменений относительно тех функций, описанных в приложениях №№ III - VI лекции 9 данного курса.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.