Инструменты пользователя

Инструменты сайта


bbdocuviews

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
bbdocuviews [2014/03/18 13:15]
admin
bbdocuviews [2020/10/29 07:08] (текущий)
Строка 1: Строка 1:
 ====== Как загружаются отображения ====== ====== Как загружаются отображения ======
  
-=== Открытие отображения в окне === +===== Открытие отображения в окне =====
  
 Любое отображение открывается средствами платформонезависимого модуля Views. Процедура Views.Open обращается к хуку открытия, который скрыт в интерфейсе модуля, потому что является наследником Kernel.Hook и реализуется в эталонном каркасе в модуле StdDialog.  Любое отображение открывается средствами платформонезависимого модуля Views. Процедура Views.Open обращается к хуку открытия, который скрыт в интерфейсе модуля, потому что является наследником Kernel.Hook и реализуется в эталонном каркасе в модуле StdDialog. 
Строка 20: Строка 19:
  
  
-=== Модуль Windows ===+===== Модуль Windows ===== 
  
 В документации каркаса есть раздел **Compound Documents**, в котором обоснована необходимость поддержки каркасом разделения на пространство документа и пространство отображения. Модуль StdDialog создаёт персистентный объект - документ, затем создаёт объект окна и передаёт их в модуль Windows, выводящий этот объект в пространство отображения. В документации каркаса есть раздел **Compound Documents**, в котором обоснована необходимость поддержки каркасом разделения на пространство документа и пространство отображения. Модуль StdDialog создаёт персистентный объект - документ, затем создаёт объект окна и передаёт их в модуль Windows, выводящий этот объект в пространство отображения.
Строка 34: Строка 34:
 Процедура CreateDoc средствами WinApi и самого каркаса настраивает окно, после чего сначала вызывает метод Windows.Window.Restore для перестройки дерева фреймов, а потом метод Windows.Window.Update для обновления фреймов на экране (см. "Построение дерева фреймов"). Процедура CreateDoc средствами WinApi и самого каркаса настраивает окно, после чего сначала вызывает метод Windows.Window.Restore для перестройки дерева фреймов, а потом метод Windows.Window.Update для обновления фреймов на экране (см. "Построение дерева фреймов").
  
-=== Модули Views и Ports ===+===== Модули Views и Ports ===== 
  
 Фрейм является т.н. "маппером" (mapper), или, другими словами, способом доступа к порту, на котором выводится отображение. Фрейм является т.н. "маппером" (mapper), или, другими словами, способом доступа к порту, на котором выводится отображение.
Строка 46: Строка 47:
 При построении дерева фреймов, отображению может понадобиться особый фрейм, который запрашивается методом Views.View.GetNewFrame. Если отображение не вернёт никакого фрейма, то ему назначается стандартный фрейм. При построении дерева фреймов, отображению может понадобиться особый фрейм, который запрашивается методом Views.View.GetNewFrame. Если отображение не вернёт никакого фрейма, то ему назначается стандартный фрейм.
  
-=== Построение дерева фреймов ===+===== Построение дерева фреймов ===== 
  
 Для построения и обновления дерева фреймов в модуле Views предусмотрены две процедуры UpdateRoot и ValidateRoot. Первая  из них определяет видимые области, требующие перерисовки. Вторая сперва отбрасывает ненужные фреймы, а затем перестраивает заново дерево фреймов, вызывая RestoreRoot.  Для построения и обновления дерева фреймов в модуле Views предусмотрены две процедуры UpdateRoot и ValidateRoot. Первая  из них определяет видимые области, требующие перерисовки. Вторая сперва отбрасывает ненужные фреймы, а затем перестраивает заново дерево фреймов, вызывая RestoreRoot. 
Строка 52: Строка 54:
 Внутри RestoreRoot вызывается рекурсивная процедура RestoreFrame, которая обходит дерево фреймов и для каждого привязанного к фрейму отображения вызывает метод v.Restore. Именно в этом месте отображения производят операции вывода в пространство отображения. Внутри RestoreRoot вызывается рекурсивная процедура RestoreFrame, которая обходит дерево фреймов и для каждого привязанного к фрейму отображения вызывает метод v.Restore. Именно в этом месте отображения производят операции вывода в пространство отображения.
  
-Теперь самое интересное. Перед вызовом RestoreFrame открывается буфер порта, а после - закрывается. Это необходимо для накопления выводимых отображениями данных в буфере, который затем одномоментно "выбрасывает" их на экран или другое устройство отображения.+Теперь самое интересное. Перед вызовом //RestoreFrame// открывается буфер порта, а после - закрывается. Это необходимо для накопления выводимых отображениями данных в буфере, который затем одномоментно "выбрасывает" их на экран или другое устройство отображения. 
 + 
 +===== Корневой фрейм ===== 
 + 
 + 
 +Это фрейм, находящийся на вершине дерева фреймов. С него начинается построение дерева, поэтому для обозначения корня есть специальный тип //Views.RootFrame//. Поскольку корневой фрейм нельзя встраивать посреди других фреймов, то в процедуре //Views.InstallFrame// стоит проверка типа фрейма. 
 + 
 +Перед тем, как построить дерево фреймов, требуется связать корневой фрейм с его отображением. Связывание производится процедурой ''Views.SetRoot''. Сигналы от окна пойдут именно в это отображение, и далее к другим видимым отображениям. Корневое отображение отличается от других тем, что его метод GetNewFrame возвращает фрейм корневого типа. Таким образом, невозможно спутать назначение этого отображения. 
 + 
 +Фрейм является маппером порта, а мапперу, согласно паттерну //Carrier-Rider-Mapper//, требуются для работы бегунок (Rider) и носитель (Carrier). Бегунком здесь является //Ports.Rider//, а носителем //Ports.Port//. При подключении фрейма к порту методом ''ConnectTo'' для фрейма создаётся экземпляр бегунка. Объект порта уже должен быть создан платформенными средствами (его нельзя создавать иначе, ведь порт является абстракцией устройства вывода), при этом порту назначаются единицы измерения на устройстве и его габариты (ширина и высота) в единицах измерения. 
 + 
 +Конечно же, для корневого отображения должен быть создан контекст, умеющий определять размеры окна. Кроме этого, потребуется проинициализировать домен отображения. И можно строить дерево. 
 + 
 +Дерево фреймов строится последовательным вызовом двух процедур: 
 +<code> 
 +Views.AdaptRoot 
 +Views.RestoreRoot 
 +</code> 
 +Здесь сначала производится адаптация всех фреймов, начиная с корневого, к прямоугольнику отсечения, каковым является окно. А затем запускается построение дерева фреймов, которое растёт при помощи вызовов ''Views.InstallFrame'' в процессе перерисовки отображения (отображения могут вставлять внутрь себя другие отображения, при этом каркас создаёт новые фреймы). 
bbdocuviews.1395134140.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)