Tabel Akselerator
Aplikasi sering menentukan pintasan keyboard, seperti CTRL+O untuk perintah Buka File. Anda dapat menerapkan pintasan keyboard dengan menangani pesan WM_KEYDOWN individual, tetapi tabel akselerator memberikan solusi yang lebih baik yang:
- Membutuhkan lebih sedikit pengkodian.
- Mengonsolidasikan semua pintasan Anda ke dalam satu file data.
- Mendukung pelokalan ke bahasa lain.
- Mengaktifkan pintasan dan perintah menu untuk menggunakan logika aplikasi yang sama.
Tabel akselerator adalah sumber daya data yang memetakan kombinasi keyboard, seperti CTRL+O, ke perintah aplikasi. Sebelum kita melihat cara menggunakan tabel akselerator, kita akan memerlukan pengantar cepat ke sumber daya. Sumber daya adalah blob data yang dibangun ke dalam biner aplikasi (EXE atau DLL). Sumber daya menyimpan data yang diperlukan oleh aplikasi, seperti menu, kursor, ikon, gambar, string teks, atau data aplikasi kustom apa pun. Aplikasi memuat data sumber daya dari biner pada durasi. Untuk menyertakan sumber daya dalam biner, lakukan hal berikut:
- Buat file definisi sumber daya (.rc). File ini menentukan jenis sumber daya dan pengidentifikasinya. File definisi sumber daya dapat mencakup referensi ke file lain. Misalnya, sumber daya ikon dideklarasikan dalam file .rc, tetapi gambar ikon disimpan dalam file terpisah.
- Gunakan Microsoft Windows Resource Compiler (RC) untuk mengkompilasi file definisi sumber daya ke dalam file sumber daya yang dikompilasi (.res). Pengkompilasi RC disediakan dengan Visual Studio dan juga Windows SDK.
- Tautkan file sumber daya yang dikompilasi ke file biner.
Langkah-langkah ini kira-kira setara dengan proses kompilasi/tautan untuk file kode. Visual Studio menyediakan sekumpulan editor sumber daya yang memudahkan untuk membuat dan memodifikasi sumber daya. (Alat-alat ini tidak tersedia di Visual Studio edisi Ekspres.) Tetapi file .rc hanyalah file teks, dan sintaksnya di dokumentasikan di MSDN, sehingga dimungkinkan untuk membuat file .rc menggunakan editor teks apa pun. Untuk informasi selengkapnya, lihat Tentang File Sumber Daya.
Menentukan Tabel Akselerator
Tabel akselerator adalah tabel pintasan keyboard. Setiap pintasan ditentukan oleh:
- Pengidentifikasi numerik. Nomor ini mengidentifikasi perintah aplikasi yang akan dipanggil oleh pintasan.
- Karakter ASCII atau kode kunci virtual pintasan.
- Tombol pengubah opsional: ALT, SHIFT, atau CTRL.
Tabel akselerator itu sendiri memiliki pengidentifikasi numerik, yang mengidentifikasi tabel dalam daftar sumber daya aplikasi. Mari kita buat tabel akselerator untuk program gambar sederhana. Program ini akan memiliki dua mode, mode gambar dan mode pemilihan. Dalam mode gambar, pengguna dapat menggambar bentuk. Dalam mode pilihan, pengguna dapat memilih bentuk. Untuk program ini, kami ingin menentukan pintasan papan tombol berikut.
Pintasan | Perintah |
---|---|
CTRL+M | Beralih antar mode. |
F1 | Beralih ke mode gambar. |
F2 | Beralih ke mode pilihan. |
Pertama, tentukan pengidentifikasi numerik untuk tabel dan untuk perintah aplikasi. Nilai-nilai ini bersifat arbitrer. Anda dapat menetapkan konstanta simbolis untuk pengidentifikasi dengan menentukannya dalam file header. Contohnya:
#define IDR_ACCEL1 101
#define ID_TOGGLE_MODE 40002
#define ID_DRAW_MODE 40003
#define ID_SELECT_MODE 40004
Dalam contoh ini, nilai IDR_ACCEL1
mengidentifikasi tabel akselerator, dan tiga konstanta berikutnya menentukan perintah aplikasi. Menurut konvensi, file header yang menentukan konstanta sumber daya sering diberi nama resource.h. Daftar berikutnya memperlihatkan file definisi sumber daya.
#include "resource.h"
IDR_ACCEL1 ACCELERATORS
{
0x4D, ID_TOGGLE_MODE, VIRTKEY, CONTROL // ctrl-M
0x70, ID_DRAW_MODE, VIRTKEY // F1
0x71, ID_SELECT_MODE, VIRTKEY // F2
}
Pintasan akselerator ditentukan dalam kurung kurawal. Setiap pintasan berisi entri berikut.
- Kode kunci virtual atau karakter ASCII yang memanggil pintasan.
- Perintah aplikasi. Perhatikan bahwa konstanta simbolis digunakan dalam contoh. File definisi sumber daya mencakup resource.h, di mana konstanta ini ditentukan.
- Kata kunci VIRTKEY berarti entri pertama adalah kode kunci virtual. Opsi lainnya adalah menggunakan karakter ASCII.
- Pengubah opsional: ALT, CONTROL, atau SHIFT.
Jika Anda menggunakan karakter ASCII untuk pintasan, maka karakter huruf kecil akan menjadi pintasan yang berbeda dari karakter huruf besar. (Misalnya, mengetik 'a' mungkin memanggil perintah yang berbeda dari mengetik 'A'.) Itu mungkin membingungkan pengguna, sehingga umumnya lebih baik menggunakan kode kunci virtual, daripada karakter ASCII, untuk pintasan.
Memuat Tabel Akselerator
Sumber daya untuk tabel akselerator harus dimuat sebelum program dapat menggunakannya. Untuk memuat tabel akselerator, panggil fungsi LoadAccelerators .
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));
Panggil fungsi ini sebelum Anda memasukkan perulangan pesan. Parameter pertama adalah handel ke modul. (Parameter ini diteruskan ke fungsi WinMain Anda. Untuk detailnya, lihat WinMain: Titik Masuk Aplikasi.) Parameter kedua adalah pengidentifikasi sumber daya. Fungsi mengembalikan handel ke sumber daya. Ingat bahwa handel adalah jenis buram yang mengacu pada objek yang dikelola oleh sistem. Jika fungsi gagal, fungsi akan mengembalikan NULL.
Anda dapat merilis tabel akselerator dengan memanggil DestroyAcceleratorTable. Namun, sistem secara otomatis merilis tabel ketika program keluar, jadi Anda hanya perlu memanggil fungsi ini jika Anda mengganti satu tabel dengan tabel lain. Ada contoh menarik dari ini dalam topik Membuat Akselerator yang Dapat Diedit Pengguna.
Menerjemahkan Goresan Kunci ke dalam Perintah
Tabel akselerator berfungsi dengan menerjemahkan goresan kunci ke dalam pesan WM_COMMAND . Parameter wParamdari WM_COMMAND berisi pengidentifikasi numerik perintah. Misalnya, menggunakan tabel yang ditunjukkan sebelumnya, goresan kunci CTRL+M diterjemahkan ke dalam pesan WM_COMMAND dengan nilai ID_TOGGLE_MODE
. Untuk meluangkan hal ini, ubah perulangan pesan Anda menjadi berikut:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(win.Window(), hAccel, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Kode ini menambahkan panggilan ke fungsi TranslateAccelerator di dalam perulangan pesan. Fungsi TranslateAccelerator memeriksa setiap pesan jendela, mencari pesan key-down. Jika pengguna menekan salah satu kombinasi tombol yang tercantum dalam tabel akselerator, TranslateAccelerator mengirimkan pesan WM_COMMAND ke jendela. Fungsi mengirimkan WM_COMMAND dengan langsung memanggil prosedur jendela. Ketika TranslateAccelerator berhasil menerjemahkan goresan kunci, fungsi mengembalikan nilai bukan nol, yang berarti Anda harus melewati pemrosesan normal untuk pesan. Jika tidak, TranslateAccelerator mengembalikan nol. Dalam hal ini, teruskan pesan jendela ke TranslateMessage dan DispatchMessage, seperti biasa.
Berikut adalah bagaimana program menggambar mungkin menangani pesan WM_COMMAND :
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_DRAW_MODE:
SetMode(DrawMode);
break;
case ID_SELECT_MODE:
SetMode(SelectMode);
break;
case ID_TOGGLE_MODE:
if (mode == DrawMode)
{
SetMode(SelectMode);
}
else
{
SetMode(DrawMode);
}
break;
}
return 0;
Kode ini mengasumsikan bahwa adalah fungsi yang SetMode
ditentukan oleh aplikasi untuk beralih di antara dua mode. Detail tentang bagaimana Anda akan menangani setiap perintah jelas tergantung pada program Anda.
Berikutnya