Ciblez votre application pour .Net Framework 4.7 et exécutez-la sous Windows 10 v1703 (Creators Update Build 15063). Avec .Net 4.7 sous Windows 10 (v1703), MS a apporté de nombreuses améliorations DPI .
À partir du .NET Framework 4.7, Windows Forms inclut des améliorations pour les scénarios DPI élevés et dynamiques. Ceux-ci inclus:
Améliorations de la mise à l'échelle et de la disposition d'un certain nombre de contrôles Windows Forms, tels que le contrôle MonthCalendar et le contrôle CheckedListBox.
Mise à l'échelle en un seul passage. Dans le .NET Framework 4.6 et les versions antérieures, la mise à l'échelle était effectuée via plusieurs passes, ce qui entraînait une mise à l'échelle de certains contrôles plus que nécessaire.
Prise en charge des scénarios DPI dynamiques dans lesquels l'utilisateur modifie le DPI ou le facteur d'échelle après le lancement d'une application Windows Forms.
Pour le prendre en charge, ajoutez un manifeste d'application à votre application et signalez que votre application prend en charge Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Ensuite, ajoutez un app.config
et déclarez l'application Per Monitor Aware. Cela se fait MAINTENANT dans app.config et PAS dans le manifeste comme avant!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Ce PerMonitorV2 est nouveau depuis la mise à jour Windows 10 Creators:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Aussi connu sous le nom de Per Monitor v2. Une avancée par rapport au mode de prise de conscience DPI par moniteur d'origine, qui permet aux applications d'accéder à de nouveaux comportements de mise à l'échelle liés à DPI sur une base de fenêtre de niveau supérieur.
Notifications de modification PPP de la fenêtre enfant - Dans les contextes Par moniteur v2, la totalité de l'arborescence de la fenêtre est notifiée de toute modification PPP qui se produit.
Mise à l'échelle de la zone non-client - Toutes les fenêtres auront automatiquement leur zone non-client dessinée d'une manière sensible DPI. Les appels à EnableNonClientDpiScaling sont inutiles.
S intitulant des menus Win32 - Tous les menus NTUSER créés dans les contextes de par moniteur sera mise à l' échelle d'une manière par moniteur.
Mise à l'échelle des dialogues - Les boîtes de dialogue Win32 créées dans les contextes Per Monitor v2 répondront automatiquement aux modifications DPI.
Mise à l'échelle améliorée des contrôles comctl32 - Divers contrôles comctl32 ont amélioré le comportement de mise à l'échelle DPI dans les contextes Per Monitor v2.
Amélioration du comportement de thématisation - Les poignées UxTheme ouvertes dans le contexte d'une fenêtre Per Monitor v2 fonctionneront en termes de DPI associé à cette fenêtre.
Vous pouvez désormais vous abonner à 3 nouveaux événements pour être averti des modifications DPI:
Control.DpiChangedAfterParent , qui est déclenché Se produit lorsque le paramètre PPP d'un contrôle est modifié par programme après qu'un événement de modification PPP pour son contrôle parent ou son formulaire s'est produit.
Control.DpiChangedBeforeParent , qui est déclenché lorsque le paramètre PPP d'un contrôle est modifié par programme avant qu'un événement de modification PPP pour son contrôle ou son formulaire parent ne se soit produit.
Form.DpiChanged , qui est déclenché lorsque le paramètre PPP change sur le périphérique d'affichage sur lequel le formulaire est actuellement affiché.
Vous disposez également de 3 méthodes d'assistance sur la gestion / mise à l'échelle DPI:
Control.LogicalToDeviceUnits , qui convertit une valeur de pixels logiques en pixels de périphérique.
Control.ScaleBitmapLogicalToDevice , qui met à l'échelle une image bitmap au DPI logique d'un périphérique.
Control.DeviceDpi , qui renvoie le DPI pour le périphérique actuel.
Si des problèmes persistent, vous pouvez désactiver les améliorations DPI via les entrées app.config .
Si vous n'avez pas accès au code source, vous pouvez accéder aux propriétés de l'application dans l'Explorateur Windows, accéder à la compatibilité et sélectionner System (Enhanced)
qui active la mise à l'échelle GDI pour améliorer également la gestion DPI:
Pour les applications basées sur GDI, Windows peut désormais les mettre à l'échelle DPI sur une base par moniteur. Cela signifie que ces applications deviendront, comme par magie, une prise en charge DPI par moniteur.
Suivez toutes ces étapes et vous devriez obtenir une meilleure expérience DPI pour les applications WinForms. Mais rappelez-vous, vous devez cibler votre application pour .net 4.7 et au moins Windows 10 Build 15063 (Creators Update). Dans la prochaine mise à jour 1709 de Windows 10, nous pourrions obtenir d'autres améliorations.
NumericUpDown
ne met pas saMargin
correctement, aussi. Il semble que la marge soit redimensionnée deux fois. Si je le réduis une fois, ça a l'air bien.