Targetkan Aplikasi Anda untuk .Net Framework 4.7 dan jalankan di bawah Windows 10 v1703 (Creators Update Build 15063). Dengan .Net 4.7 di bawah Windows 10 (v1703), MS membuat banyak peningkatan DPI .
Dimulai dengan .NET Framework 4.7, Windows Forms mencakup penyempurnaan untuk DPI umum tinggi dan skenario DPI dinamis. Ini termasuk:
Perbaikan dalam penskalaan dan tata letak sejumlah kontrol Windows Forms, seperti kontrol MonthCalendar dan kontrol CheckedListBox.
Penskalaan sekali jalan. Dalam .NET Framework 4.6 dan versi sebelumnya, penskalaan dilakukan melalui beberapa lintasan, yang menyebabkan beberapa kontrol diskalakan lebih dari yang diperlukan.
Dukungan untuk skenario DPI dinamis di mana pengguna mengubah DPI atau faktor skala setelah aplikasi Windows Forms diluncurkan.
Untuk mendukungnya, tambahkan manifes aplikasi ke aplikasi Anda dan beri tanda bahwa aplikasi Anda mendukung Windows 10:
<compatibility xmlns="urn:schemas-microsoft.comn:compatibility.v1">
<application>
<!-- Windows 10 compatibility -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
Selanjutnya, tambahkan app.config
dan nyatakan aplikasi Per Monitor Sadar. Ini SEKARANG dilakukan di app.config dan BUKAN di manifes seperti sebelumnya!
<System.Windows.Forms.ApplicationConfigurationSection>
<add key="DpiAwareness" value="PerMonitorV2" />
</System.Windows.Forms.ApplicationConfigurationSection>
Ini PerMonitorV2 baru sejak Windows 10 Kreator Update:
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Juga dikenal sebagai Per Monitor v2. Kemajuan atas mode kesadaran DPI per-monitor asli, yang memungkinkan aplikasi mengakses perilaku penskalaan terkait DPI baru pada basis jendela tingkat-atas.
Pemberitahuan perubahan DPI jendela anak - Dalam konteks Per Monitor v2, seluruh pohon jendela diberitahu tentang perubahan DPI yang terjadi.
Penskalaan area non-klien - Semua jendela akan secara otomatis area non-kliennya digambar dengan sensitif DPI. Panggilan ke EnableNonClientDpiScaling tidak perlu.
S caling dari menu Win32 - Semua menu NTUSER yang dibuat dalam konteks Per Monitor v2 akan diskalakan dengan mode per-monitor.
Penskalaan Dialog - Dialog Win32 yang dibuat dalam konteks Per Monitor v2 akan secara otomatis merespons perubahan DPI.
Peningkatan penskalaan kontrol comctl32 - Berbagai kontrol comctl32 telah meningkatkan perilaku penskalaan DPI dalam konteks Per Monitor v2.
Perilaku bertema yang ditingkatkan - UxTheme menangani dibuka dalam konteks jendela Per Monitor v2 akan beroperasi dalam hal DPI yang terkait dengan jendela itu.
Sekarang Anda dapat berlangganan 3 acara baru untuk mendapat pemberitahuan tentang perubahan DPI:
Control.DpiChangedAfterParent , yang dipecat Terjadi ketika pengaturan DPI untuk kontrol diubah secara programatis setelah acara perubahan DPI untuk kontrol atau formulir induknya telah terjadi.
Control.DpiChangedBeforeParent , yang dipecat ketika pengaturan DPI untuk kontrol diubah secara pemrograman sebelum acara perubahan DPI untuk kontrol atau formulir induknya telah terjadi.
Form.DpiChanged , yang diaktifkan ketika pengaturan DPI berubah pada perangkat tampilan tempat formulir saat ini ditampilkan.
Anda juga memiliki 3 metode pembantu tentang penanganan / penskalaan DPI:
Control.LogicalToDeviceUnits , yang mengubah nilai dari logis ke piksel perangkat.
Control.ScaleBitmapLogicalToDevice , yang mengubah skala gambar bitmap ke DPI logis untuk suatu perangkat.
Control.DeviceDpi , yang mengembalikan DPI untuk perangkat saat ini.
Jika Anda masih melihat masalah, Anda dapat menyisih dari peningkatan DPI melalui entri app.config .
Jika Anda tidak memiliki akses ke kode sumber, Anda dapat pergi ke properti aplikasi di Windows Explorer, pergi ke kompatibilitas dan pilih System (Enhanced)
yang mengaktifkan penskalaan GDI untuk juga meningkatkan penanganan DPI:
Untuk aplikasi yang berbasis Windows GDI sekarang dapat skala DPI ini berdasarkan per-monitor. Ini berarti bahwa aplikasi ini akan, secara ajaib, menjadi DPI per monitor.
Lakukan semua langkah itu dan Anda harus mendapatkan pengalaman DPI yang lebih baik untuk aplikasi WinForms. Tapi ingat, Anda harus menargetkan aplikasi Anda untuk .net 4.7 dan membutuhkan setidaknya Windows 10 Build 15063 (Pembaruan Pembuat). Di Pembaruan Windows 10 1709 berikutnya, kita mungkin mendapatkan lebih banyak perbaikan.
NumericUpDown
tidak skala denganMargin
baik juga. Tampaknya margin diskalakan dua kali. Jika saya skala kembali, itu terlihat bagus.