Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
  1. Глава 7. Управление геометрией

Эта глава описывает, как задать или точно регулировать геометрию Ваших виджетов.

Она включает:

  • Контейнер виджетов

  • Согласование геометрии

  • Абсолютное позиционирование

  • Выравнивание виджетов с использованием групп

  • Удерживающее управление с использованием анкеров

  • Удерживание позиции или ограничение изменения размеров без анкеров

    1. Контейнер виджетов

Контейнерный виджет является порождением виджетного класса PtContainer. Контейнерными виджетами являются только те виджеты, которые могут иметь потомков. Любой виджет, не имеющий окна в своём владении, всегда визуализируется внутри границ своего родителя. Только виджеты, принадлежащие к производному классу от виджетного класса PtWindow, получают в свою собственность окно.

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

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

    1. Согласование геометрии

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

Как только каждый потомок пересчитал свои желаемые размеры, родительский виджет может попытаться определить расположение для своих потомков. Компоновка, выполняемая виджетом, зависит от:

  • политики компоновки виджетов;

  • любого размера, установленного для виджета;

  • размерами и желаемой позицией для каждого из потомков.

Если приложение задаёт размер для виджета, то он может выбирать, как располагать потомков, используя только это доступное пространство. На это влияет политика изменения размеров, установленная для виджета. Ресурс Pt_ARG_RESIZE_FLAGS устанавливает флаги, определяющие политику изменения размеров для виджета. Флаги задают в отдельности политику изменения ширины и высоты виджета. Если для какого-либо из измерений политика не определена, виджет не пытается изменять свои размеры а этом измерении при выполнении компоновки. Любая другая политика изменения размеров позволяет виджету увеличиваться в этом измерении, чтобы приспособиться под своих потомков. Более детально это описано в разделе "Политика изменения размеров" ниже.

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

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

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

После того как компоновка успешно установлена, виджет устанавливает позицию для каждого потомка путём внесения изменения в атрибуты позиции потомков.

Соседние файлы в папке Литература_1