Unterschiedliche Bildschirmkoordinaten

  • C

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von rwCapt.

    Unterschiedliche Bildschirmkoordinaten

    Guten Abend,

    ich programmiere mit der WinAPI in C/C++/Assembler und habe in meinem Fenster mit der Funktion Rectangle(HDC, int, int, int, int) ein Rechteck gezeichnet, das sich immer an die untere Seite des Fensters anpasst. Wird das Fenster also bewegt, folgt das Rechteck dem Fenster.

    Jetzt hatte ich mir vor einigen Tagen einen Laptop gekauft und da ist mir ein Problemchen ersichtlich geworden, das einem erst auffällt, sobald man sein selbst geschriebenes Programm mal woanders testet ...

    Der Computer, an dem ich das Rechteck schön an die untere Seite des Fensters angepasst habe, hat eine Auflösung von 3840|2160, der Laptop eine von 1920|1080. Ich habe die letzten Stunden schon so viel herumprobiert und im Internet gesucht, bin aber nicht fündig geworden.

    Das Rechteck passt also genau an den unteren Rand meines Fensters, wenn ich das Programm auf meinem PC (3840|2160) starte. Auf dem Laptop hingegen ist das gesamte Rechteck scheinbar um ca. 7 Pixel verschoben.
    Ich weiß nun nicht, wie ich herausfinden kann, um wie viele Pixel ich die obere Kante des Rechtecks anpassen muss, damit das Rechteck sowohl auf dem Laptop als auch auf meinem großen PC gleich aussieht. Die 7 Pixel sind ja jetzt auch nur eine aus dem Himmel gegriffene Zahl, die ja genau für die Laptop-Auflösung passen. Eine Magic-Number, mit der ich nichts weiter anfangen kann. Ich bräuchte eine Möglichkeit, um herauszufinden, welche Maße mein Rechteck haben muss, wenn ich die und die Auflösung habe.

    Kennt sich da vielleicht jemand mit aus?

    Vielen Dank vorab schon mal.
    Eine Umwandlung eines Floats/Decimals in Integer ist auf jeden Fall nicht vorhanden. Das Programm arbeitet nur mit Ganzzahlen.

    C-Quellcode

    1. ​ Rectangle(hdc, 0, this->m_bottom - 36, this->m_right - 667 - this->m_left, this->m_bottom);


    Die 36 gibt hier an, wie hoch das Rechteck ist. Auf meinem großen PC sind es eben diese 36 Pixel, auf dem Laptop muss hier eine 29 stehen, damit es optisch genau gleich ist.
    @rwCapt Das liegt an dieser Einstellung:

    In .NET kann man da was machen. In C weiß ich nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jetzt hat es mir noch mal die ganze Formatierung durcheinander geworfen. ^^

    Also ich muss irgendeinen Weg finden, um herauszufinden, welche Maße die Elemente haben müssen, damit sie unabhängig von der Auflösung und Skalierung richtig dargestellt werden.

    Wie wird das in .NET gemacht? Ich habe mir schon gedacht, dass es da eine einfache Möglichkeit gibt. Vielleicht kann man ja mithilfe dessen auch auf eine Lösung in C kommen.
    Hi

    Meine Vermutung ist das hier mit 2 unterschiedlichen Skalierungen für die Displays gearbeitet wird. Schau doch mal mit rechtsklick auf den Desktop -> Anzeigeeinstellungen -> unter Skalierung und Anordnung.
    Mfg -Franky-
    Vielen Dank an alle. Durch den Hinweis auf die Bildschirmskalierung bin ich weiter gekommen. Die Funktion GetDpiForWindow ist hier meine Rettung. Mit der Message WM_DPICHANGE habe ich auch die Möglichkeit, Änderungen an der Dpi zu erfassen und umzusetzen.
    Ich nehme einfach meine 144 Dpi (GetDpiForWindow(hWnd) <- für meinen 3840|2160) als Ausgangswert, passe sämtliche Maße genau darauf an und dividiere/multipliziere sämtliche Werte dann mit dem Dpi-Wert im Verhältnis zum Ausgangswert von 144, sollte der Dpi-Wert unterschiedlich sein.