Delphi World - Как узнать края печати в Win16 и Win32
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как узнать края печати в 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;


Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования