欢迎光临散文网 会员登陆 & 注册

MFC:如何为你的程序添加快捷键

2023-03-20 00:49 作者:超高校级的cstdlib  | 我要投稿

第一步:在资源视图—— .rc 文件里新建 Accelerator

添加资源
新建 Accelerator
默认新建的 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。

新建的 Accelerator


第三步:添加相关的代码

①在控件所在 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 函数

在添加的 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

(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)~~(≧▽≦)

~~(≧▽≦)喜欢的话就给个三连吧(≧▽≦)~~

MFC:如何为你的程序添加快捷键的评论 (共 条)

分享到微博请遵守国家法律