понедельник, 4 мая 2009 г.

4.05.09. Application Architecture.

The Global Application Object

NSApp - глобальный объект NSApplication.

The Main Event Loop

В функции main вызывается функция NSApplicationMain, в которой происходит следующее:

  1. Приложение получает объект NSApp с помощью метода sharedApplication класса.
  2. Загружается главный nib-файл.
  3. Запускается основной метод приложения ([NSApp run]).

В п.1. также устанавливается связь с оконным сервером, от которого будут поступать системные события.



В п.3. работает бесконечный цикл.

  • В нем работают наблюдатели, получающие события и обрабатывающие их.
  • Очередное событие извлекается из очереди событий (nextEventMatchingMask:untilDate:inMode:dequeue:).
  • Обработка события заключается в его перенаправлении нужного объекту (как правило, NSWindow object (sendEvent:)) или отрисовке преставления.

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

More About Event Dispatch

События могут быть весьма разнообразными. Поэтому и получатели событий выбираются NSApp разные (NSApp работает диспетчером).

Например, событие нажатия клавиши перенаправляется ключевому окну (Key Window) с помощью sendEvent:

Событие клика мышью отправляется окну, в котором находился курсор.

Событие клика мышью на контроле порождает сообщение-действие и отправляется с помощью sendAction:to:from: указанной цели или перенаправляется по цепочке (responder chains).

Также возможны другие типы событий.

Window Management

NSApp содержит список окон, с помощью которого управляет ими.

Handling Apple Events

Существуют несколько системных событий (начинаются на kAE), отправляемых приложению при запуске или действиях в Finder-е и т.п.

Windows

По способу работы с окнами приложения могут быть:

  • Document-based
  • Single-window

Также могут модальные окна в виде панелей.

Окна NSWindow создает оконный сервер. Работа с окнами идет по их номеру. Сервер после создания окна получает графический контекст окна и window's backing store - область памяти для работы с устройством отображения окна.

Window Buffering

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

Возможны несколько типов буферизации.

Window Z-Order and Levels

Окна объединяются по уровням согласно их назначению. Некоторые уровни всегда располагаются выше других. Уровнями и z-порядком управляет оконный сервер, а также NSWindow для окон приложения.

Если окно убрано из списка видимых окон, то сообщения ему не доставляются.

Parts of a Window

У окна есть два представления: frame view and a content view. Они являются подклассами NSView. Frame включает заголовок, границу и служебные кнопки. Этот объект представления создается NSWindow как private и его нельзя изменить, создав подкласс. Однако при создании этой переменной можно указать, какие кнопки показывать и т.д.

Content view имеет superview, но оно является также private объектами. Поэтому Content view является корневым представлением для всех представлений, доступных для изменения. В итоге образуется иерархия представлений. Представление имеет ссылку на своё окно.



Window Coordinates

Для расположения окон на экране используется система координат экрана.

У окон своя система координат.

Начало координат в левом нижнем углу.

Frame view использует систему координат экрана. Content view - окна.

Windows and Drawing

Отрисовка - обязанность представлений. Однако NSWindow следит за областями представлений, требующими обновлений и дает им команду на обновление (display, displayRect:, or displayRectIgnoringOpacity:).

Window Status

Окна (главное и ключевое) могут иметь разный статус (активное, неактивное и т.п.).

Event Dispatch

Большинство событий приходит через sendEvent: к NSWindow. Дальше оно перенаправляет событие нужному представлению.

Panels

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

Подробнее.

Комментариев нет:

Отправить комментарий