Bagikan melalui


Aksesibilitas Aktif dan Penskalaan Layar Windows Vista

Windows Vista memungkinkan pengguna mengubah pengaturan titik-per-inci (dpi) sehingga sebagian besar elemen UI pada layar tampak lebih besar. Meskipun fitur ini telah lama tersedia di Microsoft Windows, dalam versi sebelumnya, penskalakan harus diimplementasikan oleh aplikasi. Di Windows Vista, Desktop Window Manager melakukan penskalaan default untuk semua aplikasi yang tidak menangani penskalaan mereka sendiri. Aplikasi klien Microsoft Active Accessibility harus memperhitungkan fitur ini.

Penyesuaian ukuran pada Windows Vista

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 lebar 12 inci, pada resolusi horizontal 1280 piksel, garis horizontal 96 piksel memperluas 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 ke ukuran dan lokasi elemen UI. Penskalaan ini dapat dilakukan secara otomatis oleh Desktop Window Manager (DWM) untuk desktop dan aplikasi yang tidak secara eksplisit meminta agar tidak diskalakan.

Akibatnya, ketika pengguna mengatur faktor skala menjadi 120 dpi, inci vertikal atau horizontal pada layar menjadi lebih besar sebesar 25 persen. Semua dimensi diskalakan sesuai proporsi. Jarak jendela dari tepi atas dan kiri layar bertambah 25 persen. Ukuran jendela meningkat dalam proporsi yang sama, bersama dengan offset dan ukuran semua elemen UI yang dikandungnya.

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

Penskalaan layar menciptakan tantangan baru untuk aplikasi yang berkaitan dengan koordinat layar dalam cara apa pun. Layar sekarang berisi dua sistem koordinat: fisik dan logis. Koordinat fisik dari sebuah titik adalah offset aktual dalam piksel dari titik asal di kiri atas. Koordinat logis adalah offset yang akan terjadi seandainya piksel itu sendiri diperbesar.

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

Koordinat logis penting, karena membuat perilaku sistem operasi dan aplikasi konsisten terlepas dari pengaturan dpi. Misalnya, System.Windows.Forms.Cursor.Position biasanya 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), kontrol tersebut ditarik ke koordinat logis tersebut, dan akan menempati posisi relatif yang sama di pengaturan dpi mana pun.

Skala pada Klien Aksesibilitas Aktif

Microsoft Active Accessibility tidak menggunakan koordinat logis. Metode dan fungsi berikut mengembalikan koordinat fisik atau mengambilnya sebagai parameter.

Secara default, aplikasi klien Microsoft Active Accessibility yang berjalan di lingkungan non-96-dpi tidak akan dapat memperoleh hasil yang benar dari panggilan ini. Misalnya, karena posisi kursor berada dalam koordinat logis, klien tidak dapat meneruskan koordinat ini ke AccessibleObjectFromPoint untuk mendapatkan elemen yang berada di bawah kursor.

Selain itu, aplikasi yang membuat jendela di luar area kliennya, seperti aplikasi aksesibilitas yang menyoroti elemen UI yang berfokus, tidak akan membuat jendela di lokasi layar yang benar, karena jendela akan ditempatkan pada koordinat logis, bukan koordinat fisik yang dikembalikan oleh IAccessible::accLocation.

Solusinya adalah dalam dua bagian:

  • Buat aplikasi klien "dpi-aware". Untuk melakukan ini, panggil fungsi SetProcessDPIAware saat startup. Fungsi ini membuat seluruh proses dapat memahami DPI, yang berarti bahwa semua jendela yang termasuk dalam proses tidak mengalami penskalaan.
  • Gunakan fungsi yang mendukung dpi. Misalnya, untuk mendapatkan koordinat kursor, panggil fungsi GetPhysicalCursorPos . Jangan gunakan GetCursorPos; perilakunya dalam aplikasi yang sadar dpi tidak ditentukan.

Jika aplikasi Anda melakukan komunikasi lintas proses langsung dengan aplikasi yang tidak mendukung dpi, Anda mungkin perlu mengonversi antara koordinat logis dan fisik dengan menggunakan fungsi PhysicalToLogicalPoint dan LogicalToPhysicalPoint.