Ungenauigkeiten mit Windows High DPI Settings und GetClientRect/ClientToScreen



  • Mir ist unter Windows 10 aufgefallen, dass bei der Verwendung der Betriebssystem-eigenen High DPI Settings (z.B. 125 😵 es zu Rundungsfehlern kommt. Diese treten abhängig von der absoluten Position des mit GetClientRect() beobachteten Fensters auf.

    GetClientRect() liefert mit DPI Settings jenseits von 100% heruntergerechnete Werte, deren Rundungsfehler sich dann bei weiterer Verwendung fortpflanzen.

    Beispielsweise ist ein exaktes ClipCursor() dann nicht mehr möglich, weil die Werte offenbar nicht 1:1 zurückgerechnet werden (können).

    Ich rege hiermit zur Beschäftigung mit dieser Problematik an bzw. hoffe auf Lösungen jenseits von "nutzen Sie kein DPI-Scaling".

    (Settings - System - Display - "Change the size of text, apps, and other items")


  • Mod

    Wovon redest du? Was hat das mit C zu tun? Ist das überhaupt ein Programmierungsproblem?



  • Gehört ins WinApi Forum.

    Ist deine Anwendung DPI aware?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Guten Tag,

    meine Anwendung ist nicht DPI aware.

    Wie mache ich ein C-Konsolenprogramm, welches den Header "windows.h" nutzt, DPI aware? Die Funktion SetProcessDPIAware ist nicht vorhanden.
    Würde DPI awareness das Problem beheben?



  • Wieso sollte die Funktion nicht vorhanden sein? Was hast du für ein Betriebssystem?
    Naja, das mit der DPI Awareness ist nicht so ganz einfach, ich kenn mich da auch nur am Rande aus. Aber wenn du die Funktion aufrufst, sollte Windows die Größen nicht mehr von sich auch skalieren und du musst dich selber drum kümmern.



  • Ich habe das Problem jetzt erstmal temporär ganz trivial gelöst.
    Mit einer externen Manifest-Datei, die "<dpiAware>true</dpiAware>" enthält.
    So ganz begeistert bin ich noch nicht.

    Warum die Funktion SetProcessDPIAware() im Header Winuser.h wie von Microsoft angegeben nicht vorhanden ist, weiß ich nicht.
    Vielleicht braucht man dafür Visual Studio und/oder C++.
    https://msdn.microsoft.com/de-de/library/windows/desktop/ms633543(v=vs.85).aspx

    Ich benutze den GNU GCC Compiler und Windows 10.



  • Die Lösung übers Manifest ist auch ok.


Log in to reply