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
Cordt

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

AW: Print Scrollbox in richtiger Größe

  Alt 25. Jan 2021, 20:23
Soo, ich bin jetzt wieder am Druckerproblem und stehe nach wie vor, wie der Ochs vorm Berg.

Kannst du mir die Hilfe mal verlinken? Dann versuch ich mich selbst daran, oder hast du noch einen konkreteren Tipp?
Ich hab schon dutzende Seiten zu dem Thema durchgeschaut und echt vieles versucht...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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
 
#3

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
 
#4

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 16:24 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