2015-07-29 29 views
8

W systemie Windows 10 system nie wymaga już ponownego uruchomienia (wylogowanie/zalogowanie) w celu zmiany DPI (rozmiaru tekstu).Obsługa zmiany czasu wykonywania DPI (rozmiaru tekstu) w systemie Windows 10

Moja aplikacja nie jest gotowa na taką zmianę w czasie wykonywania.

W jaki sposób system informuje aplikację o zmianie DPI? Z jaką wiadomością powinienem sobie poradzić?


używam C++ Builder, więc szukam czystego roztworu WinAPI, bez WinForms.

+0

Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została [przeniesiona na czat] (http://chat.stackoverflow.com/rooms/84692/discussion-on-question-by-martin-prikryl-handle-runtime-change-of-dpi-text-size) . –

Odpowiedz

8

Jako @TLama i @DalijaPrasnikar commented, wiadomość do obsługi to WM_DPICHANGED.

#define WM_DPICHANGED  0x02E0 

Komunikat jest dostępny od wersji Windows 8.1, gdzie jest wysyłany do okna, gdy okno jest przenoszone do innego monitora z innym DPI.

W systemie Windows 10 zmiana środowiska wykonawczego DPI jest, z punktu widzenia interfejsu API, identyczna jak w przypadku ruchu okna do innego monitora z inną rozdzielczością DPI (z wyjątkiem oczywiście, że okno pozostaje na tym samym monitorze).

Aby otrzymać komunikat (nawet w przypadku zmiany czasu wykonywania w systemie Windows 10), aplikacja musi zadeklarować obsługę DPI dla jednego monitora. Preferowanym sposobem jest declare the support in an application manifest ustawiając dpiAwareness do PerMonitorV2 (i dodatkową wartość PerMonitor i ustawić dpiAware do True/PM dla wstecznej kompatybilności ze starszym systemem Windows 10 buduje i Windows 8.1):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
    ... 
    <asmv3:application> 
     <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
      <dpiAware>True/PM</dpiAware> 
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness> 
     </asmv3:windowsSettings> 
    </asmv3:application> 
</assembly> 

Gdy aplikacja deklaruje wsparcie per-monitorze DPI , system nie będzie skalować okien w pikselach przy zmianie środowiska wykonawczego DPI. To zależy od aplikacji, aby skalować okna natywnie.

+1

To ja wskazałem na początku wiadomość "WM_DPICHANGED" w komentarzu (teraz usunięty). Usunąłem go ze względu na notatkę * "Powiadomienie WM_DPICHANGED nie jest wysyłane, gdy użytkownik zmienia wartość skalowania pulpitu w Panelu sterowania." * Z [tego samouczka] (https://msdn.microsoft.com/en-us /library/windows/desktop/dd464659%28v=vs.85%29.aspx). – TLama

+1

Jednak w [tym samouczku] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx) oni mówią o tej wiadomości * "To powiadomienie uruchamia się, gdy użytkownik przenosi aplikację między monitorami o różnych DPI * *** i gdy użytkownik zmienia DPI w Panelu sterowania. *** "tak, że zaprzeczają sobie nawzajem. – TLama

+0

@ TLama Wiem, że to sugerujesz. Dzięki! Przetestowałem wiadomość w systemie Windows 10 i działa ona tak, jak opisano w mojej odpowiedzi. –