Einzelnen Beitrag anzeigen

taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 

zentimetergenaues Zeichnen auf Monitor unmöglich?

  Alt 7. Mai 2008, 09:57
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.
Ralph
  Mit Zitat antworten Zitat