Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 26.02.19 06:39 
Hallo Forum

Problemstellung:
Auf eine Leinwand (TCanvas) soll ein Quadrat mit einem bestimmten Maß (in cm) abgebildet und im Anschluss ausgedruckt werden.
Als Beispiel habe ich nun 10cm als Seitenlänge genommen.
Durch probieren und umrechnen bin ich hierbei auf ca. 2380 Pixel und auf einen DPI Wert von ca. 604 gekommen.

Was mich interessiert, ist, wo die 604dpi herkommen, bzw. mit welcher Funktion dieser Wert ermittelt werden kann?

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4421
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 26.02.19 11:42 
600 DPI sollte einfach die Auflösung eines bestimmten Druckers sein. Die solltest du über GetDeviceCaps bekommen können, möglicherweise rückt die VCL das auch irgendwo direkt raus.

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 26.02.19 13:46 
Hat geklappt, vielen Dank, Ralf Jansen!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses Printers;

var
  dpi: Integer;
begin
  dpi := GetDeviceCaps(Printer.Handle, LOGPIXELSX); // LOGPIXELSY
  ShowMessage(IntToStr(dpi));
end;

Nebenbei habe ich mitbekommen, dass es Drucker gibt, die unterschiedliche H/V - DPI Werte aufweisen. Wie geht man es dann an?
Ermittelt man dann beide Werte und nimmt die goldene Mitte? :D

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Di 26.02.19 15:52 
Hmm..

Wenn Du einfach nur in mm ausdrucken möchtest (per Printer.BeginDoc/EndDoc):


www.delphipraxis.net...asseinheiten-cm.html

www.swissdelphicente.../showcode.php?id=584

;)

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 26.02.19 17:52 
Supi. Dankeschön, Holgerx!
Die Funktion SetMapMode() macht vieles einfacher.

Das Thema hat sich erledigt !!!

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 28.02.19 04:28 
Die Funktion scheint hier nicht zu fruchten, oder ich wende sie falsch an. :gruebel:
SetMapMode hat folgendes geschrieben:
iMode
MM_LOMETRIC : Each logical unit is mapped to 0.1 millimeter. Positive x is to the right; positive y is up.

Im folgenden Beispiel sollen 2 Zeilen, eine Mittellinie und ein Zeichen jeweils 2,5cm vom linken und oberen Rand weg gezeichnet werden.
Die Zeilen sollen 16cm lang werden, sowie 1cm voneinander entfernt sein.
Betrachtet man es aus der Sicht eines DIN A4 Blattes, welches eine Breite von 21cm hat, kommt es nicht hin. :nixweiss:

delphi_print_xps

ausblenden volle Höhe Delphi-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:
28:
29:
30:
31:
32:
33:
var
  r: TRect;
  s: WideString;
begin
  // # Einstellungen
  Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft XPS Document Writer');
  //Printer.PrinterIndex := 1;
  Printer.Canvas.Font.Name := 'MS Mincho';
  Printer.Canvas.Font.Size := 12;
  Printer.Canvas.Brush.Style := bsClear;
  SetMapMode(Printer.Handle, MM_LOMETRIC);

  // # Druckvorgang
  Printer.BeginDoc;
  // Obere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(250250);
  Printer.Canvas.LineTo(1850250);
  // Mittlere Zeile
  Printer.Canvas.Pen.Color := clSilver;
  Printer.Canvas.MoveTo(250300);
  Printer.Canvas.LineTo(1850300);
  // Untere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(250350);
  Printer.Canvas.LineTo(1850350);
  // Text
  Printer.Canvas.Font.Color := clRed;
  s := #$3042;
  r := Rect(250250400400);
  DrawTextW(Printer.Canvas.Handle, PWideChar(s), Length(s), r, 0);
  Printer.EndDoc;
end;
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Do 28.02.19 12:01 
Hmm..

Habe mal deinen Source nach dem Muster von den Schweitzern umgestellt:

ausblenden volle Höhe Delphi-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:
28:
29:
30:
31:
32:
var
  r: TRect;
  s: WideString;
begin
  // # Einstellungen
  Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft XPS Document Writer');
  //Printer.PrinterIndex := 1;
  Printer.Canvas.Font.Name := 'MS Mincho';
  Printer.Canvas.Font.Size := 12;
  Printer.Canvas.Brush.Style := bsClear;

  // # Druckvorgang
  Printer.BeginDoc;
  SetMapMode(Printer.Handle, MM_LOMETRIC);  // <-- Muss anscheinend HINTER BeginDoc
  // Obere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(250, -250);  // alle Y-Werte Negativ, Positive Werte wandern nach links raus...
  Printer.Canvas.LineTo(1850, -250);
  // Mittlere Zeile
  Printer.Canvas.Pen.Color := clSilver;
  Printer.Canvas.MoveTo(250, -300);
  Printer.Canvas.LineTo(1850, -300);
  // Untere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(250, -350);
  Printer.Canvas.LineTo(1850, -350);
  // Text
  Printer.Canvas.Font.Color := clRed;
  s := #$3042;
  r := Rect(250, -250400, -400);
  DrawTextW(Printer.Canvas.Handle, PWideChar(s), Length(s), r, 0);
  Printer.EndDoc;


Und siehe da, es scheint zu funktionieren...

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 28.02.19 16:27 
In der Hilfe heißt es, positive Y-Werte wandern nach oben ("positive y is up"). Das führt etwas zur Verwirrung.
Dennoch habe ich die Funktion an der falschen Stelle aufgerufen.

Wenn das nicht funktioniert hätte, dann hätte es so ausgesehen:

ausblenden volle Höhe Delphi-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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
function CmToPx(CM: Single; DPI: Integer = 600): Integer;
begin
  result := Trunc(CM * DPI / 2.54);
end;

var
  r: TRect;
  s: WideString;
begin
  // # Einstellungen
  Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft XPS Document Writer');
  //Printer.PrinterIndex := 1;
  Printer.Canvas.Font.Name := 'MS Mincho';
  Printer.Canvas.Font.Size := 28;
  Printer.Canvas.Brush.Style := bsClear;

  // # Druckvorgang
  Printer.BeginDoc;
  // Obere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(CmToPx(2.5), CmToPx(2.5));
  Printer.Canvas.LineTo(CmToPx(18.5), CmToPx(2.5));
  // Mittlere Zeile
  Printer.Canvas.Pen.Color := clSilver;
  Printer.Canvas.MoveTo(CmToPx(2.5), CmToPx(3.0));
  Printer.Canvas.LineTo(CmToPx(18.5), CmToPx(3.0));
  // Untere Zeile
  Printer.Canvas.Pen.Color := clBlue;
  Printer.Canvas.MoveTo(CmToPx(2.5), CmToPx(3.5));
  Printer.Canvas.LineTo(CmToPx(18.5), CmToPx(3.5));
  // Text
  Printer.Canvas.Font.Color := clRed;
  s := #$3042;
  r := Rect(CmToPx(2.5), CmToPx(2.5), CmToPx(4.0), CmToPx(4.0));
  DrawTextW(Printer.Canvas.Handle, PWideChar(s), Length(s), r, 0);
  Printer.EndDoc;
end;

Wieso CM und nicht MM? Weil ich's kann.
Vielen Dank nochmals, Holgerx! :wave:

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Do 28.02.19 20:39 
Hmm..

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
In der Hilfe heißt es, positive Y-Werte wandern nach oben ("positive y is up"). Das führt etwas zur Verwirrung.


Und da ist denke ich das Problem:

Von Oben nach oben gehend ist raus aus dem Papier ;)

Eine Seite fängt immer oben links mit 0,0 an, wenn ich nun nach oben gehe, geht es aus der Seite heraus und es wird nichts auf das Blatt gedruckt.
Ist wirklich verwirrend, da es bei Pixel wohl von oben nach untern mit positiven Wert geht..

Wobei ja 'Y' eher von Rechts nach links lauten müsste..

Für diesen Beitrag haben gedankt: Frühlingsrolle
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2296
Erhaltene Danke: 420

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 28.02.19 21:08 
Danke, so macht es Sinn, wenn der Ursprung die obere linke Ecke ist.
Ich dachte, es verhält sich wie ein Koordinatensystem von -x bis +x, sowie -y bis +y.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)