[Printers+Winapi] Nowa orientacja papieru podczas drukowania

0
uses Printers;

begin
Printer.BeginDoc();
Printer.Canvas.TextOut(100, 100, 'Strona 1');
Printer.Orientation:=poLandscape;
//Printer.NewPage();
Printer.Canvas.TextOut(100, 100, 'Strona 2');
Printer.EndDoc();
end;

Chcę osiągnąć taki efekt, jak w powyższym kodzie, ale choć Printer jest nakładką na funkcje Winapi, nie udostępnia zmiany orientacji papieru w trakcie zadania drukowania. Z obserwacji innych programów (choćby Ms Word) widać wyraźnie, że Winapi to umożliwia.

Stworzyłem zmodyfikowaną wersję pliku nagłówkowego Printers, ale mimo tego nie wiem, jak zmienić metodę SetOrientation, aby kończyła bieżącą stronę, zmieniała ustawienia strony i rozpoczynała nową, w ramach jednego zadania. Bez względu jak kombinuję, nie udaje mi się osiągnąć efektu - albo przerywa mi drukowanie całkowicie, albo je zawiesza.

Ma ktoś jakiś pomysł?

0

Nie lubię samemu odpowiadać na własne pytania, ale jakby ktoś potrzebował, niech ma.. tym bardziej, że na necie znaleźć rozwiązanie nie tak łatwo (o ile w ogóle) się da.

Tworzymy sobie nowy unit z kopią unitu Printers i przebudowujemy w nim poniższą procedurę do tej postaci:

procedure TPrinter.NewPage(ChangeOrientation:boolean = FALSE; Value:TPrinterOrientation = poPortrait);
const Orientations: array [TPrinterOrientation] of Integer = (DMORIENT_PORTRAIT, DMORIENT_LANDSCAPE);
begin
  CheckPrinting(True);
  EndPage(DC);
  if (ChangeOrientation) then
    begin
    DevMode^.dmOrientation := Orientations[Value];
    ResetDC(DC, DevMode^);
    end;
  StartPage(DC);
  Inc(FPageNumber);
  Canvas.Refresh;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1