在MFC中只要在按钮名称后使用(&字母)就可以产生一个alt+字母的快捷键,我想问下MFC是怎么关联起来的?

解决方案 »

  1.   

    编译器会自动解析为加速键,下面是RC文件的片断IDR_MAINFRAME ACCELERATORS 
    BEGIN
        "N",            ID_FILE_NEW,            VIRTKEY, CONTROL
        "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL
        "S",            ID_FILE_SAVE,           VIRTKEY, CONTROL
        "P",            ID_FILE_PRINT,          VIRTKEY, CONTROL
        "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL
        "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL
        "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL
        "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL
        VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT
        VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT
        VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL
        VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT
        VK_F6,          ID_NEXT_PANE,           VIRTKEY 
        VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT
    END
      

  2.   

    我就是想问下是怎么解析的呢  我一个子对话框里有多个按钮需要做快捷键,在焦点移动到主对话框的时候用(&字母)给按钮加的快捷键就失效了...因为子对话框有多个,如果使用LoadAccelerators会很麻烦,以后维护也不方便.谁有这方面心得,请指教下,万分感激
      

  3.   

    你可以试一下在主对话框中响应WM_KEYDOWN消息,再转发给活动的子对话框。
      

  4.   

    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 

     if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
     { 
      HACCEL hAccel = m_hAccel; 
      if (::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
       return TRUE; // ...
    // 将加速键派发到需要它的地方
     } 
     return CDialog::PreTranslateMessage(pMsg); 
      

  5.   

    首先,使用 RegisterHotKey(this->m_hWnd,WM_USER + 1,MOD_CONTROL,'k'); (例如Ctrl+k)
    注册hotkey,然后
    通过ON_MESSAGE(WM_HOTKEY,OnHotkey),
    将你的热键的解析工作映射到函数 OnHotkey进行相应的解析,
    最后 UnregisterHotKey(this->m_hWnd,WM_USER + 1); 
    撤销注册
      

  6.   

    如果使用手工添加的方法来增加热键,就是工作量大点,比较郁闷的是使用(&字母)添加的热键窗口需要拥有焦点才行..,搞不明白mfc在切换焦点的时候又做了什么的.有没有什么热键相关的API,比如得到当前程序的所有热键列表,考虑可以将这个列表复制下再处理的
      

  7.   

    文字 + & 生成快捷键是 Windows 自己做的事,不关 MFC 的事,不信你做个 Win32 App 一样可以这样的