Шаг 23.
Visual Prolog.
Печать

    На этом шаге мы рассмотрим печать.

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

    На следующем шаге мы рассмотрим добавление элементов управления в окно часов.




Предыдущий шаг Содержание Следующий шаг