AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Print Scrollbox in richtiger Größe
Thema durchsuchen
Ansicht
Themen-Optionen

Print Scrollbox in richtiger Größe

Ein Thema von Cordt · begonnen am 27. Nov 2020 · letzter Beitrag vom 8. Feb 2021
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.535 Beiträge
 
Delphi 12 Athens
 
#1

AW: Print Scrollbox in richtiger Größe

  Alt 26. Jan 2021, 19:11
MSDN-Library durchsuchenMM_ANISOTROPIC
https://docs.microsoft.com/en-us/win...gdi-setmapmode

Im Prinzip geben diese APIs ein Mapping an, wie die Pixel von deinem Canvas auf den Pixeln des Devices dargestellt werden sollen.
z.B. MM_LOMETRIC wäre 10 Pixel je 1 Millimeter (mit den DPI, für das Devices)



Alternativ könntest du auf ein TBitmap-Canvas zeichnen und dieses dann via StretchDraw auf Canvas des Printers malen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Jan 2021 um 19:23 Uhr)
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
32 Beiträge
 
#2

AW: Print Scrollbox in richtiger Größe

  Alt 27. Jan 2021, 08:25
Okay, vielen Dank, mit dem Link bin ich tatsächlich durchgekommen und kann jetzt sichtbar drucken.
Ich werde noch mit ein paar anderen Drucken rumexperimentieren, vllt muss ich das noch ein wenig fein-tunen, aber damit kann ich zumindest mal arbeiten.
Danke vielmals

Delphi-Quellcode:
var
PrintDialog : TPrintDialog;
begin
  PrintDialog := TPrintDialog.Create(self);
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;

    SetGraphicsMode(Printer.Canvas.Handle, GM_ADVANCED);
    SetMapMode(Printer.Canvas.Handle,MM_ANISOTROPIC);

    SetViewportExtEx(Printer.Canvas.Handle, 5,5, nil);

    ScrollBoxToCanvas(ScrollBox1,Printer.Canvas) ;
    Printer.EndDoc;
  end;
end;

procedure TFormKampf.ScrollBoxToCanvas(ScrollBox:TScrollBox; Canvas:TCanvas);
var saveY, Y, SchrittY:integer;
    saveX, X, SchrittX:integer;
    abbruchY, abbruchX:boolean;
    saveBorderStyle:TBorderStyle;
begin
  saveY:=ScrollBox.VertScrollBar.Position;
  saveX:=ScrollBox.HorzScrollBar.Position;
  saveBorderStyle:=ScrollBox.BorderStyle;

  ScrollBox.BorderStyle:=bsNone;
  ScrollBox.VertScrollBar.Position:=0;
  Y:=0;
  SchrittY:=ScrollBox.Height-100;
  repeat
    ScrollBox.HorzScrollBar.Position:=0;
    X:=0;
    SchrittX:=ScrollBox.Width-100;
    abbruchY:=(ScrollBox.VertScrollBar.Position <> Y);
    repeat
      abbruchX:=(ScrollBox.HorzScrollBar.Position <> X);
      ScrollBox.Refresh;
      ScrollBox.PaintTo(Canvas,ScrollBox.HorzScrollBar.Position,
                               ScrollBox.VertScrollBar.Position);
      ScrollBox.HorzScrollBar.Position:=ScrollBox.HorzScrollBar.Position + SchrittX;
      X:=X+SchrittX;
    until abbruchX;
    ScrollBox.VertScrollBar.Position:=ScrollBox.VertScrollBar.Position + SchrittY;
    Y:=Y+SchrittY;
  until abbruchY;
  ScrollBox.VertScrollBar.Position:=saveY;
  ScrollBox.HorzScrollBar.Position:=saveX;
  ScrollBox.BorderStyle:=saveBorderStyle;
end;
  Mit Zitat antworten Zitat
Cordt

Registriert seit: 10. Jan 2013
32 Beiträge
 
#3

AW: Print Scrollbox in richtiger Größe

  Alt 8. Feb 2021, 22:14
Okay, vielen Dank, mit dem Link bin ich tatsächlich durchgekommen und kann jetzt sichtbar drucken.
Ich werde noch mit ein paar anderen Drucken rumexperimentieren, vllt muss ich das noch ein wenig fein-tunen, aber damit kann ich zumindest mal arbeiten.
Danke vielmals

Delphi-Quellcode:
var
PrintDialog : TPrintDialog;
begin
  PrintDialog := TPrintDialog.Create(self);
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;

    SetGraphicsMode(Printer.Canvas.Handle, GM_ADVANCED);
    SetMapMode(Printer.Canvas.Handle,MM_ANISOTROPIC);
//Markiert
    SetViewportExtEx(Printer.Canvas.Handle, 5,5, nil);

    ScrollBoxToCanvas(ScrollBox1,Printer.Canvas) ;
    Printer.EndDoc;
  end;
end;

Es ist natürlich sinnvoller, wenn das auf mehr als dem hauseigenen Drucker funktioniert. Dazu habe ich an oben "//Markierter" Stelle folgendes ergänzt
Delphi-Quellcode:
      cxpage := GetDeviceCaps(Printer.Canvas.Handle, HORZRES);
      cypage := GetDeviceCaps(Printer.Canvas.Handle, VERTRES);

      SetWindowExtEx(Printer.Canvas.Handle, 963, 1346, nil);
      SetViewportExtEx(Printer.Canvas.Handle, cxpage,cypage, nil);
Das SetWindowExtEx bekommt die Größe des Elements (in dem Fall der Scrollbox) mit und SetViewportExtEx die Werte, die der Drucker selbst liefert.

Gruß
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz