Windows 10 Anzeigeskalierung ermitteln
-
Hallo,
ich habe eine Anwendung, die sich in der Anzeige der Fenstergröße dynamisch anpasst (in dem OnResize-Ereignis).
Das funktioniert auch alles soweit gut, so lange unter Windows die Anzeigeskalierung auf 100% steht. Wenn ich dort die Anzeigeskalierung auf einen größeren Wert stelle kommen leider meine Rechnungen durcheinander, so dass nicht mehr alles passt.
Vielleicht könnte ich das ganze etwas ander programmieren, dass ich mein aktuelles Problem nicht habe, aber aktuell wäre es für mich am einfachsten, ich könnte diesen Skalierungsfaktor von Windows auslesen. Kann mir jemand sagen ob, und wenn ja wie das geht? Ich habe einiges über Skalierung gefunden, aber nicht, wie ich diesen Wert der Anzeigeeinstellung ermitteln kann.Vielen Dank im Voraus.
Beste Grüße,
Florian
-
https://msdn.microsoft.com/en-us/library/windows/desktop/mt843498.aspx
https://msdn.microsoft.com/en-us/library/ms701681.aspx
-
Danke.
Die DPI Angabe wollte ich auch schon abfragen, habe aber dabei einen Fehler gemacht und immer 96 erhalen, so dass das leider im ersten Anlauf auch nicht geholfen hat. Jetzt habe ich es hinbekommen.
-
Hi FlorianWolf,
probier mal im Formular Scaled auf False zu setzen. Dann interessiert sich die Anwendung nicht mehr für die eingestellte Skalierung.
Gruß Mümmel
-
Hier ein paar codes:
Vcl::Forms::TMonitor *curMon; curMon = Screen->MonitorFromWindow((unsigned int) Handle); ... mon = curMon->MonitorNum; ... // 2017-12-11: GetDpiForMonitor() erst ab Win 8.1 verf¸gbar //GetDpiForMonitor(Screen->Monitors[mon]->Handle, MDT_EFFECTIVE_DPI, &dpix, &dpiy); dpix = Screen->Monitors[mon]->PixelsPerInch; switch (dpix) { /* 100% */ case 96: /* 125% */ case 120: /* 150% */ case 144: /* 175% */ case 168: /* 200% */ case 192: /* 225% */ case 216: /* 250% */ case 240: /* 275% */ case 264: /* 300% */ case 288: /* 325% */ case 312: /* 350% */ case 336: /* 375% */ case 360: /* 400% */ case 384: /* 425% */ case 408: /* 450% */ case 432: /* 475% */ case 456: /* 500% */ case 480: }
-
Und hier nochmal in kurz:
Vcl::Forms::TMonitor *curMon; curMon = Screen->MonitorFromWindow((unsigned int) Handle); ... mon = curMon->MonitorNum; ... // 2017-12-11: GetDpiForMonitor() erst ab Win 8.1 verf¸gbar //GetDpiForMonitor(Screen->Monitors[mon]->Handle, MDT_EFFECTIVE_DPI, &dpix, &dpiy); dpix = Screen->Monitors[mon]->PixelsPerInch; //96 ist immer der Desginer und deshalb 100% double dPercent = 100.0 / 96.0 * (double)dpix;
mfg