The Global Application Object
NSApp - глобальный объект NSApplication.
The Main Event Loop
В функции main вызывается функция NSApplicationMain, в которой происходит следующее:
- Приложение получает объект NSApp с помощью метода sharedApplication класса.
- Загружается главный nib-файл.
- Запускается основной метод приложения ([NSApp run]).
В п.1. также устанавливается связь с оконным сервером, от которого будут поступать системные события.
В п.3. работает бесконечный цикл.
- В нем работают наблюдатели, получающие события и обрабатывающие их.
- Очередное событие извлекается из очереди событий (nextEventMatchingMask:untilDate:inMode:dequeue:).
- Обработка события заключается в его перенаправлении нужного объекту (как правило, NSWindow object (sendEvent:)) или отрисовке преставления.
Как только очередь исчезает, то оконный сервер снова начинает ее заполнять.
События могут быть весьма разнообразными. Поэтому и получатели событий выбираются 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 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
Панели используются для вывода окон диалогов и плавающих окон, которые находятся поверх остальных окон. Панели могут быть ключевыми окнами, но не могут быть главным окном.
Комментариев нет:
Отправить комментарий