На этом шаге мы рассмотрим печать.
Печать инициируется вызовом предиката print_startJob и завершается вызовом предиката print_EndJob. Каждая страница должна быть выделена парой предикатов: print_StartPage и print_EndPage. Все предикаты изображения работают как обычно, за исключением того, что они должны иметь дескриптор окна печати в качестве параметра окна.
Printwin=print_StartJob("Printing Sweep drawing"),
print_StartPage(Printwin),
Draw to the Printwindow
print_EndPage(Printwin),
print_EndJob(Printwin).
Обычно у принтера разрешающая способность намного выше, чем у экрана монитора, поэтому если вы просто копируете код рисования на окне, то результатом, скорее всего, будут очень маленькие изображения.
Решение - в применении предикатов масштабирования. Система GUI может преобразовывать любые координаты в другую систему координат, пропорционально изменяя размеры изображения. Масштабирование выполняется вызовом предикатов set_MapMode и set_MapScale.
Сначала мы выясняем ширину окна, вызывая предикат win_Getclient, а затем - ширину бумаги на принтере, вызывая предикат vpi_GetAttrVal (attr_printer_width).
Во всплывающем меню Sweep вам нужно создать пункт Print с константой id_print. Используя следующие предложения, вы можете распечатать окно Sweep.
win_sweep_eh(_Win,e_Menu(id_print,_),0):-!,
ScreenRCT=win_GetClientRect(_Win),
ScreenRCT=rct(_,_,WinSize,_),
PRINTWIN=print_StartJob("Printing Sweep drawing"),
print_StartPage(PRINTWIN),
PrnSize=vpi_GetAttrVal(attr_printer_width),
win_SetMapMode(PRINTWIN,mm_arbitrary),
win_SetMapScale(PRINTWIN,pnt(0,0),
pnt(WinSize,WinSize),
pnt(0,0),
pnt(PrnSize,PrnSize)),
sweep_Draw(PRINTWIN,_Win),
print_EndPage(PRINTWIN),
print_EndJob(PRINTWIN).
Обратите внимание, что предикат sweep_Draw был изменен: теперь он принимает на вход два параметра:
predicates
sweep_Draw(window Win,window AssertWin)
clauses
sweep_Draw(_Win,AssertWin):-
win_Clear(_Win,color_White),
findall(X,point(AssertWin,X),List),
connect(_Win,List).
Причина в том, что один из параметров фактов point является дескриптором окна Sweep (в котором находятся сохраненные точки). Предикату необходимы дескриптор для принтера (окно печати) и дескриптор окна Sweep. Возможно, вам пригодятся эти навыки при создании собственных приложений, если потребуется открывать несколько окон одного и того же типа.
Созданное приложение можно взять здесь (443,7 Кб).
На следующем шаге мы рассмотрим добавление элементов управления в окно часов.