Tentang Keyboard Accelerators
Akselerator terkait erat dengan menu — keduanya memberi pengguna akses ke set perintah aplikasi. Biasanya, pengguna mengandalkan menu aplikasi untuk mempelajari set perintah dan kemudian beralih menggunakan akselerator saat mereka menjadi lebih mahir dengan aplikasi. Akselerator menyediakan akses langsung yang lebih cepat ke perintah daripada menu. Minimal, aplikasi harus menyediakan akselerator untuk perintah yang lebih umum digunakan. Meskipun akselerator biasanya menghasilkan perintah yang ada sebagai item menu, mereka juga dapat menghasilkan perintah yang tidak memiliki item menu yang setara.
Bagian ini membahas topik berikut.
- Tabel Akselerator
- Accelerator-Table Pembuatan
- Penetapan Tombol Pintas Akselerator
- Akselerator dan Menu
- Status UI
Tabel Akselerator
Tabel akselerator terdiri dari array struktur ACCEL, masing-masing mendefinisikan akselerator individual. Setiap struktur ACCEL mencakup informasi berikut:
- Kombinasi penekanan tombol akselerator.
- Pengidentifikasi akselerator.
- Berbagai bendera. Ini termasuk salah satu yang menentukan apakah sistem memberikan umpan balik visual dengan menyoroti item menu yang sesuai, jika ada, ketika akselerator digunakan
Untuk memproses penekanan kunci akselerator untuk utas tertentu, pengembang harus memanggil fungsi TranslateAccelerator dalam perulangan pesan yang terkait dengan antrean pesan utas. Fungsi TranslateAccelerator memantau input keyboard ke antrean pesan, memeriksa kombinasi kunci yang cocok dengan entri dalam tabel akselerator. Ketika TranslateAccelerator menemukan kecocokan, itu menerjemahkan input keyboard (yaitu, pesan WM_KEYUP dan WM_KEYDOWN) ke dalam pesan WM_COMMAND atau WM_SYSCOMMAND lalu mengirim pesan ke prosedur jendela dari jendela yang ditentukan. Ilustrasi berikut menunjukkan bagaimana akselerator diproses.
Pesan WM_COMMAND menyertakan pengidentifikasi akselerator yang menyebabkan TranslateAccelerator menghasilkan pesan. Prosedur jendela memeriksa pengidentifikasi untuk menentukan sumber pesan lalu memproses pesan yang sesuai.
Tabel akselerator ada di dua tingkat yang berbeda. Sistem mempertahankan satu tabel akselerator di seluruh sistem yang berlaku untuk semua aplikasi. Aplikasi tidak dapat mengubah tabel akselerator sistem. Untuk deskripsi akselerator yang disediakan oleh tabel akselerator sistem, lihat Penetapan Penekanan Tombol Akselerator.
Sistem ini juga mempertahankan tabel akselerator untuk setiap aplikasi. Aplikasi dapat menentukan sejumlah tabel akselerator untuk digunakan dengan jendelanya sendiri. Handle 32-bit unik (HACCEL) mengidentifikasi setiap tabel. Namun, hanya satu tabel akselerator yang dapat aktif sekaligus untuk utas tertentu. Handle ke tabel akselerator yang diteruskan ke fungsi TranslateAccelerator menentukan tabel akselerator mana yang aktif untuk utas. Tabel akselerator aktif dapat diubah kapan saja dengan meneruskan handle tabel akselerator yang berbeda ke TranslateAccelerator.
Accelerator-Table Pembuatan
Beberapa langkah diperlukan untuk membuat tabel akselerator untuk aplikasi. Pertama, pengkompilasi sumber daya digunakan untuk membuat sumber daya tabel akselerator dan untuk menambahkannya ke file yang dapat dieksekusi aplikasi. Pada waktu proses, fungsi LoadAccelerators digunakan untuk memuat tabel akselerator ke dalam memori dan mengambil pegangan ke tabel akselerator. Handel ini diteruskan ke fungsiTranslateAccelerator untuk mengaktifkan tabel akselerator.
Tabel akselerator juga dapat dibuat untuk aplikasi pada waktu proses dengan meneruskan array struktur ACCEL ke fungsi CreateAcceleratorTable . Metode ini mendukung akselerator yang ditentukan pengguna dalam aplikasi. Seperti fungsi LoadAccelerators, CreateAcceleratorTable mengembalikan handle tabel akselerator yang dapat diberikan ke TranslateAccelerator untuk mengaktifkan tabel akselerator.
Sistem secara otomatis menghancurkan tabel akselerator yang dimuat oleh LoadAccelerators atau dibuat oleh CreateAcceleratorTable. Namun, aplikasi dapat membebaskan sumber daya saat berjalan dengan menghancurkan tabel akselerator tidak lagi diperlukan dengan memanggil fungsi DestroyAcceleratorTable.
Tabel akselerator yang ada dapat disalin dan dimodifikasi. Tabel akselerator yang ada disalin dengan menggunakan fungsi CopyAcceleratorTable. Setelah salinan dimodifikasi, handle ke tabel akselerator baru didapatkan dengan memanggil CreateAcceleratorTable. Terakhir, handle diteruskan ke TranslateAccelerator untuk mengaktifkan tabel baru.
Penetapan Pencetan Tombol Pemercepat
Kode karakter ASCII atau kode kunci virtual dapat digunakan untuk menentukan akselerator. Kode karakter ASCII membuat akselerator peka terhadap huruf besar-kecil. Dengan demikian, menggunakan karakter ASCII "C" mendefinisikan akselerator sebagai ALT+C daripada ALT+c. Namun, akselerator yang sensitif terhadap huruf besar/kecil dapat membingungkan untuk digunakan. Misalnya, akselerator ALT+C akan dihasilkan jika kunci CAPS LOCK tidak berfungsi atau jika tombol SHIFT tidak berfungsi, tetapi tidak jika keduanya tidak berfungsi.
Biasanya, akselerator tidak perlu peka huruf besar/kecil, jadi sebagian besar aplikasi menggunakan kode kunci virtual untuk akselerator daripada kode karakter ASCII.
Hindari akselerator yang bertentangan dengan mnemonic menu aplikasi, karena akselerator mengambil alih mnemonic, yang dapat membingungkan pengguna. Untuk informasi lebih lanjut tentang mnemonik menu, lihat Menu.
Jika aplikasi mendefinisikan akselerator yang juga ditentukan dalam tabel akselerator sistem, akselerator yang ditentukan aplikasi mengambil alih akselerator sistem, tetapi hanya dalam konteks aplikasi. Hindari praktik ini, bagaimanapun, karena mencegah akselerator sistem melakukan peran standarnya di antarmuka pengguna. Akselerator di seluruh sistem dijelaskan dalam daftar berikut:
akselerator | Deskripsi |
---|---|
ALT+ESC | Beralih ke aplikasi berikutnya. |
ALT+F4 | Menutup aplikasi atau jendela. |
ALT+TANDA HUBUNG | Membuka menu Jendela untuk jendela dokumen. |
ALT+PRINT SCREEN (Tombol Pintasan untuk menangkap layar) | Menyalin gambar di jendela aktif ke clipboard. |
ALT+SPACEBAR | Membuka menu Jendela untuk jendela utama aplikasi. |
ALT+TAB | Beralih ke aplikasi berikutnya. |
CTRL+ESC | Beralih ke menu Mulai. |
CTRL+F4 | Menutup jendela grup atau dokumen aktif. |
F1 | Memulai file bantuan aplikasi, jika ada. |
CETAK LAYAR | Menyalin gambar pada layar ke clipboard. |
SHIFT+ALT+TAB | Beralih ke aplikasi sebelumnya. Pengguna harus menekan dan menahan ALT+SHIFT saat menekan TAB. |
Akselerator dan Menu
Menggunakan akselerator sama dengan memilih item menu: Kedua tindakan menyebabkan sistem mengirim pesan WM_COMMAND atau WM_SYSCOMMAND ke prosedur jendela yang sesuai. Pesan WM_COMMAND menyertakan pengidentifikasi yang diperiksa oleh prosedur untuk jendela guna menentukan sumber pesan. Jika akselerator menghasilkan pesan WM_COMMAND, pengidentifikasi tersebut adalah milik akselerator. Demikian pula, jika item menu menghasilkan pesan WM_COMMAND, pengidentifikasinya adalah item menu. Karena akselerator menyediakan pintasan untuk memilih perintah dari menu, aplikasi biasanya menetapkan pengidentifikasi yang sama ke akselerator dan item menu yang sesuai.
Aplikasi memproses pesan akselerator WM_COMMAND dengan cara yang sama persis seperti pesan item menu yang sesuai WM_COMMAND. Namun, pesan WM_COMMAND berisi bendera yang menentukan apakah pesan berasal dari akselerator atau item menu, jika akselerator harus diproses secara berbeda dari item menu yang sesuai. Pesan WM_SYSCOMMAND tidak berisi bendera ini.
Pengidentifikasi menentukan apakah akselerator menghasilkan pesan WM_COMMAND atau WM_SYSCOMMAND. Jika pengidentifikasi memiliki nilai yang sama dengan item menu di menu Sistem, akselerator menghasilkan pesan WM_SYSCOMMAND. Jika tidak, akselerator menghasilkan pesan WM_COMMAND.
Jika akselerator memiliki pengidentifikasi yang sama dengan item menu dan item menu berwarna abu-abu atau dinonaktifkan, akselerator dinonaktifkan dan tidak menghasilkan pesan WM_COMMAND atau WM_SYSCOMMAND. Selain itu, akselerator tidak menghasilkan pesan perintah jika jendela yang sesuai diminimalkan.
Ketika pengguna menggunakan akselerator yang sesuai dengan item menu, prosedur jendela menerima pesan WM_INITMENU dan WM_INITMENUPOPUP seolah-olah pengguna telah memilih item menu. Untuk informasi tentang cara memproses pesan ini, lihat Menu .
Akselerator yang sesuai dengan item menu harus disertakan dalam teks item menu.
Status UI
Windows memungkinkan aplikasi menyembunyikan atau menampilkan berbagai fitur di antarmuka penggunanya. Pengaturan ini dikenal sebagai status UI. Status antarmuka pengguna menyertakan pengaturan berikut:
- indikator fokus (contoh: persegi panjang fokus yang muncul pada tombol)
- akselerator keyboard (ditunjukkan dengan garis bawah pada label kendali)
Jendela dapat mengirim pesan untuk meminta perubahan dalam status UI, dapat mengkueri status UI, atau menerapkan status tertentu untuk jendela anaknya. Pesan-pesan ini adalah sebagai berikut.
Pesan | Deskripsi |
---|---|
WM_CHANGEUISTATE | Menunjukkan bahwa status UI harus berubah. |
WM_QUERYUISTATE | Mengambil status UI untuk jendela. |
WM_UPDATEUISTATE | Mengubah status UI. |
Secara bawaan, semua jendela turunan dari jendela tingkat atas dibuat dengan status UI yang sama dengan induknya.
Sistem menangani status UI untuk kontrol dalam kotak dialog. Pada pembuatan kotak dialog, sistem menginisialisasi status UI yang sesuai. Semua kontrol anak mewarisi status ini. Setelah kotak dialog dibuat, sistem memantau penekanan kunci pengguna. Jika pengaturan status UI disembunyikan dan pengguna menavigasi menggunakan keyboard, sistem memperbarui status UI. Misalnya, jika pengguna menekan tombol Tab untuk memindahkan fokus ke kontrol berikutnya, sistem memanggil WM_CHANGEUISTATE untuk membuat indikator fokus terlihat. Jika pengguna menekan tombol Alt, sistem memanggil WM_CHANGEUISTATE untuk membuat akselerator keyboard terlihat.
Jika kontrol mendukung navigasi antara elemen UI yang dikandungnya, kontrol dapat memperbarui status UI-nya sendiri. Kontrol dapat memanggil WM_QUERYUISTATE untuk mengambil dan menyimpan cache status antarmuka pengguna awal. Setiap kali kontrol menerima pesan WM_UPDATEUISTATE, kontrol dapat memperbarui status UI-nya dan mengirim pesan WM_CHANGEUISTATE ke induknya. Setiap jendela akan terus mengirim pesan ke induknya hingga mencapai jendela tingkat atas. Jendela utama mengirimkan pesan WM_UPDATEUISTATE ke jendela-jendela dalam pohon jendela. Jika jendela tidak meneruskan pesan WM_CHANGEUISTATE, jendela tidak akan mencapai jendela tingkat atas dan status UI tidak akan diperbarui.