Programm für alle Rechner kompatibel machen
-
hallo,
wie soll ich das erklären
habe auf meinem Notebook einen Screenshot einer Landkarte gemacht und diese mit BitBlt in mein Dialogfenster geladen. Wenn ich mit der Maus zwei verschiedene Punkte anklicke, erhalte ich mit Hilfe vonhdc->SetViewportOrg(0,bildHoehe); hdc->SetMapMode (MM_HIMETRIC); // 1 logische Einheit = 0.01mm hdc->DPtoLP(&point);genau die richtige Entfernung, wie sie auch auf der Landkarte ist.
Wenn ich das Programm aber jetzt auf einem anderen Notebook laufen lasse, stimmt die Entfernung nicht mehr überein.
Ich denke mal das liegt an der Bildschirmgröße und somit die Karte anders dargestellt wird. Eine logische Einheit != logische Einheit auf anderem Bildschirm (bin mir aber nicht sicher).
Wie könnte ich das Programm für alle Rechner kompatibel machen bzw. dieses Problem vermeiden?
danke im voraus
-
Also soweit ich dies rausgefunden habe, liegt es an den Bildschirmtreiberherausgebern (was für ein Wort ^^'). Die definieren nämlich wieviele Pixel gleich einem Millimeter ist usw. Die Auflösung hat durchaus auch noch ihre Finger drin, da es bei kleineneren Auflösungen quasi zu Rundungsfehlern kommt. Ein Mittel dagegen, habe ich bis Heute noch nicht so recht gefunden, zumindest nichts wo sich der Aufwand lohnen würde. Wenn du was findest, dann melden ^^
Grüssli
-
hm..werd ich machen..
wenn man die logischen Koordinaten in Pixel umwandeln könnte dann hätte man für jeden Bildschirm einen geeigneten Multiplizierfaktor(StretchBlt), denn die Anzahhl der Pixel eines Bildes bleibt ja immer gleich.
Nur wie?
hdc->SetMapMode(MM_TEXT würde glaub ich funktioniern), aber ich Brauche hdc->SetMapMode (MM_HIMETRIC)..
Es muss doch eine schönere Lösung geben..
-
Schau dir mal CDC::GetDeviceCaps in der MSDN an. Da bekommst du vielleicht ein paar Werte, welche dir weiterhelfen können.
Von skalieren halte ich allerdings nichts. Habe bisher in dem Bereich nur schlechte Erfahrungen gemacht, weil sich irgendwie alles ein wenig anderst zueinander verhaltet.Grüssli
-
ok,danke.
kannst du mir zfällig noch sagen, wie ich das handle auf den bildschirm mache?Editiert:
Ok, habs schon
-
naja, mit den werten kann ich im moment nicht viel anfangen..
was genau ist denn eine logische koordinate??
hat jemand eine andere lösung?
-
du wolltest wissen wie ichs gelöst hab..
double ausgangsGroesseX = 320.0; double ausgangsGroesseY = 240.0; // Ask for the measurements. double mmX = hdc->GetDeviceCaps(HORZSIZE); //Anzahl der mm der physikalischen Bildschirmbreite double mmY = hdc->GetDeviceCaps(VERTSIZE); //Anzahl der mm der physikalischen Bildschirmhöhe pDoc->verzerrFaktorX = ausgangsGroesseX / mmX; pDoc->verzerrFaktorY = ausgangsGroesseY / mmY; dc.StretchBlt(0,0, pDoc->ZRKoord.window25SizeWidth*pDoc->verzerrFaktorX,pDoc->window25SizeHeight*pDoc->verzerrFaktorY,&memdc,pDoc->kAusschnittX,pDoc->kAusschnittY, pDoc->window25SizeWidth,pDoc->window25SizeHeight,SRCCOPY);sicher nicht die schönste lösung, aber funktioniert nicht ganz schlecht
