Win32API學習筆記第六章(四)

這次主要記錄了關於在資源內設置相關的鍵盤加速鍵。

鍵盤加速鍵簡介:

加速鍵是產生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就可以了
資源預覽

發佈了46 篇原創文章 · 獲贊 24 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章