Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 03.06.03 07:56 
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~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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:
ausblenden 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!!!

_________________
Life is a bad adventure, but the graphic is really good!