Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Probleme mit dem Drucken und den Koordinaten (https://www.delphipraxis.net/30605-probleme-mit-dem-drucken-und-den-koordinaten.html)

Luckie 27. Sep 2004 02:08


Probleme mit dem Drucken und den Koordinaten
 
Um mir die Arbeit beim Drucken etwas zu erleichtern, habe ich den MapMode auf MM_LOMETRIC gestellt. Damit hat eine logische Einheit 0,1 mm ubnd der Ursprung liegt laut PSDK unten links.

Meine Druckroutine sieht nun so aus:
Delphi-Quellcode:
SetMapMode(hDC, MM_LOMETRIC); // E = 0,1 mm
rec.Top := (FVerSize - TOPBORDER) * SCALE;
rec.Left := LEFTBORDER * SCALE;
rec.Bottom := ((FVerSize - TOPBORDER) * SCALE) - (LineHeight div SCALE);
rec.right := (FHorzSize - RIGHTBORDER) * SCALE;
DrawText(hDC, PChar(s), length(s), rec, DT_CENTER);
FVerSize und FHorzSize ermittele ich mit MSDN-Library durchsuchenGetDevicecaps und liegen in Millimetern vor. LineHeight hat den Wert 47.
Delphi-Quellcode:
SetMapMode(Canvas.Handle, MM_LOMETRIC);
GetTextMetrics(Canvas.Handle, tm);
LineHeight := (tm.tmHeight + tm.tmExternalLeading);
FHorzSize := GetDeviceCaps(Canvas.Handle, HORZSIZE);
FVerSize := GetDeviceCaps(Canvas.Handle, VERTSIZE);
Die Werte der Konstanten sind in Millimetern angegeben. TOPBORDER hat den Wert 20 zum Beispiel. SCALE hat den Wert 10 damit ich wieder auf 0,1 mm komme. Für ein Din-A4 Blatt sind die Werte für rec jetzt:
rec.Top = 2660
rec.Left = 250
rec.Bottom = 2656
rec.Right = 1830
Aber er druckt mir nichts aus. Ich muss irgendwo noch einen Denkfehler haben. Ich finde ihn nur nicht. :roll: Was mache ich also falsch?

Gollum 27. Sep 2004 07:05

Re: Probleme mit dem Drucken und den Koordinaten
 
Hallo,

wie Du bereits bemerkt hast, ist der Nullpunkt der Y-Achse unten. Dies bedeutet in Deinem Fall, dass alle Y-Koordinaten negativ angegeben werden müssen.

Luckie 27. Sep 2004 07:17

Re: Probleme mit dem Drucken und den Koordinaten
 
Mist das hatte ich nicht bedacht. Funktioniert aber immer noch nicht:
Delphi-Quellcode:
  rec.Top := -(FVerSize - TOPBORDER) * SCALE - (LineHeight);
  rec.Left := LEFTBORDER * SCALE;
  rec.Bottom := -((FVerSize - TOPBORDER) * SCALE);
  rec.Right := (FHorzSize - RIGHTBORDER) * SCALE;
rec.Top = -2707 -> 1/10 mm -> -270,7 mm -> 27,07 cm
rec.Left = 250 -> 1/10 mm -> 25 mm -> 2,5 cm
rec.Bottom = -2660 -> 1/10 mm -> 266,0 mm -> 26,60 cm
rec.Right = 1830
Die Werte sollten also eigentlich ein Rechteck definieren was im sichtbaren Bereich eines Din-A4 Blattes liegt. Un dmit 4,7 mm sollte es auch hochgenug für die Schrift sein. :?

Gollum 27. Sep 2004 07:35

Re: Probleme mit dem Drucken und den Koordinaten
 
Hallo,

wahrscheinlich liegt es daran, dass bei Dir rec.Top kleiner wie re.Bottom ist.

Im Prizip wird der zu druckende Bereich genau so berechnet wie auf dem Bildschirm (Nullpunkt links/oben). Bei der Ausgabe auf den Drucker musst Du dann alle Y-Koordinaten negieren.

Luckie 27. Sep 2004 07:38

Re: Probleme mit dem Drucken und den Koordinaten
 
Muss ja auch kleiner sein. Wenn der Nullpunkt unten links liegt, negative y-Wert nach oben gehen, dann muss rec.Top ja kleiner sein als rec.Bottom damit ich ein Rechteck für den Text habe. Oder steht das etwa auch auf dem Kopf. :evil: Da wird man ja ganz irre.

Verdammt, das Ding scheint auch auf dem Kopf zu stehen. Ich habe mal ein test-Projekt gemacht:
Delphi-Quellcode:
    rect.Top := -550;
    rect.Left := 0;
    rect.Bottom := -800;
    rect.Right := 1700;
    DrawText(Printer.Canvas.Handle, PChar(MYTEXT), length(MYTEXT), rect, DT_LEFT);
Da sehe ich was auf dem Drucker. :shock:

Gollum 27. Sep 2004 08:12

Re: Probleme mit dem Drucken und den Koordinaten
 
Hallo,

Zitat:

Zitat von luckie
Oder steht das etwa auch auf dem Kopf

Genau!! :thumb:

MacGuyver 27. Sep 2004 10:29

Re: Probleme mit dem Drucken und den Koordinaten
 
Moin auch :hi:

Ist es nicht einfacher den Drucker einmal zu kalibrieren? Der unter WinAPI ermittelte Rand stimmt nicht, zumindest nich bei allen Druckern. Also vier Linien am Rand Drucken und ausmessen. Dann nur noch von der Grundgröße Din-A4 ausgehen und berechnen. Drei Funktionen schreiben: PointCmToPix, WidthCmToPix und HeightCmToPix und dann raus damit. Dabei läßt sich wenigstens alles nachvollziehen, was passiert.

Stefan


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz