Moin, Moin.
Ich möchte auf einem Canvas (Monitor) Linien im exakten Horizontalabstand von 1cm zeichnen. Nix leichter als das - dachte ich. Dafür gibt's ja Funktionen, die dich die Anzahl der Pixel je Zentimeter berechnen lassen. Meine bisherigen Versuche scheitern aber dummerweise kläglich
Delphi-Quellcode:
procedure GetHorPixelsPerCM;
var DC : HDC;
HorPixCM_v1,
HorPixCM_v2 : Integer;
begin
DC:=GetDC(0);
HorPixCM_v1:=Trunc(GetDeviceCaps(
DC,LOGPIXELSX)/2.54);
ShowMessage('
pixel/cm'#13'
Variante mit LogPixelsX'#13
+IntToStr(HorPixCM_v1));
HorPixCM_v2:=MulDiv(GetDeviceCaps(
DC,HorzRes),10,GetDeviceCaps(
DC,HorzSize));
ShowMessage('
pixel/cm'#13'
Variante mit HorzRes+HorzSize'#13
+IntToStr(HorPixCM_v2));
ShowMessage('
pixel/cm'#13'
Variante mit Screen.PixelsPerInch (nur vertikal gültig)'#13
+IntToStr(Trunc(Screen.PixelsPerInch/2.54)));
ReleaseDC(0,
DC);
end;
Die beiden ersten Varianten liefern z.B. auf meinem Notebook abweichende Angaben von 37 bzw. 35 Pixel/cm. Die dritte Variante (die lt. Delphihilfe für horizontale Auflösungen nicht verwendet werden sollte) liefert wieder ein Ergebnis von 37 Pixel/cm. Korrekt sind die Werte allerdings in keinem Fall - richtig wären 34 Pixel/cm. Für alle mir zugänglichen PC-Monitore werden ebenfalls falsche Ergebnisse ermittelt. Ursachenforschung ist bei der Variante 1 möglich: Der Wert für HorzSize (also die horizontale Breite in mm) wird in allen untersuchten Fällen falsch zurückgeliefert.
Fragen:
- Ist meine Herangehensweise falsch?
- Falls es mal einer der Leser nachprüfen möchte, finden sich Monitorkonfigurationen bei denen das Ergebnis korrekt ermittelt wird?
- Gibt es eine alternative Lösung? Im Augenblick fällt mir nur eine Konfigurationsmöglichkeit ein, anhand derer der Anwender eine Kalibrierung vornehmen kann und das Programm dann mit einem zusätzlichen Korrekturfaktor arbeitet.