Каждый создаваемый программой widget есть представитель того или иного класса. Xt и основывающиеся на нем пакеты, такие как OSF/Motif, OPEN LOOK и др., имеют большое количество таких классов (заметим, что создание своих собственных widget, непредусмотренных в используемых библиотеках, требует и определения соответствующего класса, что, вообще говоря, является достаточно трудоемкой операцией; этот аспект в данном издании не будет освещаться, для получения же более детальной информации по этому вопросу следует смотреть другие аналогичные издания, например [10,12]Ссылка ).
Каждый класс имеет ряд фиксированных характеристик, являющихся общими для всех его экземпляров (например, список callback-процедур). Значения этих характеристик у самих объектов могут различаться.
Все классы в Xt составляют определенную иерархию (см. рисунок 3.1).
Рис. 3.1. Иерархия классов объектов Xt.
Краткое описание каждого класса будет дано ниже. Если класс A ближе к вершине иерархии, чем класс B, то A называется базовым для B, а B называется производным классом (или подклассом) для A. Например, класс Core является базовым по отношению к Composite, а Composite есть подкласс Core.
Подклассы наследуют характеристики всех своих базовых классов. Это означает, что экземпляр класса имеет характеристики не только своего класса, но и атрибуты всех базовых классов. Например, как видно из рис. 3.1, основным классом в Xt является класс Object, характеристики которого непосредственно наследует класс RectObj. В класс Shell переносятся атрибуты Core и Composite и т. д.
В программах каждый класс идентифицируется переменной, которая указывает на соответствующую структуру данных. Эту переменную называют указателем на класс. Данные этой структуры заполняются при инициализации Xt.
Указатель на класс используется в качестве второго аргумента в процедурах создания widget (например, XCreateWidget( ) и др.). Для каждого класса его указатель определен в файле <имя класса>.h. Так, например, для Composite это файл <Composite.h>, а определение переменной выглядит следующим образом:
WidgetClass compositeWidgetClass; |
Более подробную информацию о структуре класса можно найти в аналогичных изданиях.
Рассмотрим подробнее основные классы widget.
Object. Абстрактный класс (т.е. класс, не "порождающий собственного объекта), который используется в качестве корня дерева всех объектов.
RectObj. Абстрактный класс, который используется для определения некоторых общих характеристик, необходимых для функционирования различных типов объектов (например, для объектов, не имеющих окна).
Core. Корень дерева классов widget, имеющих окна. Этот класс определяет характеристики, общие для всех объектов, например такие, как размер окна widget и его положение на экране.
Composite. Подкласс класса Core. Widget, относящиеся к данному классу, могут быть родительскими по отношению к другим объектам. Экземпляры класса Composite определяют следующие особенности поведения своих подобъектов:
Constraint. Это подкласс класса Composite. Он представляет собой дальнейшее расширение базового класса. Его экземпляры имеют дополнительные возможности для управления размером и местоположением своих "потомков". Например, подобъекты могут размещаться в специальном порядке - в ряд, в столбец и т. д.
Shell. Это специальный подкласс класса Composite, предназначенный для взаимодействия с менеджером окон. Widget из этого класса может иметь только одного "потомка".
OverrideShell. Это важный подкласс класса Shell. Для окна widget данного класса атрибут override_redirect устанавливается в True. Это означает, что менеджер окон его не контролирует. Как правило, окна объектов данного класса не имеют аксессуаров, добавляемых менеджером (заголовка, рамки), и используются в основном для создания pop up меню.
WMShell. Это специальный подкласс класса Shell, который содержит дополнительные поля, необходимые для взаимодействия с менеджером окон.
VendorShell. Этот класс предназначен для того, чтобы дать возможность взаимодействия со специальными менеджерами окон.
TopLevelShell. Widget данного класса, как правило, используются как shell-объекты дерева объектов.
TransientShell. Этот класс отличается от предыдущего только особенностями взаимодействия с менеджером окон. Окна widget данного класса не могут быть минимизированы (превращены в пиктограмму). Но если в пиктограмму превращается "родитель" объекта класса TransientShell, то окно widget убирается с экрана. Класс TransientShell используется для создания диалогов.
ApplicationShell. Это подкласс класса TopLevelShell. Программа может иметь, как правило, только один экземпляр, принадлежащий классу ApplicationShell.