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

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


bb:docuviews

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
bb:docuviews [2016/04/05 20:10]
prospero78 [Модуль Windows]
bb:docuviews [2020/10/29 07:08] (текущий)
Строка 39: Строка 39:
 Фрейм является т.н. "маппером" (mapper), или, другими словами, способом доступа к порту, на котором выводится отображение. Фрейм является т.н. "маппером" (mapper), или, другими словами, способом доступа к порту, на котором выводится отображение.
  
-Порты --- это носители пиксельных данных, такие как //экран// или //принтер//. Доступ к порту осуществляется посредством //бегунка// (**Ports.Rider**), в координатной системе порта. Координаты фреймов преобразуются так, что они становятся независимыми от позиции фрейма в порте и от физического разрешения порта. Поэтому //все// операции во фреймах используют //универсальные координаты//, а все операции в //бегунке// порта --- используют //пиксельные// координаты.+Порты --- это носители пиксельных данных, такие как //экран// или //принтер//. Доступ к порту осуществляется посредством //бегунка// (''Ports.Rider''), в координатной системе порта. Координаты фреймов преобразуются так, что они становятся независимыми от позиции фрейма в порте и от физического разрешения порта. Поэтому //все// операции во фреймах используют //универсальные координаты//, а все операции в //бегунке// порта --- используют //пиксельные// координаты.
  
 Все операции ввода-вывода проходят через фрейм. Фрейм управляет раскладкой и обрезкой отображений на порте. Фреймы это //непостоянные// объекты, создаваемые каркасом по мере необходимости. Все операции ввода-вывода проходят через фрейм. Фрейм управляет раскладкой и обрезкой отображений на порте. Фреймы это //непостоянные// объекты, создаваемые каркасом по мере необходимости.
Строка 45: Строка 45:
 Каждое окно содержит дерево фреймов, соответствующее всем видимым в окне отображениям. Поскольку рисование вне границ отображения должно быть запрещено, фреймы обеспечивают необходимую обрезку. Управление деревом фреймов и обрезков прозрачно для программиста, т. е. программист может об этом не задумываться. Каждое окно содержит дерево фреймов, соответствующее всем видимым в окне отображениям. Поскольку рисование вне границ отображения должно быть запрещено, фреймы обеспечивают необходимую обрезку. Управление деревом фреймов и обрезков прозрачно для программиста, т. е. программист может об этом не задумываться.
  
-При построении дерева фреймов, отображению может понадобиться особый фрейм, который запрашивается методом **Views.View.GetNewFrame**. Если отображение //не вернёт// никакого фрейма, то ему назначается стандартный фрейм.+При построении дерева фреймов, отображению может понадобиться особый фрейм, который запрашивается методом ''Views.View.GetNewFrame''. Если отображение //не вернёт// никакого фрейма, то ему назначается стандартный фрейм.
  
 ===== Построение дерева фреймов ===== ===== Построение дерева фреймов =====
  
  
-Для построения и обновления дерева фреймов в модуле **Views** предусмотрены две процедуры: **UpdateRoot** и **ValidateRoot**. Первая  из них определяет //видимые// области, //требующие// перерисовки. Вторая сперва отбрасывает //ненужные// фреймы, а затем //перестраивает дерево фреймов// заново , вызывая **RestoreRoot**+Для построения и обновления дерева фреймов в модуле ''Views'' предусмотрены две процедуры: ''UpdateRoot'' и ''ValidateRoot''. Первая  из них определяет //видимые// области, //требующие// перерисовки. Вторая сперва отбрасывает //ненужные// фреймы, а затем //перестраивает дерево фреймов// заново , вызывая ''RestoreRoot''
  
-Внутри **RestoreRoot** вызывается рекурсивная процедура **RestoreFrame**, которая обходит дерево фреймов и для каждого привязанного к фрейму отображения вызывает метод **v.Restore** (View.Restore --- ?). Именно в этом месте отображения производят операции вывода в пространство отображения.+Внутри ''RestoreRoot'' вызывается рекурсивная процедура ''RestoreFrame'', которая обходит дерево фреймов и для каждого привязанного к фрейму отображения вызывает метод ''v.Restore'' (View.Restore --- ?). Именно в этом месте отображения производят операции вывода в пространство отображения.
  
-Теперь самое интересное. Перед вызовом //RestoreFrame// открывается буфер порта, а после - закрывается. Это необходимо для накопления выводимых отображениями данных в буфере, который затем одномоментно "выбрасывает" их на экран или другое устройство отображения.+Теперь самое интересное. Перед вызовом ''RestoreFrame'' открывается буфер порта, а после - закрывается. Это необходимо для накопления выводимых отображениями данных в буфере, который затем одномоментно "выбрасывает" их на экран или другое устройство отображения.
  
 ===== Корневой фрейм ===== ===== Корневой фрейм =====
-Это фрейм, находящийся на вершине дерева фреймов. С него начинается построение дерева, поэтому для обозначения корня есть специальный тип **Views.RootFrame**. Поскольку корневой фрейм нельзя встраивать посреди других фреймов, то в процедуре **Views.InstallFrame** стоит проверка типа фрейма.+Это фрейм, находящийся на вершине дерева фреймов. С него начинается построение дерева, поэтому для обозначения корня есть специальный тип ''Views.RootFrame''. Поскольку корневой фрейм нельзя встраивать посреди других фреймов, то в процедуре ''Views.InstallFrame'' стоит проверка типа фрейма.
  
 Перед тем, как построить дерево фреймов, требуется //связать// корневой фрейм с его отображением. Связывание производится процедурой ''Views.SetRoot''. Сигналы от окна пойдут именно в это отображение, и далее к другим видимым отображениям. Корневое отображение отличается от других тем, что его метод GetNewFrame возвращает фрейм корневого типа. Таким образом, невозможно спутать назначение этого отображения. Перед тем, как построить дерево фреймов, требуется //связать// корневой фрейм с его отображением. Связывание производится процедурой ''Views.SetRoot''. Сигналы от окна пойдут именно в это отображение, и далее к другим видимым отображениям. Корневое отображение отличается от других тем, что его метод GetNewFrame возвращает фрейм корневого типа. Таким образом, невозможно спутать назначение этого отображения.
  
-Фрейм является маппером порта, а мапперу, согласно паттерну //Carrier-Rider-Mapper//, требуются для работы бегунок (Rider) и носитель (Carrier). Бегунком здесь является //Ports.Rider//, а носителем //Ports.Port//. При подключении фрейма к порту методом ''ConnectTo'' для фрейма создаётся экземпляр бегунка. Объект порта уже должен быть создан платформенными средствами (его нельзя создавать иначе, ведь порт является абстракцией устройства вывода), при этом порту назначаются единицы измерения на устройстве и его габариты (ширина и высота) в единицах измерения.+Фрейм является маппером порта, а мапперу, согласно шаблону **Carrier-Rider-Mapper**, требуются для работы //бегунок// (''Rider'') и //носитель// (''Carrier''). Бегунком здесь является ''Ports.Rider'', а носителем ''Ports.Port''. При подключении фрейма к порту методом ''ConnectTo'' для фрейма создаётся экземпляр бегунка. Объект порта уже должен быть создан платформенными средствами (его нельзя создавать иначе, ведь порт является абстракцией устройства вывода), при этом порту назначаются единицы измерения на устройстве и его габариты (ширина и высота) в единицах измерения.
  
 Конечно же, для корневого отображения должен быть создан контекст, умеющий определять размеры окна. Кроме этого, потребуется проинициализировать домен отображения. И можно строить дерево. Конечно же, для корневого отображения должен быть создан контекст, умеющий определять размеры окна. Кроме этого, потребуется проинициализировать домен отображения. И можно строить дерево.
  
 Дерево фреймов строится последовательным вызовом двух процедур: Дерево фреймов строится последовательным вызовом двух процедур:
-<code>+<code oberon2>
 Views.AdaptRoot Views.AdaptRoot
 Views.RestoreRoot Views.RestoreRoot
bb/docuviews.1459876227.txt.gz · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)