zoukankan      html  css  js  c++  java
  • 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。
       用加速键表来添加快加键是很方便的,不需要加很多代码。

    高山流水,海纳百川!
  • 相关阅读:
    C#中常见的系统内置委托用法详解(抄录)
    ClassifyHandler 分类处理结构
    AutoFac Ioc依赖注入容器
    深入理解DIP、IoC、DI以及IoC容器
    ASP.NET MVC的请求处理流程
    电商秒杀功能实现
    MVC之Global.asax解析
    MVC基类控制器的会话丢失重新登录权限过滤
    MVC的Action上下文:ActionExecutingContext
    ASP.NET与MVC架构区别总结
  • 原文地址:https://www.cnblogs.com/ahcc08/p/6082510.html
Copyright © 2011-2022 走看看