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
> 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
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
> 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
> 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
Nee, Du benutzt LPtoDP()...
--
----------------------------------------------------------------------
THORSTEN ALBERS Universität Freiburg
albers@
uni-freiburg.de
----------------------------------------------------------------------
> 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).
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:
> 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...