Операционная система Microsoft Windows 3.1 для программиста -том 1

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


2.1.

2.2.

2.3.

2.4.

2.5.

2.6.

2.7.

В предыдущей главе мы привели пример приложения, создающего единственное окно. Однако это окно так и осталось пустым, потому что мы еще не умеем выводить в него ни текст, ни графические изображения. К сожалению, вы не сможете воспользоваться для вывода текста ни одной из хорошо известных вам стандартных функций библиотеки компилятора, такой, как printf, cprintf или putc. Не помогут вам и прерывания BIOS, так как приложениям Windows запрещено их использовать, во всяком случае для вывода на экран. Все эти функции ориентированы на консольный вывод в одно-единственное окно, предоставленное в полное распоряжение программе MS-DOS.

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

Способ, которым приложение выводит что-либо в свои окна, коренным образом отличается от используемого в программах MS-DOS.

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

Приложения Windows также могут выводить в созданные ими окна текст или графические изображения в любой момент времени и из любого места. Однако обычно разработчики поступают по-другому.

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

Содержание раздела