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就可以了
资源预览

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值