Описание графических функций HomeLisp

Графика HomeLisp построена на понятии графического окна. Графическое окно представляет собой форму, имеющую в своем составе область рисования (Picture Box), главное меню с двумя пунктами (позволяющими сохранять построенное изображение в файле типа BMP или GIF или вывести изображение на печать), а также статусбар, в котором отображаются координаты курсора мыши при перемещении его над областью рисования. Эта форма не может быть закрыта "крестом", но может быть свернута и развернута. Форма имеет фиксированные размеры (задаваемые при ее создании) и впоследствии не может быть ресайзирована. Для уничтожения формы нужно вызвать специальную функцию (описываемую ниже). Можно удалить форму и вручную с помощью т.н. менеджера графических окон.

Имена всех графических функций имеют префис GRW (от GRaphic Window).

Графические выкладки начинаются с создания графического окна с помощью функции GRWCREATE. Эта функция принимает первым аргументом атом, который при успешном завершении получает в свой список свойств флаг WINDOW. Будем называть этот атом идентификатором окна. Далее с окном можно выполнять различные действия: рисовать фигуры и текст, загружать графику из внешних файлов и сохранять графическое изображение во внешних файлах, печатать изображения на принтере, поддерживающем графическую печать. Созданное окно не отображается на экране, - его можно отобразить функцией GRWSHOW. Все графические операции можно выполнять и в скрытом окне. Параметры созданного окна можно менять, модифицируя список свойств идентификатора окна с помощью функции PUTPROP. Пример такой модификации приведен ниже при описании функции GRWCREATE.

После завершения работы с окном, его можно удалить, вызвав функцию GRWDESTROY или вручную с помощью менеджера окон. Если не выполнить удаление окна, оно при завершении приложения удалится автоматически.

Одновременно может быть создано до сотни графических окон. (Честно говоря, автор не пробовал создать 100 окон одновременно, но 5-6 штук - легко!).

У всех графических функций первый параметр - это идентификатор окна. Поскольку все графические функции вызываются ради побочного эффекта (с точки зрения Лиспа), то в качестве результата почти все функции возвращают идентификатор окна (что является признаком успешного завершения функции).

Встроенная в HomeLisp графика, позволяет задавать т.н. мировые координаты - выполнять отображение координат реального объекта на заданное окно. Если такое отображение установлено, то во всех графических функциях следует использовать мировые координаты. Если же отображение не установлено, то следует задавать оконные координаты - точке (0,0) соответствует левый верхний угол окна, а точке (W,H) соответствует правый нижний угол. Здесь W и H - ширина и высота окна в писелах.

Хотя способ представления цвета на компьютере можно считать общеизвестным, для полноты картины ниже приводится его краткое описание. Любой цвет, передаваемый видео-системой компьютера, получается сложением трех основных цветов: красного (Red) , зеленого (Green) и синего (Blue). Это представление называется RGB-представлением. Интенсивность каждой составляющей может быть числом в диапазоне от 0 до 255. Черному цвету соответствует RGB-комбинация (0,0,0), белому - соответственно (255,255,255). Эта комбинация трех чисел обычно записывается, как одно шестнадцатеричное число. Черному цвету соответствует число &H000000, а белому - &HFFFFFF. В HomeLisp для представления цвета используются данные типа BITS.

Имя функции К-во аргументов Тип аргументов Выполняемое действие
  GRWARC 7 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT;
6-FLOAT;
7-BITS
Рисует в окне, заданном ПЕРВЫМ аргументом ДУГУ ОКРУЖНОСТИ радиуса, заданного ЧЕТВЕРТЫМ аргументом с центром в точке, заданной парой координат (ВТОРОЙ и ТРЕТИЙ) аргументы. Начальный и конечный угол (в радианах) задаются значениями ПЯТОГО и ШЕСТОГО аргументов. Цвет задается седьмым аргументом.
  GRWARCE 8 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT;
6-FLOAT;
7-FLOAT;
8-BITS
Рисует в окне, заданном ПЕРВЫМ аргументом ДУГУ ЭЛЛИПСА радиуса, заданного ЧЕТВЕРТЫМ аргументом с центром в точке, заданной парой координат (ВТОРОЙ и ТРЕТИЙ) аргументы. Начальный и конечный угол (в радианах) задаются значениями ПЯТОГО и ШЕСТОГО аргументов. Аспект (соотношение полуосей) задается СЕДЬМЫМ аргументом. Цвет задается ВОСЬМЫМ аргументом.
  GRWBEZIER 2 1-WINDOW;
2-LIST
Рисует в окне, заданном ПЕРВЫМ аргументом КРИВУЮ БЕЗЬЕ по точкам, заданным в списке - значении второго аргумента
  GRWCIRCLE 5 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-BITS;
Рисует в окне, заданном ПЕРВЫМ аргументом окружность радиуса, заданного ЧЕТВЕРТЫМ аргументом с центром в точке, заданной парой координат (ВТОРОЙ и ТРЕТИЙ) аргументы. Цвет задается ПЯТЫМ аргументом.
  GRWCLS 1 1-WINDOW Стирает содержимое области рисования окна, заданного аргументом
  GRWCREATE 5 1-АТОМ;
2-FIXED;
3-FIXED;
4-STRING;
5-BITS
Создает окно с шириной, заданой ВТОРЫМ параметром и высотой, заданной ТРЕТЬИМ параметром. Значение ЧЕТВЕРТОГО параметра заностися в заголовок окна. Цвет фона задается ПЯТЫМ параметром. Атом, заданный первым параметром, получает в список свойств индикатор WINDOW. Размеры задаются в пикселах.
  GRWDESTROY 1 1-WINDOW Уничтожает окно, заданное единственным параметром.
  GRWDESTROYALL - - Уничтожает все графические окна
  GRWDRAW 2 1-WINDOW;
2-LIST
Выполняет пакет графических команд, заданных вторым параметром.
  GRWELLIPSE 6 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-BITS;
6-FLOAT;
Рисует в окне, заданном ПЕРВЫМ аргументом эллипс радиуса, заданного ЧЕТВЕРТЫМ аргументом с центром в точке, заданной парой координат (ВТОРОЙ и ТРЕТИЙ) аргументы. Аспект (соотношение полуосей) задается ШЕСТЫМ аргументом. Цвет задается ПЯТЫМ аргументом.
  GRWFILL 5 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-BITS;
5-BITS;
Выполняет заливку замкнутого контура. Цвет контура (границы) задается ЧЕТВЕРТЫМ параметром. Цвет заливки - ПЯТЫМ. Заливка начинается в точке с координатами, заданными ПЕРВЫМ и ВТОРЫМ параметрами.
  GRWFONT 5 1-WINDOW;
2-STRING;
3-FIXED;
4-BOOL;
5-BOOL
Устанавливает для графического окна, заданного ПЕРВЫМ параметром, фонт c гарнитурой, заданной ВТОРЫМ параметром и размером, заданным ТРЕТЬИМ параметром. ЧЕТВЕРТЫЙ и ПЯТЫЙ параметры задают соответственно ЖИРНЫЙ и КУРСИВ соответственно.
  GRWFRECT 6 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT;
6-BITS;
Рисует в окне, заданным ПЕРВЫМ параметром, заполненный прямоугольник. Координаты левого верхнего угла задаются ВТОРЫМ и ТРЕТЬИМ параметром; координаты правого нижнего угла задаются ЧЕТВЕРТЫМ и ПЯТЫМ параметрами. Цвет задается ШЕСТЫМ параметром.
  GRWHIDE 1 1-WINDOW Скрывает окно, заданное единственным параметром.
  GRWHIDEALL - - Скрывает все графические окна.
  GRWINKEY 2 1-WINDOW; 2-FIXED Возвращает код нажатой клавиши из буфера клавиатуры заданного окна или 0, если буфер клавиатуры пуст. Окно при вызове обновляется.
  GRWLINE 6 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT;
6-BITS;
Рисует в окне, заданным ПЕРВЫМ параметром, прямую линию. Координаты левого верхнего угла задаются ВТОРЫМ и ТРЕТЬИМ параметром; координаты правого нижнего угла задаются ЧЕТВЕРТЫМ и ПЯТЫМ параметрами. Цвет задается ШЕСТЫМ параметром.
  GRWLOADPIC 3 1-WINDOW;
2-STRING;
3-FIXED
Загружает в окно, заданное ПЕРВЫМ параметром графическое изображение из файла c именем, заданным ВТОРЫМ параметром. ТРЕТИЙ параметр задает режим сжатия/растяжения изображения. Если значение ТРЕТЬЕГО параметра - не нуль, то изображение "подгоняется" под размер окна. В противном случае растяжения/сжатия не происходит.
  GRWPOINT 3 1-WINDOW;
2-FLOAT;
3-FLOAT;
Возвращает цвет точки с координатами, заданными ВТОРЫМ и ТРЕТЬИМ параметрами в окне, заданном ПЕРВЫМ параметром..
  GRWPRINT 5 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-STRING;
5-BITS
Выводит в окне, заданным ПЕРВЫМ параметром, текст, заданный ЧЕТВЕРТЫМ параметром. Вывод начинается с позиции с координатами, заданными ПЕРВЫМ и ВТОРЫМ параметрами. Цвет текста задается ПЯТЫМ параметром. Используется текущий фонт.
  GRWPSET 4 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-BITS;
Ставит в окне, заданном ПЕРВЫМ параметром точку цветом, который задается ЧЕТВЕРТЫМ параметром. Координаты точки задаются ВТОРЫМ и ТРЕТЬИМ параметрами.
  GRWRECT 6 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT;
6-BITS;
Рисует в окне, заданным ПЕРВЫМ параметром, НЕзаполненный прямоугольник. Координаты левого верхнего угла задаются ВТОРЫМ и ТРЕТЬИМ параметром; координаты правого нижнего угла задаются ЧЕТВЕРТЫМ и ПЯТЫМ параметрами. Цвет задается ШЕСТЫМ параметром.
  GRWREFRESH 2 1-WINDOW;
2-FIXED
Обновляет окно, заданное ПЕРВЫМ параметром. Второй параметр задает задержку (в миллисекундах) после обновления.
  GRWSAVEPIC 3 1-WINDOW;
2-FIXED;
3-STRING
Сохраняет графическое изображение из окна, заданного ПЕРВЫМ параметром в файле c именем, заданным ТРЕТЬИМ параметром. Тип файла задается значением ВТОРОГО параметра (0-BMP; 1-GIF).
  GRWSCALE 5 1-WINDOW;
2-FLOAT;
3-FLOAT;
4-FLOAT;
5-FLOAT
Для окна, заданного ПЕРВЫМ параметром устанавливает систему мировых координат. ВТОРОЙ и ТРЕТИЙ параметры задают минимум и максимум по оси ОХ. ЧЕТВЕРТЫЙ и ПЯТЫЙ параметры задают минимум и максимум по оси ОY.
  GRWSETPARM 5 1-WINDOW;
2-FIXED;
3-FIXED;
4-BITS;
5-BITS
Для окна, заданного ПЕРВЫМ параметром устанавливает ширину рисуемых линий (ВТОРОЙ параметр); стиль заполнения (ТРЕТИЙ параметр); цвет заполнения (ЧЕТВЕРТЫЙ параметр) и цвет переднего плана (ПЯТЫЙ параметр).
  GRWSHOW 3 1-WINDOW, [2,3 - FIXED] Отображает окно, заданное первым параметром.
  GRWSHOWALL 2 1-WINDOW, 2-FIXED Отображает все графические окна. Стиль отображения задается вторым параметром.
  GRWTEXTH 2 1-WINDOW;
2-STRING
Возвращает ВЫСОТУ прямоугольника, объемлющего текст, заданный ВТОРЫМ параметром в окне, заданным ПЕРВЫМ параметром.
  GRWTEXTW 2 1-WINDOW;
2-STRING
Возвращает ШИРИНУ прямоугольника, объемлющего текст, заданный ВТОРЫМ параметром в окне, заданным ПЕРВЫМ параметром.
  GRWTRANSPARENT 2 1-WINDOW;
2-FIXED
Задает прозрачность окна, заданного ПЕРВЫМ параметром. Прозрачность задается значением ВТОРОГО параметра, которое должно лежать в диапазоне 0 - 255.
GRWARC  

Функция GRWARC принимает семь аргументов: идентификатор окна, координаты центра, радиус окружности, угол начала и угол конца дуги, цвет задается последним параметром (битовой шкалой). Вот подробный пример рисования дуги.


(grwCreate 'w 200 200 "Проба" &HFFFFFF)

==> w

(grwShow 'w)

==> w

(grwScale 'w -100 100 -100 100)

==> w

(grwArc 'w 0 0 30 0 (/ _pi 2) &HFF0000)

==> w

После выполнения этого фрагмента можно увидеть следующий результат:

GRWARCE  

Функция GRWARCE принимает восемь аргументов: идентификатор окна, координаты центра, радиус окружности, угол начала и угол конца дуги. Седьмой аргумент задает аспект (соотношение осей). Цвет дуги задается последним параметром (битовой шкалой). Вот подробный пример рисования дуги эллипса.


(grwCreate 'w 200 200 "Проба" &HFFFFFF)

==> w

(grwShow 'w)

==> w

(grwScale 'w -100 100 -100 100)

==> w

(grwArc 'w 0 0 30 0 _pi 2 &HFF)

==> w

После выполнения этого фрагмента можно увидеть следующий результат:

GRWBEZIER  

Рисование кривых Безье (сплайнов) входят в стандартный графический интерфейс Windows (GDI). Добавить соответствующую функцию в число графических функций HomeLisp оказалось несложно. Функция GRWBEZIER принимает два параметра - идентификатор графического окна и список пар xi,yi. Для рисования одной кривой пар должно быть 4 - они задают опорные точки сплайна. Сам сплайн рисуется установленным цветом и жирностью. Если нужно нарисовать серию кривых, то для рисования первой кривой задются 4 опорные точки, а для каждой последующей - по три (начальная точка следующей кривой будет совпадать с концом предыдущей). Вот пример:


(prog (w x0 y0 x1 y1 x2 y2 x3 y3 xx0 xx1 xx2 xx3 yy0 yy1
         yy2 yy3 ff fi sinfi cosfi)

      (grwCreate 'w 400 400 "Набор кривых Безье" _WHITE)

      (grwScale 'w -120 120 -120 120)

      (grwSetParm 'w 2 7 _GREEN _BLUE)

      (grwShow 'w)

      (setq x0 10)
      (setq y0 10)

      (setq x1 -20)
      (setq y1 20)

      (setq x2 70)
      (setq y2 -70)

      (setq x3 80)
      (setq y3 80)

      (dolist (ff '(0 45 90 135 180 225 270 315) T)

                   (setq fi (* _Pi (/ ff 180.)))
                   (setq sinfi (sin fi))
                   (setq cosfi (cos fi))
 
                   (setq xx0 (+ (* x0 cosfi) (* y0 sinfi)))
                   (setq yy0 (- (* y0 cosfi) (* x0 sinfi)))
 
                   (setq xx1 (+ (* x1 cosfi) (* y1 sinfi)))
                   (setq yy1 (- (* y1 cosfi) (* x1 sinfi)))

                   (setq xx2 (+ (* x2 cosfi) (* y2 sinfi)))
                   (setq yy2 (- (* y2 cosfi) (* x2 sinfi)))

                   (setq xx3 (+ (* x3 cosfi) (* y3 sinfi)))
                   (setq yy3 (- (* y3 cosfi) (* x3 sinfi)))

                   (grwBezier 'w (list xx0 yy0 xx1 yy1 xx2 yy2 xx3 yy3))

                   (setq xx1 (+ (* (- x1) cosfi) (* (- y1) sinfi)))
                   (setq yy1 (- (* (- y1) cosfi) (* (- x1) sinfi)))

                   (setq xx2 (+ (* (- x2) cosfi) (* (- y2) sinfi)))
                   (setq yy2 (- (* (- y2) cosfi) (* (- x2) sinfi)))

                   (grwBezier 'w (list xx0 yy0 xx1 yy1 xx2 yy2 xx3 yy3))

      )

  @Ink  

   (if (= (grwInkey 'w 100) 0) (go @Ink) nil)

   (grwHide 'w)

   (grwDestroy 'w)

   (return 'Ok)
 
)

После выполнения этого фрагмента можно увидеть следующий результат:

GRWCIRCLE  

Функция GRWCIRCLE принимает пять аргументов: идентификатор окна, координаты центра, радиус окружности, и цвет окружности. Вот подробный пример рисования окружности.


(grwCreate 'w 200 200 "Проба" &HFFFFFF)

==> w

(grwShow 'w)

==> w

(grwScale 'w -100 100 -100 100)

==> w

(grwCircle 'w 0 0 30 &HFF00)

==> w

После выполнения этого фрагмента можно увидеть следующий результат:

GRWCLS  

Функция GRWCLS принимает один аргумент - идентификатор окна. Результатом работы функции является стирание графического окна.

GRWCREATE  

Функция GRWCREATE является центральной функцией графической подсистемы HomeLisp. Функция создает графическое окно. Первым параметром функции должен быть "чистый" (не имеющий никаких индикаторов) атом. Этот атом при успешном завершении получит в свой список свойств индикатор WINDOW. Второй и третий параметры функции задают размеры формы (в пискелах). Четвертый параметр задает заголовок окна. Пятый параметр задает цвет фона области рисования.


(grwCreate 'w 300 300 "Окно" &HEEDDBB)

==> w

(grwShow 'w)

==> w

После выполнения приведенного выше программного кода, можно увидеть графическое окно соответствующих размеров:

Полезно посмотреть список свойств атома - идентификатора окна:


(proplist 'w)

==>  (WINDOW width 300 height 300 title 
             "Окно" backcolor &HEEDDBB WINHANDLE 1)

Из списка свойств отчетливо видны все свойства сконструированного окна. Последний параметр (WINHANDLE) - это внутренний номер окна. Если же попытаться создать окно с атомом-идентификатором, который уже имеет какие-либо стадартные флаги FIXED, FLOAT, STRING и др. ("нечистый" атом), то окно не создается и выводится сообщение об ошибке:


(grwCreate 1 200 200 "" &HFFFFFF)

grwCreate: недопустимый флаг у первого аргумента
==>  ERRSTATE

Попытка создать создать окно с атомом-идентификатором, который уже имеет в списке свойств флаг WINDOW вызывает состояние ошибки:


(grwCreate 'w 200 200 "" &HFFFFFF)

==>  w

(grwCreate 'w 300 300 "" &H00FF00)

grwCreate: окно w уже существует
==>  ERRSTATE

Если же у атома-идентификатора уже был список свойств, но без стандартных флагов, то этот список полностью заменяется списком, присущим окну:



(spropl 'w '(a s d))

==>  (a s d)

(proplist 'w)

==>  (a s d)

(grwCreate 'w 200 300 "Окно" _AQUA)

==>  w

(proplist 'w)

==>  (WINDOW width 200 height 300 title 
             "Окно" backcolor &H00FFFF WINHANDLE 1)

Параметры созданного окна можно менять, модифицируя список свойств окна. Для этого можно использовать функцию PUTPROP. Допустимо менять индикаторы width, height, title и backcolor. Параметр winhandle менять нельзя (при попытке будет возбуждено состояние ошибки). Изменение параметров в списке свойств окна вызывает мгновенное изменение соответствующих внешних свойств. При этом проверяется тип устанавливаемого значения (для ширины и высоты - FIXED/FLOAT, для заголовка - STRING, для фона - BITS); при несоответствии типа возбуждается ошибка и модификация не выполняется.

Рассмотрим пример. Создадим и отобразим окно, выполнив следующий код:


(grwCreate 'w1 200 200 "Окно" _WHITE)

==> w1

(grwShow 'w1)

==> w1

Результат показан на приведенном ниже рисунке:

Теперь заменим в списке свойств окна w1 значение индикатора backcolor на константу _LIME, а индикатор width на 300:


(putprop 'w1 'backcolor _LIME)

==> w1

(putprop 'w1 'width 300)

==> w1

Результат представлен на рисунке:

GRWDESTROY  

Функция GRWDESTROY уничтожает ранее созданное графическое окно.


(grwCreate 'w 300 300 "Окно" &HEEDDBB)

==> w

(grwShow 'w)

==> w

(proplist 'w)

==> (WINDOW width 300 height 300 title "Окно" backcolor &HEEDDBB WINHANDLE 1)

(grwDestroy 'w)

==> T

(proplist 'w)

==> Nil

Видно, что после уничтожения окна список свойст идентификатора окна очищается.

GRWDESTROYALL  

Функция GRWDESTROY уничтожает все ранее созданные графические окна (независимо от того, отображены они или нет). Функция не требует параметров.


(grwCreate 'w1 300 300 "Окно-1" _RED)

==> w1

(grwCreate 'w2 300 300 "Окно-2" _LIME)

==> w2

(proplist 'w1)

==> (WINDOW width 300 height 300 title "Окно-1" backcolor &HFF0000 WINHANDLE 1)

(proplist 'w2)

==> (WINDOW width 300 height 300 title "Окно-2" backcolor &H00FF00 WINHANDLE 2)

(grwDestroyAll)

==> T

(proplist 'w1)

==> NIL

(proplist 'w2)

==> NIL

Видно, что один вызов GRWDESTROYALL уничтожает оба созданных ранее окна.

GRWDRAW  

Функция GRWDRAW реализует т.н. "черепашью графику". Будем считать, что с графическим окном связано перо, которое может перемещаться по области рисования (оставляя или не оставляя следа). Управляют пером специальные графические команды, которые задает второй параметр функции GRWDRAW. Этот параметр должен быть списком. Первый параметр функции - как всегда, идентификатор окна.

Список графических команд имеет вид:

(Код_команды    Число    Код_команды    Число    Код_команды    Число   ...)

Код команды задает действие (направление движения, преобразование координат и т.д.), а число задает численную характеристику действия (величина сдвига, угол поворота, цвет и т.д.). Ниже в таблице приводится полный список графических команд с их описанием.

Команда Описание
При выполнении этих команд перо оставляет след и координаты графического курсора меняются
U nn Сдвиг вверх на величину nn
D nn Сдвиг вниз на величину nn
L nn Сдвиг влево на величину nn
R nn Сдвиг вправо на величину nn
E nn Сдвиг по диагонали вправо и вверх на величину nn
F nn Сдвиг по диагонали вправо и вниз на величину nn
G nn Сдвиг по диагонали влево и вниз на величину nn
H nn Сдвиг по диагонали влево и вверх на величину nn
При выполнении этих команд перо не оставляет следа, а координаты графического курсора меняются
BU nn Сдвиг вверх на величину nn
BD nn Сдвиг вниз на величину nn
BL nn Сдвиг влево на величину nn
BR nn Сдвиг вправо на величину nn
BE nn Сдвиг по диагонали вправо и вверх на величину nn
BF nn Сдвиг по диагонали вправо и вниз на величину nn
BG nn Сдвиг по диагонали влево и вниз на величину nn
BH nn Сдвиг по диагонали влево и вверх на величину nn
При выполнении этих команд перо оставляет след, но координаты графического курсора не меняются
NU nn Сдвиг вверх на величину nn
ND nn Сдвиг вниз на величину nn
NL nn Сдвиг влево на величину nn
NR nn Сдвиг вправо на величину nn
NE nn Сдвиг по диагонали вправо и вверх на величину nn
NF nn Сдвиг по диагонали вправо и вниз на величину nn
NG nn Сдвиг по диагонали влево и вниз на величину nn
NH nn Сдвиг по диагонали влево и вверх на величину nn
Команда абсолютного или относительного сдвига пера в заданную точку
M [+/-] xx [+/-] yy Перемещение пера в точку с координатами (xx,yy). Если перед величиной xx/yy стоит знак плюс или минус, то новое значение координаты получается из текущего значения координаты пера увеличением (уменьшением) на величину xx(yy) - выполняется относительный сдвиг.
Команда поворота системы координат.
T fi Выполняет поворот системы координат на угол fi (в градусах). Если значение fi положительно, то поворот выполняется против часовой стрелки. В противном случае поворот осуществляется по часовой стрелке.
Команда установки цвета линии.
С Сolor Задает цвет линии, которую будет проводить перо. Параметр Color должен иметь тип BITS.
Команда установки цвета заливки.
P Сolor-1 Color-2 Закрашивает область, ограниченную контуром цвета Color-2 цветом Color-1. Параметры Color-1 и Color-2 должны иметь тип BITS.

Ниже приводится пример использования функции GRWDRAW. В двух окнах рисуются две звезды - с шестью лучами и с восемнадцатью лучами.


(grwCreate 'w1 300 300 "Пробное окно - 1" &HFFFFFF)

==> w1

(grwScale 'w1 -100 100 -100 100)

==> w1

(grwSetParm 'w1 1 0 &HFFFFFF &HFF0000)

==> w1

(grwShow 'w1)

==> w1

(setq fi 60.0)

==> 60.0

(grwDraw 'w1 '(C &H0000FF))

==> w1 

(for i 1 6 ( (grwDraw 'w1 '(U 20 R 20))
             (grwDraw 'w1 (list T fi)) 
             (setq fi (+ fi 60.0))
            )
)

==> 6

(grwDraw 'w1 '(M -7 30 P &HEE88AA &H0000FF))

==> w1

(grwCreate 'w2 300 300 "Пробное окно - 2" &HFFFFFF)

==> w2

(grwScale 'w2 -100 100 -100 100)

==> w2

(grwSetParm 'w2 1 0 &HFFFFFF &H0000FF)

==> w2

(grwShow 'w2)

==> w2

(setq fi 20.0)

==> 20.0

(grwDraw 'w2 '(M 50 -60))

==> w2

(for i 1 18 ( (grwDraw 'w2 '(U 20 R 20))
              (grwDraw 'w2  (list T fi))
              (setq fi (+ fi 20.0)) 
            )
)

==> 18

(grwDraw 'w2 '(M 0 0 P &H6688AA &H0000FF))

==> w2

А вот результат выполнения этой программы:

GRWELLIPSE  

Функция GRWELLIPSE рисует эллипс. Первый параметр, как всегда, задает окно. Второй и третий параметры задают координаты центра эллипса. Четвертый параметр задает радиус, а пятый - цвет эллипса. Отношение полуосей эллипса (аспект) задает последний, шестой параметр. Если выполнить приведенные ниже команды:


(grwCreate 'w 300 300 "Эллипс" _WHITE)

==> w

(grwEllipse 'w 100 100 60 _RED 0.7)

==> w

то можно увидеть такую картинку:

Если аспект эллипса меньше единицы (как в приведенном выше примере), то горизонтальная ось эллипса будет больше вертикальной. В противном случае вертикальная ось будет больше горизонтальной. Если выполнить следующие команды:


(grwCls 'w)

==> w

(grwEllipse 'w 120 120 80 _BLUE 1.4)

==> w

то получим:

GRWFILL  

Функция GRWFILL выполняет заливку замкнутого контура заданным цветом заливки. Первым параметром функции должен быть идентификатор окна. Второй и третий параметр задают координаты точки, куда будет "литься" краска. Будем называть эту точку начальной точкой заливки. Четвертый параметр задает цвет заливки, а пятый - цвет ограничивающего контура. Ниже приводится пример заливки внутренности эллипса:


(grwCreate 'w 300 300 "Эллипс" _WHITE)

==> w

(grwEllipse 'w 120 120 80 _BLUE 1.4)

==> w

(grwFill 'w 120 120 _YELLOW _BLUE)

==> w

Результат будет таким:

Функция GRWFILL коварна - если неверно задать координаты точки заливки, то результат может оказаться обескураживающим - вместо заливки внутренности контура может оказаться залитым все окно, а внутренность контура как раз останется незалитой. В этом можно убедиться, выполнив следующие команды:


(grwCls 'w)

==> w

(grwEllipse 'w 120 120 80 _BLUE 1.4)

==> w

(grwFill 'w 246 150 _YELLOW _BLUE)

==> w

Результат будет таким:

Заливка выполняется следующим образом. Из начальной точки заливки цвет распространяется во все стороны, пока не встретит точку с цветом контура (последний параметр). Если начальная точка заливки лежит вне контура, то цветом будет залита вся область окна, за исключением контура. Внутрь контура краска не распространится.

Еще хуже будет в том случае, когда контур окажется незамкнутым, - в этом случае краска "выльется" за пределы контура и зальет всю область окна. Если нарисовать, например, дугу окружности, оставив небольшой промежуток, то даже при правильном выборе точки заливки краска зальет все окно. На приводимой ниже врезке демонстрируется именно такая ситуация.


(grwCreate 'w 300 300 "Заливка" _WHITE)

==> w

(grwShow 'w)

==> w

(grwArc 'w 100 100 80 0 6 _BLUE)

==> w

(grwFill 'w 100 100 _YELLOW _BLUE)

==> w

После выполнения этих команд пользователь увидит вот такую картинку:

Осталось добавить, что для заливки простейших объектов (боксов, кругов, эллипсов) нет смысла использовать GRWFILL - для кругов и эллипсов можно установить стиль заполнения, а для рисования заполненных боксов есть специальная функция.

GRWFONT  

Функция GRWFONT устанавливает некоторые параметры фонта для вывода текста. Первым параметром вызова должен быть идентификатор окна. Вторым параметром должен быть атом строкового типа, задающий имя гарнитуры фонта. Третий параметр задает размер шрифта в пунктах. Четвертый и пятый параметры должны принимать значения T или Nil. Четвертый параметр задает жирность шрифта (T - жирный, Nil - обычный). Пятый параметр задает курсив (T - курсив, Nil - обычный). По умолчанию у графического окна устанавливается шрифт "Courier New" с размером 8 пунктов.

Вот пример использования разных шрифтов:


(grwCreate 'w 300 300 "Разные шрифты" _WHITE)

==> w

(grwFont 'w "Times New Roman" 14 T Nil)

==> w

(grwPrint 'w 1 10 "Проба пера" _BLUE)

==> w

(grwFont 'w "Tahoma" 9 T T)

==> w

(grwPrint 'w 1 40 "Проба пера" _NAVY)

==> w

Результат будет таким:

GRWFRECT  

Функция GRWFREC рисует заполненный прямоугольник. Первый параметр - идентификатор окна. Второй и третий параметры - координаты левого верхнего угла прямоугольника. Четвертый и пятый параметры - координаты правого нижнего угла. Последний параметр битового типа задает цвет прямоугольника. Пример вызова функции GRWFREC приводится ниже:


(grwCreate 'w 300 300 "Заполненные прямоугольники" _WHITE)

==> w

(grwFRect 'w 10 10 100 100 _MAROON)

==> w

(grwFRect 'w 50 50 160 160 _YELLOW)

==> w

(grwFRect 'w 200 60 250 110 _GREEN)

==> w

Результат будет таким:

GRWHIDE  

Функция GRWHIDE скрывает (но не уничтожает) окно, идентификатор которого задан ее единственным параметром. Если параметр функции не является идентификатором никакого окна, то возникает ошибка. Если окно с заданным идентификатором уже скрыто - функция не выполняет никаких действий.

GRWHIDEALL  

Функция GRWHIDEALL (не требующая параметров) скрывает (но не уничтожает) все созданные графические окна. Если в момент вызова окна отсутствуют, функция не выполняет никаких действий. Функция возвращает количество скрытых графических окон на момент вызова. Таким образом, если окна отсутствуют - функция вернет нуль.

GRWINKEY  

Функция GRWINKEY возвращает скан-код нажатой клавиши из клавиатурного буфера графического окна, заданного первым параметром функции. Второй (необязательный) параметр функции задает задержку в миллисекундах, выполняемую после опроса клавиатурного буфера графического окна. Клавиатурный буфер окна хранит код последней клавиши, нажатой, когда фокусом ввода владело данное окно. Если клавиатурный буфер окна пуст, функция возвращает нуль. Чтобы обеспечить ожидание нажатия клавиши, можно написать простейшую функцию вида:


(defun kbd (wi) (prog (x) 

          GetKey (setq x (grwInkey wi)) 

                 (cond ((eq x 0) (go GetKey)))

                 (return x)

                )
)

==> kbd

Если теперь для существующего окна с идентификатором w вызвать функцию kbd так: (kbd 'w), среда HomeLisp не вернет управления до тех пор, пока пользователь не нажмет какую-либо клавишу, предварительно активизировав окно w.

Основное назначение функции GRWINKEY - организация графических меню. Пример такого меню приведен в разделе "Примеры программ".

Коды, возвращаемые при нажатии клавиш с буквами, цифрами и специальными знаками, соответствуют ASCII-кодам символов, изображенных на этих клавишах (без учета регистра). Список кодов клавиш управления приводится ниже.

Клавиша Код
Стрелка вверх 38
Стрелка вниз 40
Стрелка вправо 39
Стрелка влево 37
Insert 45
Home 36
Page Up 38
Page Down 34
End 35
F1 - F12 112 - 123

Если одновременно с какой-либо клавишей нажат клавишный переключатель (Ctrl, Shift или Alt), то функция GRWINKEY вернет целое, вычисляемое по следующему правилу:

Код=(Код_ASCII)+256*Ctrl+512*Shift+1024*Alt

где Ctrl, Shift и Alt есть целые числа, равные единице, если нажат соответствующий переключатель и нулю в противном случае. Так, если нажато сочетание Shift-2, то функция GRWINKEY вернет код 562, что, в свою очередь, равно 50+512 (50 - скан-код "2", а 512 - признак Shift).

GRWLINE  

Функция GRWLINE рисует отрезок прямой. Первым параметром функции является идентификатор окна. Второй и третий пареметры - это координаты левого начала отрезка. Четвертый и пятый параметры - это координаты конца отрезка. Шестой параметр задает цвет отрезка. Толщина линии определяется текущими установками (см. функцию GRWSETPARM). Если для окна установлена система мировых координат (масштаб), то параметры 2-4 должны быть мировыми координатами, в противном случае используется экранная система координат. Вот примеры рисования отрезков:


(grwcreate 'w 300 300 "Отрезки" _WHITE)

==> w

(grwLine 'w 10 10 90 90 _BLUE)

==> w

(grwsetparm 'w 2 1)

==> w

(grwLine 'w 20 10 90 120 _RED)

==> w

(grwScale 'w -100 100 -100 100)

==> w

(grwLine 'w -100 0 100 0 _BLACK)

==> w

В приводимом выше наборе команд выполняются следующие действия:

- Создается окно 300*300 с белым фоном;

- Проводится голубая линия от точки (10,10) к точке (90,90);

- Для окна устанавливается двойная толщина рисования;

- Проводится красная линия от точки (20,10) к точке (90,120);

- Для окна задается масштаб по обеим осям от -100 до 100;

- Проводится горизонтальная черная линия от точки (-100,0) к точке (100,0).

Все это порождает следующую картинку:

GRWLOADPIC  

Функция GRWLOADPIC загружает в окно с идентификатором, заданным первым параметром, графическое изображение из файла, с именем, заданным вторым параметром. Поддерживаются форматы графических файлов BMP, GIF и JPG. Третий параметр может принимать значение 0 или 1. Нуль означает, что изображение не подстраивается под размеры окна (не растягивается и не сжимается). Если значение третьего параметра равно единице, то изображение подстраивается под размеры окна. Все это демонстрируется следующим примером:


(grwCreate 'w1 300 400 "Кошка" &HFFFFFF)

 ==>  w1

(grwShow 'w1)

 ==>  w1

(grwLoadPic 'w1 "..\cat-117.jpg" 0)

 ==>  w1

(grwCreate 'w2 300 400 "Кошка" &HFFFFFF)

 ==>  w2

(grwShow 'w2)

 ==>  w2

(grwLoadPic 'w2 "..\cat-117.jpg" 1)

 ==>  w2

Здесь создаются два окна. В оба загружается одна и та же картинка с растяжением и без. Результат будет таков:

Результ работы (grwLoadPic 'w1 "..\cat-117.jpg" 1)
Последний параметр равен 1
выполняется растяжение картинки.
Результ работы (grwLoadPic 'w2 "..\cat-117.jpg" 0)
Последний параметр равен 0
растяжение картинки не выполняется.
GRWPOINT  

Функция GRWPOINT возвращает цвет точки окна, заданного первым параметром и координатами, заданными вторым и третьим параметрами. Цвет представляется битовой шкалой (тип BITS). Если для окна установлена система мировых координат (масштаб), то параметры 2 и 3 должны быть мировыми координатами, в противном случае используется экранная система координат. Вот пример вызова функции GRWPOINT:


(grwcreate 'w 300 300 "Проба" _WHITE)

==> w

(grwScale 'w -100 100 -100 100)

==> w

(grwFrect 'w -50 -50 50 50 _RED)

==> w

(grwPoint 'w 0 0)

==> &HFF0000

(grwPoint 'w 90 90)

==> &HFFFFFF

Здесь создается окно, устанавливается масштаб (-100,-100) - (100,100) и в центре окна рисуется красный прямоугольник. Затем проверяется цвет точки в центре прямоугольника. Он получается красным. А цвет точки за пределами прямоугольника оказывется, естественно, белым.

GRWPRINT  

Функция GRWRINT предназначена для вывода текста в графическом окне. Первый параметр функции, как обычно, задает окно. Второй и третий параметры задают левый верхний угол прямоугольника, в котором будет выводиться текст. Если для окна установлена система мировых координат (масштаб), то эти параметры должны быть мировыми координатами, в противном случае используется экранная система координат. Сам текст задается четвертым параметром. Цвет текста задается пятым параметром. Используется текщий фонт (который можно сменить, вызвав функцию GRWFONT). Вот комплексный пример, демонстрирующий возможности функции GRWPRINT:


(grwCreate 'w 300 300 "Проба печати" &HAADDFF)

==> w

(grwSetParm 'w 1 0 nil &HFF0000)

==> w

(grwShow 'w)

==> w

(setq y 1)

==> 1

(setq z 8)

==> 8

(for i 1 10 ( 
              (grwFont 'w "Tahoma" z T T)

              (grwPrint 'w 1 y "проба")

              (setq y (+ y 20)) 

              (setq z (+ z 1))
            )
)

==> 10

Выполнив этот код, пользователь должен увидеть вот такую картинку:

GRWPSET  

Функция GRWPSET ставит точку заданного цвета в заданных координатах. Первым параметром функции является идентификатор окна. Второй и третий пареметры - это координаты точки. Третий параметр задает цвет отрезка. "Размер" точки зависит от текущих установок окна (см. функцию GRWSETPARM). Если для окна установлена система мировых координат (масштаб), то параметры 2 и 3 должны быть мировыми координатами, в противном случае используется экранная система координат. Вот примеры рисования точек:


(grwCreate 'w 200 200 "Точки" _WHITE)

==> w

(grwShow 'w)

==> w

(grwPset 'w 2 2 _BLUE)

==> w

(grwSetParm 'w 3)

==> w

(grwPset 'w 10 10 _BLUE)

==> w

(grwPset 'w 20 20 _RED)

==> w

(grwPset 'w 40 40 _LIME)

==> w

(grwPset 'w 50 50 _GREEN)

==>  w

(grwPset 'w 60 60 _TEAL)

==> w

В приводимом выше наборе команд выполняются следующие действия:

- Создается окно 200*200 с белым фоном;

- Ставится голубая точка в координатах (2,2). Поскольку параметр жирности по умолчанию равен 1, точка еле видна ;

- Для окна устанавливается тройная толщина рисования;

- Ставится несколько цветных точек.

Все это порождает следующую картинку:

GRWRECT  

Функция GRWRECT рисует незаполненный прямоугольник. Первый параметр - идентификатор окна. Второй и третий параметры - координаты левого верхнего угла прямоугольника. Четвертый и пятый параметры - координаты правого нижнего угла. Последний параметр битового типа задает цвет прямоугольника. Пример вызова функции GRWRECT приводится ниже:


(grwCreate 'w 300 300 "Незаполненные прямоугольники" _WHITE)

==> w

(grwSetParm 2)

==> w

(grwRect 'w 10 10 100 100 _MAROON)

==> w

(grwRect 'w 50 50 160 160 _YELLOW)

==> w

(grwRect 'w 200 60 250 110 _GREEN)

==> w

Результат будет таким:

GRWREFRESH  

Функция GRWREFRESH обновляет окно, идентификатор которого задан первым параметром вызова. Обновление заключается в том, что выполняются все графические операции, которые, возможно, еще не были выполнены (находились в очереди). Второй параметр (типа FIXED) необязательный. Если он задан, то после обновления окна выполняется задержка выполнения на количество миллисекунд, равное значению второго параметра. Основное назначение функции GRWREFRESH - обновление окна во время анимации (Да-да! Это тоже возможно!)

GRWSAVEPIC  

Функция GRWSAVEPIC сохраняет графическое изображение в файле. Поддерживаются два формата сохранения BMP и GIF. Для сохранения графического изображения в формате GIF использована программа, исходный текст которой любезно опубликовал в 2001 г. Владислав Помелов. Автору настоящего руководства удалось ускорить работу опубликованной программы в 3-4 раза.

Первый параметр функции GRWSAVEPIC - идентификатор окна. Второй параметр (FIXED) - формат сохранения (0-BMP; 1-GIF). Третий параметр (STRING) - имя выходного файла. Ниже приводится пример сохранения изображения:


(grwCreate 'w 300 300 "Пример" _WHITE)

==> w

(grwSetParm 2)

==> w

(grwFRect 'w 10 10 100 100 _MAROON)

==> w

(grwFRect 'w 50 50 160 160 _YELLOW)

==> w

(grwFRect 'w 200 60 250 110 _GREEN)

==> w

(grwSavePic 'w 1 "myPic.gif")

==> w

После выполнения этого кода в текущей директории образуется файл MyPic.gif. Этот файл можно посмотреть:

GRWSCALE  

Функция GRWSCALE устанавливает систему мировых координат для заданного окна. Первым параметром задается идентификатор окна. Второй и третий параметры задают минимум и максимум по оси ОX. Четвертый и пятый параметры задают минимум и максимум по оси ОY. Если для заданного окна уже ранее была установлена система координат, то ее установки сбрасываются и заменяются новыми.

Функция GRWSCALE чрезвычайно удобна, поскольку позволяет рисовать реальные объекты без утомительного пересчета мировых координат в экранные. Так для построения графика функции в диапазоне [Xmin, Xmax] достаточно вычислить значения функции на этом отрезке с досточно мелким шагом и определить максимальное и минимальное значения функции (Ymin и Ymax). После этого следует установить масштаб окна, вызвав функцию GRWSCALE так: (GRWSCALE 'w Xmin Xmax Ymin Ymax). После этого можно просто ставить точки, используя координаты (x,y), где (Xmin <= x <= Xmax) и (Ymin <= y <= Ymax).

GRWSETPARM  

Функция GRWSETPARM позволяет для окна (заданного первым параметром) установить некоторые графические характеристики.

Второй параметр задает ширину линий при рисовании. По умолчанию значение ширины равно 1 (один пиксел).

Третий параметр задает параметры заполнения (для рисования кругов и эллипсов). Этот параметр должен иметь тип FIXED. Значение параметра лежит в диапазоне [0,7]. Ниже приводится табличка, содержащая смысл каждого из значений:

Значение параметра Выполняемое действие
0 Сплошная заливка
1 Нет заливки
2 Горизонтальная штриховка
3 Вертикальная штриховка
4 Диагональная из левого верхнего угла в правый нижний
5 Диагональная штриховка из правого верхнего угла в левый нижний
6 Горизотнальная и вертикальная штриховка (стили 1 и 2 совместно)
7 Диагональная штриховка (стили 4 и 5 совместно)

Четвертый параметр задает цвет заливки (должен иметь тип BITS).

Вот пример установки параметров окна:


(grwCreate 'w 300 300 "Заливка" _WHITE)

==> w

(grwShow 'w)

==> w

(grwSetParm 'w 3 7 _GREEN)

==> w

(grwCircle 'w 50 50 40 _YELLOW)

==> w

После выполнения этого программного кода пользователь увидит следующее:

GRWSHOW  

Функция GRWSHOW отображает окно, идентификатор которого задан ее первым параметром и устанавливает на это окно фокус ввода. Если параметр функции не является идентификатором никакого окна, то возникает ошибка. Если окно с заданным идентификатором уже отображено и имеет фокус ввода - функция не выполняет никаких действий.

Второй и третий параметры являются необязательными. Они задают координаты в пикселах левого верхнего угла графического окна (второй параметр - Х, третий - Y).

В скриптах поведение функции имеет следующую особенность: если в момент вызова функции какое-либо другое окно уже отображено, то это окно скрывается, а затем отображается окно, заданное параметром вызова GRWSHOW. Таким образом, при работе в составе скриптовых движков в данный момент отображенным на экране может быть только одно графическое окно.

GRWSHOWALL  

Функция GRWSHOWALL отображает все графические окна, существующие в момент вызова. Функция GRWSHOWALL доступна в среде IDE и в составе exe-файла. В скриптах функция недоступна. Функция требует единственный параметр типа FIXED, принимающий одно из значений:

 0 - отображать окна без позиционирования;

 1 - отображать окна каскадом;

-1 - отображать окна таблицей;


Ниже приводится пример табличного расположения пяти графических окон:

Те же самые окна, отображенные каскадом, выглядят так:

GRWTEXTH  

Функция GRWTEXTH возвращает высоту прямоугольника, объемлющего текст, заданный вторым параметром функции (а первый параметр - это, как всегда, идентификатор окна).

Ниже приводится пример использования функции GRWTEXTH (а также функции GRWTEXTW) для риcования объемлющего прямоугольника, заключающего текст.


(grwCreate 'w 200 200 "Текст" _WHITE)

==> w

(grwShow 'w)

==> w

(grwFont 'w "Tahoma" 14 T)

==> w

(grwTexth 'w "Проба")

==> 23

(grwTextw 'w "Проба")

==> 62

(grwPrint 'w 20 20 "Проба" _RED)

==> w

(grwRect 'w 20 20 82 43 _NAVY)

==> w

Пользователь может увидеть, как текст заключается в объемлющий прямоугольник:

GRWTEXTW  

Функция GRWTEXTW возвращает ширину прямоугольника, объемлющего текст, заданный вторым параметром функции (а первый параметр - это, как всегда, идентификатор окна).

Ниже приводится пример использования функции GRWTEXTW (а также функции GRWTEXTH) для риcования объемлющего прямоугольника, заключающего текст.


(grwCreate 'w 200 200 "Текст" _WHITE)

==> w

(grwShow 'w)

==> w

(grwFont 'w "Tahoma" 14 T)

==> w

(grwTexth 'w "Проба")

==> 23

(grwTextw 'w "Проба")

==> 62

(grwPrint 'w 20 20 "Проба" _RED)

==> w

(grwRect 'w 20 20 82 43 _NAVY)

==> w

Пользователь может увидеть, как текст заключается в объемлющий прямоугольник:

GRWTRANSPARENT  

Функция GRWTRANSPARENT задает прозрачность графического окна. Функция принимает два обязательных параметра: идентификатор окна и фактор прозрачности. Последний параметр должен быть целым числом в диапазоне от 0 до 255. Нулю соответствует полная прозрачность, а величине 255 - полная непрозрачность (стандартный режим отображения окна). При успехе функция возвращает идентификатор окна. При неуспехе возникает ошибка.

Ниже приводится пример использования функции GRWTRANSPARENT.


(grwCreate 'w1 200 200 "Обычное окно" _WHITE)

==> w1

(grwCreate 'w2 200 200 "Прозрачное окно" _WHITE)

==> w2

(grwTransparent 'w2 125)

==> w2

(grwShowAll -1)

==> 2

Рисунок все объясняет. Прозрачность окна, естественно, можно менять многократно.

Сайт создан в системе uCoz