MFC---给按钮加上快捷键

   现在快捷键的使用已经很频繁了。快捷键可以使我们的操作变得更简单,更快捷。如何给自己的按钮加一个快捷键呢。
    如下图:我们希望给我们的参照按钮加一个快捷键CTR + F。 

 

    不要以为在按钮的标题上加上F就行了,这只是给用户看的。 我们需要实现它,实现它有两种方法。先说方法一。
    我们可以这样想,我们截取用户的F按键,如果用户按了F按键的话,判断一下ctr键是否被按下,如果被按下的话,说明用户按了CTR + F ,然后我们去调相应的按钮事件就可以了。
   我们需要覆写CDialog类的 PreTranslateMessage(MSG* pMsg);这是一个虚方法。
  代码如下:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
         //先判断是否是键盘输入消息
     if (pMsg-> message== WM_KEYDOWN) {
         int nkeyDown =  pMsg->wParam;
                  //ctr键的状态获取
         BOOL bkeyState = GetKeyState(VK_CONTROL);
                 //0x46是F键的16进制表示
         if (nkeyDown == 0x46 && bkeyState) {
                        //调相应的按钮事件
             OnBnClickedButtonOpenfile();
         }
     }
     return CDialog::PreTranslateMessage(pMsg);
}

这就完成了。

我们仔细看一下上面的代码会发现:只要满足CTR被按下的同时F键也被按下,那么就会触发这个事件。换句话说ctr 和F被同时按下的时候,其他键也被按下,也会触发该事件。如CTR + ALT + F也行。当然在要求不严格的情况下,这样已经OK了。
      有一天我发现CTR + F这个快捷键是许多软件的查找快捷键。当然我把ctr+ F定义成文件打开快捷键也没错。这有点看起来不伦不类。很多人认为CTR + F是查找快捷键 ,你把ctr+ F定义成文件打开快捷键,别人用的程序会不习惯的。
    后来我把快捷键定义成ctr + ALT + F。代码如下:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
     //先判断是否是键盘输入消息
   if (pMsg-> message== WM_KEYDOWN) {
     int nkeyDown =  pMsg->wParam;
        //ctr键的状态获取
     BOOL bCtrkeyState = GetKeyState(VK_CONTROL);
        BOOL bAltkeyState = GetKeyState(VK_MENU); 
        //0x46是F键的16进制表示
        if (nkeyDown == 0x46 && bCtrkeyState && bAltkeyState  ) {
             //调相应的按钮事件
       OnBnClickedButtonOpenfile();
     }
  }
   return CDialog::PreTranslateMessage(pMsg);
}

发现这样就OK了。后来我的leader告诉我CTR + ALT + F 按起来不方便,一只手按有点困难,你把CTR + ALT + F改成 ALT + F。
我认为这是很简单的一件事。我说很容易,我这样做的:

BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
     //先判断是否是键盘输入消息
   if (pMsg-> message== WM_KEYDOWN) {
     int nkeyDown =  pMsg->wParam;
         //alt键的状态获取
         BOOL bAltkeyState = GetKeyState(VK_MENU); 
         //0x46是F键的16进制表示
     if (nkeyDown == 0x46 && bAltkeyState  ) {
             //调相应的按钮事件
       OnBnClickedButtonOpenfile();
     }
  }
   return CDialog::PreTranslateMessage(pMsg);

  我发现失败了, 按alt + F 根本不会进入if (pMsg-> message== WM_KEYDOWN) { }这个块里。查了许多资料,发现alt很特殊,它的宏定义是
VK_MENU,其实它是MENU菜单的快捷键。
    alt + F是不是就实现不了呢?不是的,是可以实现的,这就是加快捷键的第二种方法。 
   我们可以用加速键表来添加快加键。
  打开资源视图,新建Accelerator资源。加入ALT + F快捷键。

  这里的ID就是相应按钮的ID。定义一个成员变量HACCEL m_hAccel;
  在OnInitDialog()方法里进行初始化:

m_hAccel = LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
    if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
    { 
        HACCEL hAccel = m_hAccel; 
        if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
            return TRUE; 
    } 
    return CDialog::PreTranslateMessage(pMsg);
}

运行,发现OK。
   用加速键表来添加快加键是很方便的,不需要加很多代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值