Опубликован: 15.11.2010 | Уровень: для всех | Доступ: платный
Лекция 12:

Вывод текста на экран и устройство в Windows

Аннотация: На данной лекции описываются "собственно" функции вывода текста в окно приложения или во всплывающее окно. Также даётся представление о метриках текста и правилах их использования при выводе текста в окно приложения Windows. Также даётся представление об "окнах-сообщениях" (Message Box).

12.1. Вывод текста в окно

Операционная система Microsoft Windows использует способ вывода текста на экран, кардинально отличающийся от вывода текста средствами MS-DOS (как это было описано нами в предыдущих лекциях). В MS-DOS работало только одно приложение, и весь экран отводился исключительно под её нужды. Программа могла рисовать текст в любой позиции экрана, где угодно и, главное, когда ей было угодно.

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

Это, в-общем, не означает, что приложение должно хранить в памяти битовый образ окна и восстанавливать его по-необходимости, хотя и это можно сделать. Приложение должно хранить информацию, на основании которой оно может в любой момент времени перерисовать окно. Например, при обработке текстовой информации, приложение Windows должно сохранять промежуточные и окончательные результаты расчётов в оперативной памяти, чтобы оно могло "по требованию", в любой момент времени выдать на экран (или на принтер, другое графическое устройство) промежуточные и окончательные результаты расчётов. Таким образом, программа Windows отличается от консольной программы-фильтра тем, что она хранит и обрабатывает начальные, промежуточные и конечные результаты работы "все сразу", а не считывая данные и осуществляя вывод данных "в процессе их последовательности поступления". Значит, программа Windows, в отличие от консольной программы-фильтра, обладает "памятью прошлых периодов". И эту особенность необходимо активно использовать.

Для вывода текста на экран дисплея в окно приложения используются функции TextOut, DrawText, ExtTextOut и TabbedTextOut. Все эти функции используют контекст отображения, и наследуют из него параметры рисования (атрибуты текста), такие как выравнивание и цвет символов. Эти атрибуты текста задаются функциями SetTextAlign и SetTextColor. Только после вызова этих функция для изменения контекста можно выводить текст в устройство.

Описание функций TextOut, ExtTextOut, DrawText и TabbedTextOut смотри в приложении № I (пункт 12.7) к данной лекции.

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

12.2. Метрики текста

При выводе текста в окно или на устройство широко используются метрики шрифта. Основные метрики шрифта представлены на рисунке 12.1.

Метрики текста.

увеличить изображение
Рис. 12.1. Метрики текста.

Среди метрик шрифта чаще всего используются следующие параметры:

  1. tm.tmMaxCharWidth, - определяющий максимальную ширину литеры шрифта (используется как ширина символа по-умолчанию);
  2. tm.tmHeight, - определяющий высоту прописных символов;
  3. tm.tmHeight + tm.tmExternalLeading - задающий высоту символа вместе с вертикальным отступом по-умолчанию. Численно равно "одному интервалу" при выводе строки символов.

Эти метрики можно присвоить переменным, отвечающим за положение текста в окне, при инициализации приложения, а потом использовать для вывода текста в окно в обработчике сообщения WM_PAINT (смотри пример программы в приложении № IV "Ввод-вывод с использованием WinAPI" ). Более подробно о шрифтах и о метриках шрифтов смотри в работах [35, 38].

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

В качестве функций, осуществляющих вывод в указанный контекст неформатированного текста, можно привести функции PrintHDC, PrintLn и PrintTabbedHDC, текст которых приведён в приложении № IV "Ввод-вывод с использованием WinAPI" . Эти функции автор рекомендует к использованию для вывода текст в Windows.

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

12.4. Функция MessageBox

В предыдущей части лекции мы рассмотрели вопрос о выводе текста в окно приложения. Однако, как Вы заметили, для вывода в него текста необходимо проделать множество дополнительных операций. А что делать, чтобы вывести просто предупреждение пользователю, например, сообщить об ошибочном действии? Что же, посылать каждый раз сообщение WM_PAINT? А если надо прервать выполнение программы? К счастью, для вывода текста с предупреждением можно использовать функцию вывода "всплывающих сообщений" MessageBox. Именно эта функция использовалась в [38] для демонстрации первого приложения Windows. Программирование многих приложений WIMP-интерфейса "начинается и заканчивается" вызовом этой функции. Рассмотрим её особенности.

Функция MessageBox является порождением от так называемых диалоговых панелей ("окон диалога"), вызываемых приложениями Windows и служащих для "упорядоченного ввода-вывода" с использованием "ресурсов приложений". В принципе, на таких языках, как Delphi, Visual Basic и др., программирование с использованием диалоговых панелей является основным и даже единственным способом создания диалоговых программ. Особенностью окон диалога является:

  • их модальность - пока пользователь не завершит работу с окном диалога, он не может редактировать другие данные приложения;
  • их наследственность - окна диалога работают не "сами по себе", как "перекрывающиеся окна", а "привязаны" к одному из приложений.

На этих особенностях основана работа программ "мастеров" ("Wizard"), когда происходит последовательное уточнение параметров и проведение полезных действий программы путём последовательного вывода диалоговых окон и уточнения характера дальнейших действий.

Что касается функции MessageBox, то её назначение - это информирование пользователя о каких либо событиях и "нештатных ситуаций" при работе с программой. Её следует использовать:

  1. Для выдачи отладочной информации о работе программы (т.е. использовать её вместо программы - отладчика кода приложения);
  2. Для информирования пользователя о начале или об окончании работы алгоритма;
  3. Для информирования пользователя об отсутствии какого-либо ресурса (файла, изображения, области памяти и т.п.) или о его неисправности. В этом случае программа может попросить освободить нужные ресурсы, загрузить файл и т.п. для продолжения работы приложения и исправления, таким образом, ситуации;
  4. Попросить пользователя выбрать одну из двух альтернатив;
  5. Спросить пользователя, согласен ли он завершить алгоритм раньше времени (не обязательно при его ошибке);
  6. (Самый распространённый случай). Создание "заглушки" - дополнительного вопроса с подтверждением, действительно ли пользователь хочет совершить критичное для него действие (сохранить данные в уже созданный файл, выйти из программы без сохранения данных и т.п.). При этом у программистов есть правило: "Лишней "заглушки" не бывает!" Так что используйте заглушки как много чаще, но обязательно используйте его в соответствии "с логикой алгоритма";

    Примечание. Большая "защищённость" Windows Vista по сравнению с Windows XP от вредоносных программ в основном обеспечивается большим количеством "заглушек" в этой операционной системе (наряду, конечно же, с исправлением грубых ошибок в системных библиотеках);

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

Во "всплывающем сообщении" может быть от одной до трёх кнопок, значения которых назначены по-умолчанию для каждого из стилей сообщения. Кроме того, Вы можете задать пиктограмму и звук, сопровождающий его появление, используя один из предопределённых стилей сообщения. Некоторые стили Вы можете комбинировать, указывая их константы, разделённые знаком "логического ИЛИ" в соответствующих полях. И, конечно же, Вы можете произвольно менять текст сообщения и текст заголовка сообщения по своим нуждам. В-общем, дерзайте!

Описание параметров функции MessageBox смотри в приложении № III (пункт 12.11) к данной лекции.

12.5. Резюме функций

На данной лекции Вы познакомились с функциями текстового вывода в окно приложения средствами WinAPI и SDK Windows. Это поможет Вам написать простейшие "просмотрщики" ("вьюеры") текстовых данных. Также Вы познакомились с окнами "всплывающих сообщений" (Message Box) и убедились, что "лишних заглушек не бывает".

12.6. Резюме курса

Итак, Вы познакомились с функциями текстового вывода в различных языках программирования: Ассемблер, Си/C++, "почти все" разновидности Бейсика, Perl, Python и Prolog. Также автор коснулся темы вывода текста в стандартное окно Windows.

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

Ограничением данных программ является возможность их запуска только из командной строки. Однако никто не мешает сделать над этими командами "надстройку с графическим интерфейсом" (в терминологии Linux - "Front End"). Эта задача является более лёгкой, чем программирование фильтров, и с ними обязан справиться любой системный программист.