![]() |
Druck in Millimetern / TextHeight?
Also: ich habe folgendes Problem: ich stelle in meinem Programm ein paar bitmaps zusammen, die Schilder darstellen welche später von einer Gravurmaschine graviert werden sollen. nun wollte ich die Schilder einzeln auf den Canvas des Druckers ausgeben, die Bilder waren aber verzerrt.. nun ja... dachte ich mir und malte nun die Bestandteile der Schilder alle einzeln auf den Druckercanvas
hier mal der Quelltext der Druckmethode:
Code:
ich stelle also die auf 0,1 mm einheiten um, um dann zu zeichnen....
procedure TMainForm.DruckenClick(Sender: TObject);
var myRect: TRect; w,v: TSize; printCanvHandle: HDC; tempSchild: TSchild; i, a: Integer; tempZeile: TZeile; begin if PrintDialog.Execute then begin printer.BeginDoc; printCanvHandle := Printer.Canvas.Handle; SetMapMode(printCanvHandle, mm_lometric); // 0.1 Millimeter-Einheiten, Positive x-Achse nach rechts und positive y-Achse nach oben. GetWindowExtEx(printCanvHandle,w); // die Abmessungen des Windows auslesen GetViewPortExtEx(printCanvHandle,v); // die Abmessungen des Viewports auslesen SetMapMode(printCanvHandle, MM_ANISOTROPIC); SetWindowExtEx(printCanvHandle, w.cx, w.cy, nil); //die Abmessungen des Windows festlegen SetViewPortExtEx(printCanvHandle,v.cx, -v.cy,nil); // die Abmessungen des Viewports festlegen // als allererstes den Gravurflächenrand zeichnen myRect := Rect(0, 0, StrToInt(EditGravFlaecheWidth.Text) * 10, StrToInt(EditGravFlaecheHeight.Text) * 10); Printer.Canvas.Rectangle(myRect); for i:=0 to Schilder.Count-1 do begin tempSchild := TSchild(Schilder[i]); // Zeilen des Schildes zeichnen for a:=0 to tempSchild.Zeilen.Count-1 do begin tempZeile := TZeile(tempSchild.Zeilen[a]); Printer.Canvas.Font.Name := tempZeile.txtSchriftart; Printer.Canvas.Font.Style := tempZeile.txtStyle; //Printer.Canvas.Font.Height := Trunc(-tempZeile.txtGroesse * Font.PixelsPerInch / 72)*10; //PixelToMM(tempZeile.txtHeight)*10; //Printer.Canvas.Font.PixelsPerInch:=GetDeviceCaps(outDC, LOGPIXELSY); //Printer.Canvas.Font.Size := tempZeile.txtGroesse; //Printer.Canvas.Font.Size := Trunc(((-tempZeile.txtHeight * 72) / Printer.Canvas.Font.PixelsPerInch)*10); Printer.Canvas.TextOut( PixelToMM(tempSchild.xPos + tempZeile.xPos)*10, PixelToMM(tempSchild.yPos + tempZeile.yPos)*10, tempZeile.txt); end; end; Printer.EndDoc; end; end; wie kann ich denn nun von der Schriftgröße in punkt (in tempZeile.txtGroesse enthalten) in mm umrechnen? oder ich habe auch die möglichkeit die höhe des textes (in tempZeile.txtHeight) enthalten zu verwenden... hat einer einen vorschlag? mfg marcus |
Re: Druck in Millimetern / TextHeight?
Zitat:
wenn du also eine linie zeichen würdest
Delphi-Quellcode:
so sollte eine 10 mal 0,1 mm breite linie gemalt werden.
Printer.Canvas.MoveTo(0, 0);
Printer.Canvas.LineTo(10,0); |
Re: Druck in Millimetern / TextHeight?
Wenn du den MapMode umgestellt hast, dann liefert
![]() |
Re: Druck in Millimetern / TextHeight?
mit gettextMetric kann ich doch nur die aktuellen Eigenschaften des Printer.Canvas auslesen... ich muss die Font.Eigenschaften des Printer.Canvas ja aber irgendwie setzen?! Also die Font-Eigenschaften die ich ja nur in Pixeln vorhanden habe in MilliMeter umwandeln und auf den Printer.Canvas anwenden....
|
Re: Druck in Millimetern / TextHeight?
Dann erstell dir eine Font mit
![]() ![]() |
Re: Druck in Millimetern / TextHeight?
Hi,
um mit mm- und Pixel-Angaben rumzurechnen, kannste mit ![]() Gruß Stephan :dance: |
Re: Druck in Millimetern / TextHeight?
so, habs jetzt gefunden und um allen Interessierten den Code zur Verfügung zu stellen poste ich diesen mal gleich mit:
Code:
MfG
procedure TMainForm.DruckenClick(Sender: TObject);
// Pixel to Millimeter function PixelToMM(value: Double; dpi: Integer): Double; begin Result := (value * 25.4) / dpi; // 1 Inch = 25,4 mm end; var myRect: TRect; w,v: TSize; printCanvHandle: HDC; tempSchild: TSchild; i, a: Integer; tempZeile: TZeile; Font1: TFont; logoHoehe, logoBreite: Integer; zoomFaktor, xPos, yPos: Double; iAbstandGravurrand, gravurrandDicke: Integer; GravurrandOuter, GravurrandInner: TRect; begin PageSetupDialog1.MarginLeft := 0; PageSetupDialog1.MarginTop := 0; PageSetupDialog1.MarginRight := 0; PageSetupDialog1.MarginBottom := 0; if PageSetupDialog1.Execute then begin printer.BeginDoc; printCanvHandle := Printer.Canvas.Handle; SetMapMode(printCanvHandle, mm_lometric); // 0.1 Millimeter-Einheiten, Positive x-Achse nach rechts und positive y-Achse nach oben. GetWindowExtEx(printCanvHandle,w); // die Abmessungen des Windows auslesen GetViewPortExtEx(printCanvHandle,v); // die Abmessungen des Viewports auslesen SetMapMode(printCanvHandle, MM_ANISOTROPIC); SetWindowExtEx(printCanvHandle, w.cx, w.cy, nil); //die Abmessungen des Windows festlegen SetViewPortExtEx(printCanvHandle,v.cx, -v.cy,nil); // die Abmessungen des Viewports festlegen for i:=0 to Schilder.Count-1 do begin tempSchild := TSchild(Schilder[i]); // ------------------------------------------------------------------- // // Zeilen des Schildes zeichnen: for a:=0 to tempSchild.Zeilen.Count-1 do begin tempZeile := TZeile(tempSchild.Zeilen[a]); Font1 := TFont.Create; Font1.Name := tempZeile.Font.Name; Font1.Style := tempZeile.Font.Style; Printer.Canvas.Font.Assign(Font1); Printer.Canvas.Font.Height := Trunc(PixelToMM(Trunc(-tempZeile.Font.Size * tempZeile.Font.PixelsPerInch / 72), tempZeile.Font.PixelsPerInch) * 10); Printer.Canvas.TextOut( Trunc(PixelToMM(tempSchild.xPos + tempZeile.xPos, Screen.PixelsPerInch)*10), Trunc(PixelToMM(tempSchild.yPos + tempZeile.yPos, Screen.PixelsPerInch)*10), tempZeile.txt); Font1.Free; end; end; Printer.EndDoc; end; end; Marcus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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 by Thomas Breitkreuz