Bagikan melalui


Memahami Masalah Penskalakan Layar

Windows Vista dan versi sistem operasi yang lebih baru memungkinkan pengguna untuk mengubah pengaturan titik per inci (dpi) sehingga sebagian besar elemen UI pada layar tampak lebih besar. Di versi Windows yang lebih lama, penskalaan harus diimplementasikan oleh aplikasi. Di Windows Vista dan yang lebih baru, Desktop Window Manager (DWM) melakukan penskalaan default untuk semua aplikasi yang tidak menangani penskalaan mereka sendiri. Aplikasi klien Microsoft UI Automation harus mempertimbangkan fitur ini.

Topik ini berisi bagian berikut:

Penskalakan di Windows Vista dan Yang Lebih Baru

Pengaturan dpi default adalah 96, yang berarti bahwa 96 piksel menempati lebar atau tinggi satu inci nosional. Ukuran "inci" yang tepat tergantung pada ukuran dan resolusi fisik monitor. Misalnya, pada monitor selebar 12 inci, pada resolusi horizontal 1280 piksel, garis horizontal 96 piksel memanjang sekitar 9/10 inci.

Mengubah pengaturan dpi tidak sama dengan mengubah resolusi layar. Dengan penskalaan dpi, jumlah piksel fisik di layar tetap sama. Namun, penskalaan diterapkan pada ukuran dan lokasi elemen UI. Penskalaan ini dapat dilakukan secara otomatis oleh DWM untuk desktop dan untuk aplikasi yang tidak secara eksplisit meminta untuk tidak diskalakan.

Akibatnya, ketika pengguna menetapkan faktor skala menjadi 120 dpi, inci vertikal atau horizontal di layar menjadi lebih besar sebesar 25 persen. Semua dimensi diskalakan sesuai dengan itu. Offset jendela aplikasi dari tepi atas dan tepi kiri layar meningkat sebesar 25 persen. Jika penskalaan aplikasi diaktifkan dan aplikasi tidak sadar dpi, ukuran jendela meningkat dalam proporsi yang sama, bersama dengan offset dan ukuran semua elemen UI yang dikandungnya.

Catatan

Secara default, DWM tidak melakukan penskalaan untuk aplikasi yang tidak sadar dpi ketika pengguna mengatur dpi ke 120, tetapi melakukan penskalaan ketika dpi diatur ke nilai kustom 144 atau lebih tinggi. Namun, pengguna dapat mengganti perilaku default.

 

Penskalaan layar menciptakan tantangan baru untuk aplikasi yang terlibat dengan cara apa pun dengan koordinat layar. Layar sekarang berisi dua sistem koordinat: fisik dan logis. Koordinat fisik titik adalah offset aktual dalam piksel dari kiri atas titik asal. Koordinat logis adalah offset seperti jika piksel itu sendiri diskalakan.

Misalkan Anda mendesain kotak dialog dengan tombol pada koordinat (100, 48). Ketika kotak dialog ini ditampilkan pada default 96 dpi, tombol terletak pada koordinat fisik (100, 48). Pada 120 dpi, terletak pada koordinat fisik (125, 60). Tetapi koordinat logisnya sama pada pengaturan dpi apa pun: (100, 48).

Koordinat logis penting, karena membuat perilaku sistem operasi dan aplikasi konsisten, terlepas dari pengaturan dpi. Misalnya, biasanya, fungsi GetCursorPos mengembalikan koordinat logis. Jika Anda memindahkan kursor ke elemen dalam kotak dialog, koordinat yang sama dikembalikan, terlepas dari pengaturan dpi. Jika Anda menggambar kontrol pada (100,100), itu ditarik ke koordinat logis tersebut, dan akan menempati posisi relatif yang sama pada pengaturan dpi apa pun.

Penskalaan di Klien Automasi Antarmuka Pengguna

API Automasi Antarmuka Pengguna tidak menggunakan koordinat logis. Metode dan properti berikut mengembalikan koordinat fisik atau mengambil koordinat fisik sebagai parameter.

Secara default, aplikasi Automation UI yang berjalan di lingkungan yang tidak diatur ke 96 dpi tidak akan mendapatkan hasil yang benar dari metode dan properti ini. Misalnya, karena posisi kursor berada dalam koordinat logis, klien tidak dapat meneruskan koordinat ini ke IUIAutomation::ElementFromPoint untuk mendapatkan elemen yang berada di bawah kursor. Selain itu, aplikasi tidak akan dapat menempatkan jendela dengan benar di luar area kliennya.

Solusinya memiliki dua bagian.

Pertama, membuat aplikasi klien dpi-aware. Untuk melakukan ini, panggil fungsi SetProcessDPIAware saat startup. Fungsi ini membuat seluruh proses dpi-aware, yang berarti bahwa semua jendela yang termasuk dalam proses tidak berskala.

Kedua, untuk mendapatkan koordinat kursor, panggil fungsi GetPhysicalCursorPos .