На этом шаге мы рассмотрим печать.
Печать инициируется вызовом предиката 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 Кб).
На следующем шаге мы рассмотрим добавление элементов управления в окно часов.