WinAPI - C++ - Load Accelerator

1. Accelerator Table:
Một "bảng" các phím tắt cho ứng dụng. Dùng thay thế cho cách tự xử lý hàm WM_KEYDOWN (phức tạp hơn).
http://msdn.microsoft.com/en-us/library/windows/desktop/gg153544%28v=vs.85%29.aspx
Tiện lợi:
  • Requires less coding.
  • Consolidates all of your shortcuts into one data file.
  • Supports localization into other languages.
  • Enables shortcuts and menu commands to use the same application logic.
2. Cách dùng:
Ví dụ ta muốn:
ShortcutCommand
CTRL+MToggle between modes.
F1Switch to draw mode.
F2Switch to selection mode.

- B1:
Tại header file:
#define IDR_ACCEL1                      101
#define ID_TOGGLE_MODE                40002
#define ID_DRAW_MODE                  40003
#define ID_SELECT_MODE                40004
 
- B2:
Tại .rc file:
#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
} 
Mỗi hàng là 1 command:
Cột 1: VK code hay ASCII
Cột 2: Identified command
Cột 3: Nếu là VIRTKEY thì nghĩa là cột 1 là VK code, còn ASCII thì cột 1 là ASCII
Cột 4: CONTROL, ALT, SHIFT
Chú ý có khác nhau giữa Ctrl-A và Ctrl-a (nên cột 1 thường dùng VK code)
 
- B3:
Load Accelerator (trước vòng lặp):
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCEL1));
 
- B4:
Sử dụng trong vòng lặp:
while (GetMessage(&msg, NULL, 0, 0))
 {
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }

Nhận xét