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