15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

Компилятор: Delphi

В 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;