Менеджер графических окон

Графика 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:

То соответствующее окно будет скрыто, а остальные окна останутся отображенными:

Аналогично работают и режимы отображения и удаления окон.