MFC:如何為你的程序添加快捷鍵
第一步:在資源視圖—— .rc 文件里新建 Accelerator



ID 表示要關(guān)聯(lián)的控件的 ID;
修飾符,見(jiàn)類(lèi)型;
鍵:見(jiàn)類(lèi)型;
類(lèi)型表示是用 VIRTKEY(虛擬鍵碼)還是 ASCII( ASCII 碼)說(shuō)明快捷鍵,此處默認(rèn)為 VIRTKEY。 常見(jiàn)的虛擬鍵碼有 VK_F4(即 F4), VK_RETURN(即 Enter 鍵), VK_ESCAPE(即 Esc 鍵)等,對(duì)于字母鍵和數(shù)字鍵(非小鍵盤(pán)),它們的虛擬鍵碼就是 ASCII 碼。 注意: VIRTKEY 指示的字母須大寫(xiě), ASCII 指示的字母須小寫(xiě)。
第二步:關(guān)聯(lián)控件,并設(shè)置快捷鍵
這里我將 ID 設(shè)置為 IDC_SAVE_BUTTON(我做的關(guān)于文件另存為的 Button),修飾符和鍵分別為 Ctrl 和 S( VIRTKEY 指示的字母須大寫(xiě),再次提醒),類(lèi)型則為 VIRTKEY。

第三步:添加相關(guān)的代碼
①在控件所在 Dialog 相應(yīng)的頭文件中添加:
HACCEL m_hAccelTable;

其中 HACCEL 是?Handle?to an?accelerator?table 的縮寫(xiě),即為快捷鍵表句柄。
②在對(duì)話(huà)框相應(yīng)類(lèi)的構(gòu)造函數(shù)中添加:
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR));

winuser.h 標(biāo)頭將 LoadAccelerators 定義為 LoadAcceleratorsA( ANSI 版本)和 LoadAcceleratorsW(?UNICODE 版本)的別名,該別名根據(jù) UNICODE 預(yù)處理器常量的定義自動(dòng)選擇此函數(shù)的 ANSI 或 Unicode 版本。
LoadAcceleratorsA 函數(shù)的語(yǔ)法:
HACCEL LoadAcceleratorsA(
? [in, optional] HINSTANCE hInstance,
? [in] ? ? ? ? ? LPCSTR ? ?lpTableName
);
LoadAcceleratorsW?函數(shù)的語(yǔ)法:
HACCEL LoadAcceleratorsW(
? [in, optional] HINSTANCE hInstance,
? [in] ? ? ? ? ? LPCWSTR ? lpTableName
);
LoadAccelerators?函數(shù)用于加載指定的加速器表。 其中 hInstance 表示模塊的句柄, lpTableName 表示其可執(zhí)行文件包含要加載的加速器表,若要?jiǎng)?chuàng)建此值,需要使用?MAKEINTRESOURCE?宏。
同樣, winuser.h 標(biāo)頭將 MAKEINTRESOURCE?定義為 MAKEINTRESOURCEA(?ANSI?版本)和 MAKEINTRESOURCEW(?UNICODE 版本)的別名。 它的作用是將整數(shù)值轉(zhuǎn)換為與資源管理功能兼容的資源類(lèi)型。 此宏用于代替包含資源名稱(chēng)的字符串。
MAKEINTRESOURCEA 宏的語(yǔ)法:
void MAKEINTRESOURCEA(
? i
);
MAKEINTRESOURCEW 宏的語(yǔ)法:
void?MAKEINTRESOURCEW(
? i
);
其中 i 表示要轉(zhuǎn)換的整數(shù)值。
③選中對(duì)話(huà)框,右鍵選擇類(lèi)向?qū)А?/p>
選擇添加 PreTranslateMessage 函數(shù)。

在添加的?PreTranslateMessage?函數(shù)中添加:
if (TranslateAccelerator(GetSafeHwnd(), m_hAccelTable, pMsg))
{
return TRUE;
}

你也可以通過(guò)選中對(duì)話(huà)框?qū)?yīng)的類(lèi),在屬性中重寫(xiě)此函數(shù)。

同樣 TranslateAccelerator 也是其?ANSI?版本和其?UNICODE 版本的別名,此函數(shù)用于處理菜單命令的快捷鍵(如果指定了快捷鍵表)則該函數(shù)會(huì)將?WM_KEYDOWN?或?WM_SYSKEYDOWN?消息轉(zhuǎn)換為?WM_COMMAND?或?WM_SYSCOMMAND消息,然后將 WM_COMMAND 或 WM_SYSCOMMAND 消息直接發(fā)送到指定的窗口過(guò)程。 在窗口過(guò)程處理消息之前, TranslateAccelerator?函數(shù)不會(huì)返回。
TranslateAcceleratorA 函數(shù)的語(yǔ)法:
int TranslateAcceleratorA(
? [in] HWND ? hWnd,
? [in] HACCEL hAccTable,
? [in] LPMSG ?lpMsg
);
TranslateAcceleratorW 函數(shù)的語(yǔ)法:
int TranslateAcceleratorW(
? [in] HWND ? hWnd,
? [in] HACCEL hAccTable,
? [in] LPMSG ?lpMsg
);
其中 hWnd 表示要翻譯其消息的窗口的句柄。 其中 hAccTable 表示加速器表的句柄。 加速鍵表必須由對(duì)?LoadAccelerators?函數(shù)的調(diào)用或通過(guò)對(duì)?CreateAcceleratorTable?函數(shù)的調(diào)用創(chuàng)建來(lái)加載。?lpMsg 表示指向?MSG?結(jié)構(gòu)的指針,其中包含使用?GetMessage?或?PeekMessage?函數(shù)從調(diào)用線(xiàn)程的消息隊(duì)列中檢索到的消息信息。
第四步:編譯運(yùn)行
編譯運(yùn)行。
按下 Ctrl + S,彈出了另存為對(duì)話(huà)框,可以正常使用快捷鍵了!

大功告成!
第五步:賞個(gè)三連( doge
(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)
~~(≧▽≦)喜歡的話(huà)就給個(gè)三連吧(≧▽≦)~~