Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 25, М.: Диалог-МИФИ, 1993, 286 стр.

[Назад] [Содеожание] [Дальше]

1.1. Базовые понятия и определения

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

Окна в приложениях Presentation Manager

Центральным объектом любого приложения Presentation Manager является главное окно (рис. 1.1).

Рис. 1.1. Главное окно приложения HyperACCESS Lite for OS/2, предназначенного для работы с модемом

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

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

Таким образом, даже простейшее приложение Presentation Manager создает множество окон, одно из которых всегда является главным и служит площадкой для размещения остальных окон. Что же касается последних, то они используются для изображения органов управления, таких как кнопки, переключатели, меню, а также для рисования текста и графических изображений.

В текстовом режиме в распоряжении приложения находится экран, состоящий из 25 строк по 80 символов в каждой. Такая модель очень проста для программирования, однако с ее помощью вы едва ли сможете создавать приложения, имеющие современный интрефейс пользователя.

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

Все это усложняет процедуру отображения информации. В добавок, в отличие от программы MS-DOS приложение Presentation Manager не может полагать, что оно работает в одиночестве и ему безраздельно принадлежит экран монитора, клавиатура, мышь, принтер и другие устройства компьютера. Оно не может делать априорных предположений относительно размеров своего главного окна, а также относительно типа видеоадаптера, установленного в компьютере. Поэтому для организации вывода на экран, печати и обработки ввода необходимо использовать специальные приемы, которые мы подробно опишем в этой и следующих книгах, посвященных программированию для операционной системы IBM OS/2 Warp.

Функция окна

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

Чтобы вам было понятно назначение функции окна, проведем аналогию окон, создаваемых системой Presentation Manager, с объектами в языке программирования C++. Там объект определяется как структура данных и набор методов, предназначенных для обработки этих данных. В качестве методов выступают функции. Среди этих методов существуют два особых - конструктор и деструктор. Эти методы выполняют, соответственно, создание и уничтожение объекта.

Окно, созданное с помощью средств Presentation Manager, можно также рассматривать как объект, состоящий из некоторой структуры данных и методов, реализованных с помощью функции окна. При этом функция окна полностью определяет свойства окна.

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

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

Самое интересное заключается в том, что после определения функции окна приложение... никогда не вызывает эту функцию!

Зачем, спросите вы, приложение создает функцию, которую оно не вызывает?

Дело в том, что функция окна вызывается системой Presentation Manager, когда над окном выполняются какие-либо действия. После вызова функция окна анализирует параметры, полученные ей от Presentation Manager, и выполняет соответствующий фрагмент, определяющий реакцию окна на данное действие.

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

Таким образом, для каждого окна приложение должно определить функцию окна и каким-то образом (каким - вы узнаете позже) указать системе Presentation Manager, что для данного окна будет использована именно эта функция. После создания окна система Presentation Manager будет при необходимости вызывать функцию окна.

Сообщения

В мультизадачной среде, которой является операционная система IBM OS/2 Warp, одновременно могут происходить многие события. Приложения могут работать параллельно и независимо, что в целом повышает производительность системы. Однако возможность мультизадачной обработки накладывает определенные требования на приемы работы с такими устройствами, как мышь и клавиатура.

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

Очевидно, что в мультизадачной среде такой способ ввода применять нельзя, так как одновременно могут работать несколько приложений и каждому из них может потребоваться ввести что-нибудь с клавиатуры. Вопрос - какое приложение должно выполнять ожидание в данном случае?

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

Например, пусть мы запустили два приложения. Можно установить курсор мыши в окно первого приложения, нажать левую клавишу мыши, затем, не отпуская клавишу, переместить курсор мыши в окно второго приложения и там отпустить клавишу мыши. При этом в окне первого приложения произошло одно событие (пользователь нажал левую клавишу мыши), а в окне второго - другое (пользователь отпустил клавишу мыши). Очевидно, что использование традиционных для MS-DOS способов работы с мышью в среде Presentation Manager (если бы такое было возможно) может привести к большим проблемам при попытке приложений определить, что же все-таки пользователь сделал с курсором и клавишами мыши.

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

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

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

Разумеется, сообщения могут возникать не только от мыши и клавиатуры. Они могут создаваться таймером , драйверами различных периферийных устройств, а также другими приложениями и системой Presentation Manager.

Фокус ввода

В любой момент только одно из главных окон, расположенных на поверхности рабочего стола операционной системы OS/2 Warp, может быть активно. Функция активного окна получает сообщения от клавиатуры, поэтому не возникает никаких проблем с разделением клавиатурного ввода между приложениями - все сообщения от клавиатуры направляются в активное окно.

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

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

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

Цикл обработки сообщений

Что делает приложение с сообщениями, поступающими в его очередь?

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

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

[Назад] [Содеожание] [Дальше]