Entwickler-Ecke

Windows API - SetMapMode


adler - Sa 01.10.05 14:55
Titel: SetMapMode
Hallo.

Ich glaube mein SetMapMode(Handle, MM_...) funktioniert nicht.
So sieht es aus:


Delphi-Quelltext
1:
2:
3:
  SetMapMode(Panel1.Handle, MM_LOMETRIC);
  Panel1.Height := 550;
  Panel1.Width := 850;


Und müsste dann eigentlich 55 mm Hoch und 85 mm Breit sein oder?

Bitte um Hilfe.


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am Di 04.10.2005 um 09:34


Sprint - Sa 01.10.05 15:21

SetMapMode erwartet als ersten Parameter ein DeviceContext Handle und kein Fensterhandle.


adler - Sa 01.10.05 15:48

Und den hat ein Panel nicht oder?
Was kann ich dann nehmen?


Sprint - Sa 01.10.05 16:03

user profile iconadler hat folgendes geschrieben:
Und den hat ein Panel nicht oder? Was kann ich dann nehmen?

Mit Suche im MSDN GETWINDOWDC, Suche im MSDN GETDC oder mit der Delphi Funktion GetDeviceContext (TWinControl) eins erzeugen.


adler - Sa 01.10.05 16:24

Die Antwort versteh ich nicht, habe mir die Suche mal angeguckt, aber ich versteh es nicht, kannst du nicht ein Beispiel machen?
Wie ich das erzeugen soll.


Sprint - Sa 01.10.05 16:40


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  DC: HDC;
begin

  DC := GetDC(Panel1.Handle);
  // ...
  ReleaseDC(Panel1.Handle, DC);

end;


adler - Sa 01.10.05 16:52


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.FormShow(Sender: TObject);
var
  DC: HDC;
begin
  DC := GetDC(Panel1.Handle);
  SetMapMode( DC , MM_LOMETRIC);
  Panel1.Height := 550;
  Panel1.Width := 850;
end;


Nunja, kein Fehler aber geht net so wie am Anfang.


Sprint - Sa 01.10.05 17:10

Heigth und Width sind Werte in Pixel und nicht Millimeter.


adler - Sa 01.10.05 17:18

Und wie gebe ich dann die breite und höhe in mm an?
Ich will die ja in mm einstellen können.


Alstar - Sa 01.10.05 18:36

Musst Du umrechnen. Es gibt die Property

Delphi-Quelltext
1:
Screen.PixelPerInch                    

dann musst du nurnoch Inch in CM umrechenen und dann kannst du berechnen wieviele Pixel auf einen Millimeter passen ...

Alstar


Lannes - Sa 01.10.05 21:01

Hallo,

Screen.PixelPerInch gilt doch nur für die vertikalen Maße,
oder irre ich mich da :?:


Alstar - So 02.10.05 11:09

Na und? Pixel sind quadratisch. Sprich: Vertikale und Horizontale Maße sind gleich.

Alstar


Lannes - So 02.10.05 11:36

Hallo,

:gruebel:
Wie muss ich denn das interpretieren?
user profile iconDelphi-Hilfe hat folgendes geschrieben:
Verwenden Sie die Eigenschaft PixelsPerInch, wenn Maße von Pixel in Zoll (und umgekehrt) konvertiert werden müssen. PixelsPerInch gilt nur für vertikale Maße. Die meisten Bildschirme verwenden für horizontale Maße einen anderen Skalierungsfaktor. Der Wert in PixelsPerInch wird von Windows gesetzt, wenn Delphi geladen wird.

Ich rechne in einem aktuellen Programm mit PixelsPerInch,
bei einem 19" Röhrenbildschirm ist die Berechnung ok,
auf einem anderen Rechner mit 19" Flachbildschirm ist nur die vertikale Berechnung in Ordnung.


Alstar - So 02.10.05 11:42

Axxo?! :gruebel:

Dein 19" LCD hat nicht zufällig die Auflösung von 1280 x 1024?!

Alstar


Lannes - So 02.10.05 12:20

Hallo,

genau, richtig geraten :wink:
In meinem Programm erstelle ich Tabellen im Richedit über RTF-Code.
Dazu errechne ich die Textbreite per TextWidth und erhalte einen Wert in Pixel.
Um die breite der Tabellenspalten festzulegen muss ich mit Twips arbeiten,
diese errechnen sich wie folgt:
1 Inch = 1440 Twips
1 Inch = ???? Pixel horizontal < da liegt das Problem


Alstar - So 02.10.05 13:15

Das Problem liegt darin, dass die Auflösungen bei 17" und 19" TFT-Monitoren etwas komisch ist.
1280 x 1024 ergibt ein Seitenverhältnis von 1.25:1 anstatt von normalerweise 1.33:1

[ot]
Gibt es eigentlich 19" TFTs mit einer höheren Auflösung als 1280 x 1024?
[/ot]

Alstar


BenBE - So 02.10.05 14:03

@Alstar: Ja, gibt es, allerdings kann sich die niemand leisten ...

Achso, noch was: Mein TFT hat physikalisch 38:30 cm bei 1.25:1 Bildverhältnis.

D.h. 1280 Pixel horizontal sind 38cm, 1024 Pixel vertikal sind 30cm. Um diese Informationen für jeden Monitor auslesen zu können, müsstest Du generell über die EDID-Informationen die Hardware abfragen. Da aber EDID nur bei Verfügbarkeit von DDC2 von der Grafikkarte abgefragt werden kann, ist ein Echtheitsgetreues Bild von den Maßstäben her nicht vollständig erreichbar.


Flocke - Mo 03.10.05 11:31

Zitat:
1 Inch = 1440 Twips
1 Inch = ???? Pixel horizontal < da liegt das Problem

So:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function HorizontalResolution: integer;
var
  dc: HDC;
begin
  dc := GetDC(0);
  Result := GetDeviceCaps(dc, LOGPIXELSX);
  ReleaseDC(0, dc);
end;


Lannes - Mo 11.12.06 21:01

Hallo Flocke,

hab Deine Antwort vor einem Jahr wohl irgendwie übersehen,
es funktioniert, Danke :)