5.9. Предикаты рисования
Мой шестнадцатилетний сын думает, что языки программирования используются
только для создания игр, рисования, графики и тому подобного. Если вы
придерживаетесь того же мнения, вам необходимо глубоко изучить предикаты
рисования. Для них потребуется дескриптор (handle
1
) окна, в котором будут выполняться
рисунки и чертежи. Вот как вы можете получить дескриптор:
clauses
onPaint(S, _Rectangle, _GDIObject) :-
W= S:getVPIWindow(), draw::drawThem(W).
Дескриптор W будет передаваться в класс draw. Например, в предложении
drawThem(Win) :- connections(Win), drawCities(Win).
он передается в connections/1, в котором является первым аргументом drawLine/3:
connections(Win) :- conn(P1, P2), drawLine(Win, P1, P2), fail.
Предикат drawLine(Win, P1, P1) проводит линию из P1 в P2 в окне Win. Как вы уже
знаете, P1 и P2 — точки вида pnt(10, 20). Предикат
drawEllipse(W, rct(X1, Y1, X2, Y2)),
с которым вы уже знакомы, проводит эллипс в окне W. Эллипс вписывается в
прямоугольник rct(X1, Y1, X2, Y2), где X1, Y1 — координаты верхнего левого угла, а
X2, Y2 — координаты нижнего правого угла.
5.10. Объект GDI
В последнем примере рисование производилось в обработчике события onPaint. В
этом случае хорошей идеей может быть использование методов так называемого GDI-
объекта. Рассмотрим следующий пример.
Project Settings. Создайте следующий проект:
Project Name: drawMapObj
UI Strategy: Object-oriented GUI (pfc/gui)
Target type: Exe
Base Directory: C:\vispro
Создайте пакет: plotter.
Создайте форму внутри plotter: map.
Project Tree/TaskMenu.mnu. Включите пункт меню File/New. Постройте
(Build/Build) приложение, для того чтобы включить форму map в проект.
Project Tree/TaskWindow.win/Code Expert. Добавьте код
1
На данный момент вам не обязательно знать, что такое handle – прим. авт.