Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GetDeviceMaps liefert falsche Screenbreite, Probleme mit CDC::DPtoLP

65 views
Skip to first unread message

joerg

unread,
Sep 10, 2007, 7:36:44 AM9/10/07
to
Hallo
woher bekommt eigentlich CDC::GetDeviceCaps(HORZSIZE) die
physikalische Bildschirmbreite in mm ?

Bei einigen meiner Systeme bekomme ich nicht die richtige Breite
zurückgeliefert, was offensichtlich dazu führt
dass im Mappingmode MM_LOMETRIC die Umrechnung von Devicekoordinaten
in LogicalKoordinaten mit CDC::DPtoLP nicht vernünftig funktioniert
bzw. zwischen 2 eigentlich gleichen Rechnern verschiedene Ergebnisse
zurückliefert.

Kann da jemand ein wenig Licht ins Dunkel bringen ?
Gruss Jörg

Martin Richter [MVP]

unread,
Sep 11, 2007, 2:57:49 AM9/11/07
to
Hallo joerg!

> woher bekommt eigentlich CDC::GetDeviceCaps(HORZSIZE) die
> physikalische Bildschirmbreite in mm ?

Vom Bildschirmtreiber.
Allerdings ist dies IMHO eine Kalkulation aus den Werten, die LOGPIXELSX
(dpi) und HORZRES (physikalische Weite) liefert. Insofern kann HORZSIZE
geringfügigen Rundungsungenauigkeiten ausgesetzt sein.


--
Martin Richter [MVP] WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written
program is its own hell!" The Tao of Programming
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com

joerg

unread,
Sep 11, 2007, 4:46:35 AM9/11/07
to
On 11 Sep., 08:57, "Martin Richter [MVP]" <martin.rich...@mvps.org>
wrote:

Hallo Martin,
das kann eigentlich nicht sein. Die Werte für LOGPIXELSX (dpi) und
HORZRES (physikalische Weite) ergeben nicht das was bei HORZSIZE
angeben ist.
Sowohl auf den Rechner auf den HORSIZE korrekt ist als auch auf denen
auf denen der Wert nicht stimmt.
Ich habe weiterhin den Bildschirmtreiber passend zum jeweils
eingesetzten TFT Display aktualisiert aber das hat kein Ergebnis
gebracht.
Kann es sein das diese Werte irgendwo aus dem Grafikartentreiber
kommen ? Der ist jedenfalls auf den Systemen unterschiedlich,
aber das das dann massive Auswirkungen auf die Ergebnisse CDC::DPtoLP
hat ist doch schon sehr bedenklich
Wie funktioniert CDC::DPtoLP eigentlich genau. Ich kann diese Funktion
logischerweise nicht debuggen, hast du eine Ahnung was da intern
abläuft ?
Gruss Joerg

Martin Richter [MVP]

unread,
Sep 11, 2007, 6:24:36 AM9/11/07
to
Hallo joerg!

> das kann eigentlich nicht sein. Die Werte für LOGPIXELSX (dpi) und
> HORZRES (physikalische Weite) ergeben nicht das was bei HORZSIZE
> angeben ist.
> Sowohl auf den Rechner auf den HORSIZE korrekt ist als auch auf denen
> auf denen der Wert nicht stimmt.
> Ich habe weiterhin den Bildschirmtreiber passend zum jeweils
> eingesetzten TFT Display aktualisiert aber das hat kein Ergebnis
> gebracht.

Ich habe es eben mal bei mir probiert:
LOGPIXELSX = 96
HORZRES = 1680
HORZSIZE = 480

Aus HORZRES und LOGPIXELSX ergibt sich 17,5" = 444,5mm

Stimmt also bei mir auch nicht.

Ich denke Du darfst Dich für die entsprechende Berechnung nur auf
HORZRES und LOGPIXELSX stützen.

Jörg Tiedemann

unread,
Sep 11, 2007, 5:55:59 PM9/11/07
to

> Hallo joerg!
>
>> das kann eigentlich nicht sein. Die Werte für LOGPIXELSX (dpi) und
>> HORZRES (physikalische Weite) ergeben nicht das was bei HORZSIZE
>> angeben ist.
>> Sowohl auf den Rechner auf den HORSIZE korrekt ist als auch auf denen
>> auf denen der Wert nicht stimmt.
>> Ich habe weiterhin den Bildschirmtreiber passend zum jeweils
>> eingesetzten TFT Display aktualisiert aber das hat kein Ergebnis
>> gebracht.
>
> Ich habe es eben mal bei mir probiert:
> LOGPIXELSX = 96
> HORZRES = 1680
> HORZSIZE = 480
>
> Aus HORZRES und LOGPIXELSX ergibt sich 17,5" = 444,5mm
>
> Stimmt also bei mir auch nicht.
>
> Ich denke Du darfst Dich für die entsprechende Berechnung nur auf HORZRES
> und LOGPIXELSX stützen.
>
> --

Hallo Martin
ja das seh ich auch so, ich werd wohl eine eigene Umrechung mit HORZRES und
LOGPIXELSX von Devicekoordinaten machen müssen.
Ich benutze zur Zeit die Funktion CDC::DPtoLP im Mappingmode MM_LOMETRIC zur
Umrechnung von Devicekoordinaten in LogicalKoordinaten und dort kommen auf
verschiedenen Rechnern bei gleicher Auflösung verschiedene Ergebnisse. Ich
vermute das das irgendwie mit meinem Problem zusammenhängt.
Hast du eine Ahnung was in CDC::DPtoLP bzw der zugehörigen API Funktion

Martin Richter [MVP]

unread,
Sep 12, 2007, 2:41:00 AM9/12/07
to
Hallo Jörg!

> Hast du eine Ahnung was in CDC::DPtoLP bzw der zugehörigen API Funktion
> intern abläuft ?

Die Frage ist gut! Die Frage ist echt gut. Hättest Du doch beim Debuggen
merken müssen ;-)

Das ist keine API Funktion, dass ist eine pure simple MFC Funktion. Und
die ist wirklich so simpel, dass ich mir kaum einen Fehler vorstellen
kann. Überlauf ist ausgeschlossen?

void CDC::DPtoLP(LPSIZE lpSize) const
{
ASSERT(AfxIsValidAddress(lpSize, sizeof(SIZE)));

CSize sizeWinExt = GetWindowExt();
CSize sizeVpExt = GetViewportExt();
lpSize->cx = MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx));
lpSize->cy = MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy));

joerg

unread,
Sep 12, 2007, 6:16:10 AM9/12/07
to
On 12 Sep., 08:41, "Martin Richter [MVP]" <martin.rich...@mvps.org>
wrote:

> Hallo Jörg!
>
> > Hast du eine Ahnung was in CDC::DPtoLP bzw der zugehörigen API Funktion
> > intern abläuft ?
>
> Die Frage ist gut! Die Frage ist echt gut. Hättest Du doch beim Debuggen
> merken müssen ;-)
>
> Das ist keine API Funktion, dass ist eine pure simple MFC Funktion. Und
> die ist wirklich so simpel, dass ich mir kaum einen Fehler vorstellen
> kann. Überlauf ist ausgeschlossen?
>
> void CDC::DPtoLP(LPSIZE lpSize) const
> {
> ASSERT(AfxIsValidAddress(lpSize, sizeof(SIZE)));
>
> CSize sizeWinExt = GetWindowExt();
> CSize sizeVpExt = GetViewportExt();
> lpSize->cx = MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx));
> lpSize->cy = MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy));
>
> }

Hallo Martin,
das ist schon richtig solange CDC::DPtoLP(.. mit LPSIZE lpSize
aufgerufen wird.
Ich benutze jedoch CDC::DPtoLP(.. mit einem POINT als Parameter dann
wird eine API Funktion aufgrufen
Da kommen komischerweise total unterschiedliche Werte raus
Hier mal ein Beispiel:
POINT pt;
pt.x=0;
pt.y=-18700;

pDC->LPtoDP(&pt);
// pt hat jetzt folgende Werte: x == -4500; y == 2332;


LPSIZE lpSize = new SIZE;
LPSIZE lpSize2 = new SIZE;
lpSize->cx = 0;
lpSize->cy = -18700;
lpSize2->cx = 0;
lpSize2->cy = -18700;
pDC->LPtoDP(lpSize);
// lpSize hat jetzt folgende Werte: cx == 0; cy == -6383

Woran kann das liegen bzw. wo liege ich da falsch ?
Gruss Jörg

Thorsten Albers

unread,
Sep 12, 2007, 7:48:25 AM9/12/07
to
joerg <joerg.t...@web.de> schrieb im Beitrag
<1189592170.8...@22g2000hsm.googlegroups.com>...

> das ist schon richtig solange CDC::DPtoLP(.. mit LPSIZE lpSize
> aufgerufen wird.
> Ich benutze jedoch CDC::DPtoLP(.. mit einem POINT als Parameter dann
> wird eine API Funktion aufgrufen
> ...
> pDC->LPtoDP(&pt);

Nee, Du benutzt LPtoDP()...

--
----------------------------------------------------------------------
THORSTEN ALBERS Universität Freiburg
albers@
uni-freiburg.de
----------------------------------------------------------------------

Martin Richter [MVP]

unread,
Sep 12, 2007, 8:43:53 AM9/12/07
to
Hallo joerg!


> Woran kann das liegen bzw. wo liege ich da falsch ?

Die Größe ist nur Abhängig von der Skalierung (ViewportExt/WindowsExt).
Die Position eben auch noch vom Offset (Viewport/WindowOrg).

Gerd Kaninke

unread,
Oct 19, 2007, 6:18:41 AM10/19/07
to
Hallo Martin,

ich habe das Problem auch, daß GetDeviceCaps mit HORZSIZE und VERTSIZE
falsche Werte manchmal liefert. Ich brauche das für das Kopieren einer
Grafik in eine Metafile bzw. in das Clipboard. Der Algorithmus ist klar,
aber es wird GetDeviceCaps mit den Parametern benutzt.
In den letzten Einträgen zu dem Problem ging es nicht mehr darum, daß
die Funktion zumindest manchmal falsche Werte liefert.
Erkennt das Microsoft als Fehler an und wenn ja, wird Microsoft den
Fehler beheben oder soll man die Funktion einfach nicht benutzen?

Martin Richter [MVP] schrieb:

Martin Richter [MVP]

unread,
Oct 19, 2007, 2:26:09 PM10/19/07
to
Hallo Gerd!

> In den letzten Einträgen zu dem Problem ging es nicht mehr darum, daß
> die Funktion zumindest manchmal falsche Werte liefert.
> Erkennt das Microsoft als Fehler an und wenn ja, wird Microsoft den
> Fehler beheben oder soll man die Funktion einfach nicht benutzen?

Ich denke Du darfst Dich für die entsprechende Berechnung nur auf
HORZRES und LOGPIXELSX stützen.

Ich habe keine Ahnung ob MS das als Fehler sieht. Ich vermute eher, dass
diese Daten sich aus dem Bildschirmtreiber ergeben.
Ich habe diese Werte noch nie verwendet...

0 new messages