這次主要記錄了關於在資源內設置相關的鍵盤加速鍵。
鍵盤加速鍵簡介:
加速鍵是產生WM_COMMAND消息的(也可能是WM_SYSCOMMAND)的鍵盤組合。
鍵盤加速:
鍵盤加速是一個直接把消息發往窗口過程(GetMessage的第一個參數爲MSG,MSG的第一個域就是這個窗口過程句柄)這個窗口過程通常的格式爲:
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
對比之前的窗口過程,發現這裏面多了一個if的驗證,其實這個if裏面的函數就是用於轉換鍵盤代碼的(和TranslateMessage有一點相似:TranslateAccelerator是將一個鍵盤消息截獲然後從一個HACCEL的鍵盤加速表中查找對應的窗口,然後將轉換好的消息直接發給相關hWnd的窗口過程去,這就是爲什麼這玩意的第一個參數是一個hWnd了
TranslateMessage則是將由一個WM_(SYS)KEYDOWN&UP產生的鍵盤消息轉換爲ASCII上前0X7F對應的字符,然後把原消息替換掉變爲一個WM_CHAR。
他們的返回值都有一個特點:轉換成功返回一個非零的值
而且我們都知道,GetMessage當第二個參數爲NULL時會在返回時將其中的hWnd域填充爲要獲取到這個消息的hWnd,然而,TranslateAcceleator則是在轉換成功後將參數中的hWnd替換掉msg.hwnd,這就是爲什麼它可以把一個鍵盤加速消息發送到一個窗口裏的原因。
WM_COMMAND:
收到這個消息可能有下面三種情況:
1:爲加速鍵消息,此時兩個參數的說明爲:
wParam的高位爲1,低位爲加速鍵ID,lParam爲0
2:爲菜單,此時兩個參數的說明爲:
wParam的高位爲0,低位爲菜單ID,lParam爲0
3:爲控制,此時兩個參數的說明爲:
wParam的低位爲控制ID,高位爲相應的通知碼,lParam爲子窗口句柄。
關於這個鍵盤加速還有一個點,就是如果他與一個菜單對應時,窗口過程會在相關菜單前發送WM_INITMENU\WM_INITMENUPOPUP\WM_MENUSELECT,但是在處理WM_INITMENUPOPUP時程序往往禁用和啓用彈出式菜單中的菜單項。同時如果我們的鍵盤加速對應的菜單是不可用的則不會發送WM_COMMAND或者WM_SYSCOMMAND
如果窗口是最小化,則將啓動系統菜單相應的東西。
如何使用?
在VS2017中,資源文件內會有一個資源類爲Acceleratoe,這個資源類中創建一個資源就好,其他的直接往那一個資源裏面添加相關菜單ID就可以了