Tentang Akselerator Keyboard

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 ke 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

Tabel akselerator terdiri dari array struktur ACCEL , masing-masing menentukan akselerator individu. 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 tombol 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. Saat TranslateAccelerator menemukan kecocokan, translateAccelerator menerjemahkan input keyboard (yaitu, pesan WM_KEYUP dan WM_KEYDOWN ) ke dalam pesan WM_COMMAND atau WM_SYSCOMMAND lalu mengirim pesan ke prosedur jendela jendela yang ditentukan. Ilustrasi berikut menunjukkan bagaimana akselerator diproses.

model pemrosesan akselerator keyboard

Pesan WM_COMMAND mencakup pengidentifikasi akselerator yang menyebabkan TranslateAccelerator menghasilkan pesan. Prosedur jendela memeriksa pengidentifikasi untuk menentukan sumber pesan lalu memproses pesan yang sesuai.

Tabel akselerator ada pada dua tingkat yang berbeda. Sistem ini 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 Penetapan Keystroke Akselerator.

Sistem ini juga mempertahankan tabel akselerator untuk setiap aplikasi. Aplikasi dapat menentukan sejumlah tabel akselerator untuk digunakan dengan jendelanya sendiri. Handel 32-bit unik (HACCEL) mengidentifikasi setiap tabel. Namun, hanya satu tabel akselerator yang dapat aktif pada satu waktu untuk utas tertentu. Handel 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 handel akselerator-tabel yang berbeda ke TranslateAccelerator.

Pembuatan Accelerator-Table

Beberapa langkah diperlukan untuk membuat tabel akselerator untuk aplikasi. Pertama, pengkompilasi sumber daya digunakan untuk membuat sumber daya accelerator-table dan untuk menambahkannya ke file yang dapat dieksekusi aplikasi. Pada durasi, fungsi LoadAccelerators digunakan untuk memuat tabel akselerator ke dalam memori dan mengambil handel ke tabel akselerator. Handel ini diteruskan ke fungsi TranslateAccelerator untuk mengaktifkan tabel akselerator.

Tabel akselerator juga dapat dibuat untuk aplikasi pada durasi dengan meneruskan array struktur ACCEL ke fungsi CreateAcceleratorTable . Metode ini mendukung akselerator yang ditentukan pengguna dalam aplikasi. Seperti fungsi LoadAccelerators , CreateAcceleratorTable mengembalikan handel accelerator-table yang dapat diteruskan 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 yang 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, handel ke tabel akselerator baru diambil dengan memanggil CreateAcceleratorTable. Akhirnya, handel diteruskan ke TranslateAccelerator untuk mengaktifkan tabel baru.

Penetapan Penetapan Penempatan Kunci Akselerator

Kode karakter ASCII atau kode kunci virtual dapat digunakan untuk menentukan akselerator. Kode karakter ASCII membuat kasus akselerator sensitif. Dengan demikian, menggunakan karakter ASCII "C" mendefinisikan akselerator sebagai ALT+C daripada ALT+c. Namun, akselerator peka 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, sehingga sebagian besar aplikasi menggunakan kode kunci virtual untuk akselerator daripada kode karakter ASCII.

Hindari akselerator yang bertentangan dengan mnemonik menu aplikasi, karena akselerator menggantikan mnemonic, yang dapat membingungkan pengguna. Untuk informasi selengkapnya tentang menu mnemonics, 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. Namun, hindari praktik ini karena mencegah akselerator sistem melakukan peran standarnya di antarmuka pengguna. Akselerator di seluruh sistem dijelaskan dalam daftar berikut:

Accelerator 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 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 prosedur jendela untuk menentukan sumber pesan. Jika akselerator menghasilkan pesan WM_COMMAND , pengidentifikasinya adalah 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 WM_COMMAND akselerator dengan cara yang sama persis seperti item menu yang sesuai WM_COMMAND pesan. 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 UI-nya. Pengaturan ini dikenal sebagai status UI. Status UI mencakup pengaturan berikut:

  • indikator fokus (seperti persegi fokus pada tombol)
  • akselerator keyboard (ditunjukkan oleh garis bawah dalam label kontrol)

Jendela dapat mengirim pesan untuk meminta perubahan 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 default, semua jendela anak 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 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 tingkat atas mengirim pesan WM_UPDATEUISTATE ke jendela di pohon jendela. Jika jendela tidak meneruskan pesan WM_CHANGEUISTATE , jendela tersebut tidak akan mencapai jendela tingkat atas dan status UI tidak akan diperbarui.