Графика HomeLisp основана на понятии графического
окна. Графическое окно представляет собой форму, имеющую в
своем составе область рисования (Picture Box), главное меню с
двумя пунктами (позволяющими сохранять построенное изображение
в файлах или печатать на доступных принтерах).
Вследствии особенностей
реализации графические окна нельзя закрывать "крестом". Для облегчения ручной
манипуляции графическими окнами HomeLisp имеет в своем распоряжении
менеджер графических окон. Этот менеджер представляет собой подсистему,
обеспечивающую скрытие, отображение и (при необходимости) уничтожение графических окон.
Собственно, именно необходимость обеспечения ручного уничтожения и вынудило разработчика
ввести в обиход менеждер окон.
С точки зрения HomeLisp графическое окно представляет собой атом (идентификатор окна), имеющий
в списке свойств индикатор WINDOW и целый ряд дополнительных свойств (размеры, цвет фона, шрифт, заголовок).
Если бы было допустимо закрывать окна "крестом", то возникала бы проблема уничтожения
списка свойств идентификатора окна: ядро HomeLisp не имеет средств для отслеживания
момента удаления окна пользователем. Поэтому было принято решение о создании единого
средства управления окнами. При удалении окна это средство автоматически удаляет и список свойств
идентификатора удаленного окна.
Менеджер графических окон доступен при работе в среде разработки (IDE) и при работе исполняемых
файлов (если они были сгенерированы с диспетчерской формой). При использовани библиотеки
HomeLispLib.Exe менеджер окон недоступен.
При работе в IDE менеджер окон актиаизируется либо через главное меню (пункт Смотреть -> Окна)
или при нажатии на кнопку со следующим изображением:
При работе исполняемого файла, сгенерированного с диспетчерской формой
менеждер окон вызывается с диспетческой формы (аналогичной кнопкой или через пункт Окна главного меню).
Если в сеансе работы нет графических окон, то кнопка и пункт меню
будут неактивны. Если же в сеансе работы имеются созданные окна (неважно, видимые или нет), то при нажатии на указанную
кнопку или выборе соответствующего пункта меню, пользователь увидит форму менеджера. Если запустить HomeLispIde.Exe
и создать графическое окно, выполнив следующий код:
(grwCreate 'w 200 200 "Пробное окно" _WHITE)
==> w
|
то будет создано окно с областью рисования, размером 200*200 пикселов. Однако это окно после
создания не отображается сразу. Для отображения окна можно использовать менеджер окон. При активизации
менеджера окон, пользователь увидит список всех окон, имеющихся в сеансе:
В списке активных окон в каждой строке содержится информация об одном окне: в квадратных скобках
стоит идентификатор окна, далее располагается заголовок.
Форма имеет главное меню из четырех пунктов: Отобразить, Скрыть, Уничтожить и Выход.
Пункты меню Скрыть и Уничтожить устроены одинаково и имеют по два подпункта: Выбранное окно и Все окна.
Пункт Отобразить также имеет два подпункта (Выбранное окно и Все окна), но подпункт Все окна имеет еще
два подпункта: Как есть и Каскадом. Подпункт Как есть отображает все окна в соответствии с их координатами.
Подпункт Каскадом перемещает окна к левому верхнему углу формы (экрана) и выстраивает их с постоянным
сдвигом левого верхнего угла по обеим координатам.
Подпункт Выбранное окно будет активен только в случае, если пользователь выбрал одно из окон в списке,
как это показано на следующем рисунке:
Дальнейшее достаточно ясно: указанное действие выполняется либо с выбранным окном, либо со всеми окнами.
Рассмотрим более развернутый пример. Если в среде разработки выполнить приведенный ниже код:
(defun wintest nil
(prog (hh i k)
(setq winlist '(w1 w2 w3 w4 w5 w6))
(setq collist '(_WHITE _BLUE _GREEN _OLIVE _RED _YELLOW))
(setq ww 100)
(setq hh 100)
(for i 1 6 (
(grwCreate (car winlist) ww hh (fix2str ww) (car collist))
(setq winlist (cdr winlist))
(setq collist (cdr collist))
(setq ww (+ ww 20))
(setq hh (+ hh 20))
)
)
)
)
==> wintest
(wintest)
==> NIL
|
то будет создано шесть окон с размерами графической области от 100 до 200 пикселов. Однако все они
будут невидимы. Если открыть менеджер окон и выполнить режим Отобразить -> Все окна -> Каскадом, то пользователь
увидит следующее:
Если снова открыть менеджер и выполнить скрытие окна w4:
То соответствующее окно будет скрыто, а остальные окна останутся отображенными:
Аналогично работают и режимы отображения и удаления окон.
|