БОЛЬШОЙ FAQ ПО DELPHI



Как узнать края печати в Win16 и Win32

В Win16, для этого используется API функция Escape() с константой GETPRINTINGOFFSET. В Win32, используется API функция GetDeviceCaps() с константами PHYSICALOFFSETX и PHYSICALOFFSETY. Однако, нет гарантии, что данная последовательность кодов поддерживается принтером, поэтому для проверки желательно всегда вызывать функцию Escape с константой QUERYESCSUPPORT.

Следующий пример возвращает отступы печати как в WIN16, так и в WIN32, учитывая тот факт, что не все принтеры поддерживают код GETPRINTINGOFFSET (в WIN16). Если дело обстоит так, то смещение печати вычисляется приближённо, получая размер страницы, вычитая физическую разрешающую способность устройства, и деля пополам.

Пример:


 uses Printers;
 
 procedure TForm1.Button1Click(Sender: TObject);
 var
   EscapeCode: integer;
   Margin: TPoint;
 begin
   if PrintDialog1.Execute then begin
 {$IFDEF WIN32}
     Margin.x := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
     Margin.y := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
 {$ELSE}
     EscapeCode := GETPRINTINGOFFSET;
     if Escape(Printer.Handle,
       QUERYESCSUPPORT,
       sizeof(EscapeCode),
       @EscapeCode,
       nil) <> 0 then
       if Escape(Printer.Handle,
         GETPRINTINGOFFSET,
         0,
         nil,
         @Margin) < 1 then begin
         EscapeCode := GETPHYSPAGESIZE;
         if Escape(Printer.Handle,
           QUERYESCSUPPORT,
           sizeof(EscapeCode),
           @EscapeCode,
           nil) <> 0 then
           if Escape(Printer.Handle,
             GETPHYSPAGESIZE,
             0,
             nil,
             @Margin) > 0 then begin
             Margin.x := (Margin.x -
               GetDeviceCaps(Printer.Handle, HorzRes)) div 2;
             Margin.y := (Margin.y -
               GetDeviceCaps(Printer.Handle, VertRes)) div 2;
           end else begin
             Margin.x := 0;
             Margin.y := 0;
           end;
       end;
 {$ENDIF}
     Memo1.Lines.Add(IntToStr(Margin.x));
     Memo1.Lines.Add(IntToStr(Margin.y));
   end;
 end;
 
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Видеокурс ВЗЛОМ