Entwickler-Ecke

Sonstiges (Delphi) - Drucker: Bei allen auflösungen gleich...?


Aya - Di 03.06.03 07:56
Titel: Drucker: Bei allen auflösungen gleich...?
Hi,

wenn ich was ausdrucken möchte, mache ich das z.Z. so das ich es erstmal im Speicher mit Canvas auf ein TBitmap zeichne, und dieses dann auf den Printer.Canvas draufkopiere.

Da dabei aber auch die weißen flächen des Bitmaps übertragen werden ist dadurch der Ausdruck a) sehr groß und b) druckt er weiß mit aus (bzw ganz helle einzelne graue punkte auf manchen druckern)

Nun dachte ich mir, dass ich ja direkt auf den DruckerCanvas zeichnen kann, sollte bei Linien etc auch nich problematisch sein, nur... wie is das mit Text??

Wenn ich mit Canvas.TextOut was auf das Canvas vom drucker schreibe mit Schriftgröße 14... das kann doch kein mensch lesen :)
Dann müßte ich auch beachten ob es 300dpi oder 600dpi sind und dannach die Schrift größe anpassen etc...

Gibt es da nich evtl ne bessere möglichkeit???

Au'revoir,
Aya~


Andreas Pfau - Sa 07.06.03 15:47

Hallo,

wenn ich das richtig verstehe, willst du ganz einfach, dass dein Ausdruck unabhängig von der Auslösung des Druckers immer gleich aussieht. Also, erstmal ein Code:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
type
  TPrinterPage = record
   PaperWidth, PaperHeight: Integer;
   BorderLeft, BorderTop, BorderRight, BorderBottom: Integer;
   PrintableWidth, PrintableHeight: Integer;
  end;

function GetPrinterPage: TPrinterPage;
begin
 Printer.BeginDoc;

 SetMapMode(Printer.Canvas.Handle, Mm_LoMetric);

 Result.PaperWidth  := Round((GetDeviceCaps(Printer.Canvas.Handle, PhysicalWidth)  / GetDeviceCaps(Printer.Canvas.Handle, LogPixelsX)) * 25.4);
 Result.PaperHeight := Round((GetDeviceCaps(Printer.Canvas.Handle, PhysicalHeight) / GetDeviceCaps(Printer.Canvas.Handle, LogPixelsY)) * 25.4);

 Result.BorderLeft := GetDeviceCaps(Printer.Canvas.Handle, PhysicalOffsetX) div 10;
 Result.BorderTop  := GetDeviceCaps(Printer.Canvas.Handle, PhysicalOffsetY) div 10;

 Result.PrintableWidth  := GetDeviceCaps(Printer.Canvas.Handle, HorzSize);
 Result.PrintableHeight := GetDeviceCaps(Printer.Canvas.Handle, VertSize);

 Result.BorderRight  := Result.PaperWidth  - (Result.BorderLeft + GetDeviceCaps(Printer.Canvas.Handle, HorzSize));
 Result.BorderBottom := Result.PaperHeight - (Result.BorderTop  + GetDeviceCaps(Printer.Canvas.Handle, VertSize));

 Printer.Abort;
end;


Selbsterklärend. Rückgabewerte in mm.

Der Code "SetMapMode(Printer.Canvas.Handle, Mm_LoMetric);" ist GANZ Wichtig! Er stellt die Auflösung auf 0,1mm ein, d.h. ein Pixel aufm Canvas ist jetzt 1/10mm. Dann zeichnest du am besten dein Bitmap auf ein beliebiges Canvas, und kopierst es mit StretchDraw() oder StretchBlt() auf das PrinterCanvas. Bei StretchBlt() unbedingt mit SetStretchBltMode() auf HALFTONE oder zumindest COLORONCOLOR stellen.

Deine Weißen Flächen SIND HALT SO, dan kann ich auch nix für :wink: . Alles, was NICHT Weiß ist, wird gedruckt. Weiße Ränder solltest du abschneiden, wenn sie nicht erwünscht sind.

SetMapMode() auch noch mal vor dem drucken aufrufen!!!