MFC:如何为你的程序添加快捷键
第一步:在资源视图—— .rc 文件里新建 Accelerator



ID 表示要关联的控件的 ID;
修饰符,见类型;
键:见类型;
类型表示是用 VIRTKEY(虚拟键码)还是 ASCII( ASCII 码)说明快捷键,此处默认为 VIRTKEY。 常见的虚拟键码有 VK_F4(即 F4), VK_RETURN(即 Enter 键), VK_ESCAPE(即 Esc 键)等,对于字母键和数字键(非小键盘),它们的虚拟键码就是 ASCII 码。 注意: VIRTKEY 指示的字母须大写, ASCII 指示的字母须小写。
第二步:关联控件,并设置快捷键
这里我将 ID 设置为 IDC_SAVE_BUTTON(我做的关于文件另存为的 Button),修饰符和键分别为 Ctrl 和 S( VIRTKEY 指示的字母须大写,再次提醒),类型则为 VIRTKEY。

第三步:添加相关的代码
①在控件所在 Dialog 相应的头文件中添加:
HACCEL m_hAccelTable;

其中 HACCEL 是 Handle to an accelerator table 的缩写,即为快捷键表句柄。
②在对话框相应类的构造函数中添加:
m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR));

winuser.h 标头将 LoadAccelerators 定义为 LoadAcceleratorsA( ANSI 版本)和 LoadAcceleratorsW( UNICODE 版本)的别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。
LoadAcceleratorsA 函数的语法:
HACCEL LoadAcceleratorsA(
[in, optional] HINSTANCE hInstance,
[in] LPCSTR lpTableName
);
LoadAcceleratorsW 函数的语法:
HACCEL LoadAcceleratorsW(
[in, optional] HINSTANCE hInstance,
[in] LPCWSTR lpTableName
);
LoadAccelerators 函数用于加载指定的加速器表。 其中 hInstance 表示模块的句柄, lpTableName 表示其可执行文件包含要加载的加速器表,若要创建此值,需要使用 MAKEINTRESOURCE 宏。
同样, winuser.h 标头将 MAKEINTRESOURCE 定义为 MAKEINTRESOURCEA( ANSI 版本)和 MAKEINTRESOURCEW( UNICODE 版本)的别名。 它的作用是将整数值转换为与资源管理功能兼容的资源类型。 此宏用于代替包含资源名称的字符串。
MAKEINTRESOURCEA 宏的语法:
void MAKEINTRESOURCEA(
i
);
MAKEINTRESOURCEW 宏的语法:
void MAKEINTRESOURCEW(
i
);
其中 i 表示要转换的整数值。
③选中对话框,右键选择类向导。

选择添加 PreTranslateMessage 函数。

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

你也可以通过选中对话框对应的类,在属性中重写此函数。

同样 TranslateAccelerator 也是其 ANSI 版本和其 UNICODE 版本的别名,此函数用于处理菜单命令的快捷键(如果指定了快捷键表)则该函数会将 WM_KEYDOWN 或 WM_SYSKEYDOWN 消息转换为 WM_COMMAND 或 WM_SYSCOMMAND消息,然后将 WM_COMMAND 或 WM_SYSCOMMAND 消息直接发送到指定的窗口过程。 在窗口过程处理消息之前, TranslateAccelerator 函数不会返回。
TranslateAcceleratorA 函数的语法:
int TranslateAcceleratorA(
[in] HWND hWnd,
[in] HACCEL hAccTable,
[in] LPMSG lpMsg
);
TranslateAcceleratorW 函数的语法:
int TranslateAcceleratorW(
[in] HWND hWnd,
[in] HACCEL hAccTable,
[in] LPMSG lpMsg
);
其中 hWnd 表示要翻译其消息的窗口的句柄。 其中 hAccTable 表示加速器表的句柄。 加速键表必须由对 LoadAccelerators 函数的调用或通过对 CreateAcceleratorTable 函数的调用创建来加载。 lpMsg 表示指向 MSG 结构的指针,其中包含使用 GetMessage 或 PeekMessage 函数从调用线程的消息队列中检索到的消息信息。
第四步:编译运行
编译运行。
按下 Ctrl + S,弹出了另存为对话框,可以正常使用快捷键了!

大功告成!
第五步:赏个三连( doge
(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)
~~(≧▽≦)喜欢的话就给个三连吧(≧▽≦)~~