定义快捷方式有下面几种方法:

1 对于菜单(MENU)或者按钮(BUTTON)

直接在菜单或按钮的标题中,包含&X即可,这里X是任意字符键

示例:Tool菜单项的标题可以写作:"&Tool"或者"工具(&T)",这样就可以直接用ALT+T直接调用该菜单项的功能

2 对菜单(MENU)

菜单的另一种快捷键的定义方式是组合键或者虚拟键,如Ctrl+O表示打开文件,或F5表示运行等

示例: 在File菜单项的Open字菜单项的标题可以写作:"&Open\tCtrl+O",这样我们既可以用ALT+O或Ctrl+O来直接调用菜单项的功能

3 另一种方式定义快捷键的就是自定义加速键

首先在资源文件Accelerator中添加快捷键资源 ID选择你要关联菜单项的名称然后再设置你的快捷键

在.h文件中加入一个HACCEL hAccel;

变量然后在OnInitDialog或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN为加速键的资源文件名

最后在PreTranslateMessage(MSG* pMsg) 中加入:

if(::TranslateAccelerator(GetSafeHwnd(),hAccel,pMsg))

return true;

这样以后只要在Accelerator资源文件中添加快捷键就可以了

注意:添加快捷键的名字一定要与菜单名称一样 这样才能响应.现在只需要在此菜单项中加入OnCommand消息的处理就可以了.

4 第二种自定义加速键的方法

还是在资源文件Accelerator中添加快捷键资源 ID自己定义一个.然后再设置你的快捷键.

在.h文件中定义一个快捷键对象HACCEL m_hAccel;

变量然后在OnInitDialog或初始化中加入 hAccel=::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MENU_MAIN)); IDR_MENU_MAIN为加速键的资源文件名

再添加PreTranslateMessage消息处理 在里面加入以下代码:

if(m_hAccel != NULL)
{
    if (TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
        return TRUE;
}

再添加OnCommand消息处理 加入以下代码:

// 响应加速键
switch(LOWORD(wParam))
{
case SHOW_DIAL0G: //加速键ID
    //...添加处理语句
    break;
case SHOW_DIALOG_02: //加速键ID
    //...添加处理语句
    break;
}

这种方式可以任意调用加速键

5.菜单添加全局快捷键,以对话框程序为例:

在OnInitDialog中添加注册热键的代码:

RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2键

RegisterHotKey(GetSafeHwnd(),1002,MOD_ALT,'1');//Alt+1键

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)

...

END_MESSAGE_MAP()

中添加WM_HOTKEY的消息映射:

ON_MESSAGE(WM_HOTKEY,&CXXXDlg::OnHotKey)//快捷键消息映射手动加入

在头文件中添加OnHotKey的声明:

protected:
    afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.
    CPP中OnHotKey的实现代码:
        //相应快捷键的消息映射
    LRESULT CXXXDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
    {
        if(wParam ==1001)
        {
            MessageBox("热键F2已经按下!");
            //这里可以加上你按钮要执行的操作,或者直接调用按钮映射的消息函数
        }
        else if (wParam==1002)
        {
            MessageBox("热键ALT+1已经按下!");
        }
        return 0;
    }

关闭对话框时使用

UnregisterHotKey(GetSafeHwnd(),1001);//注销F2键

UnregisterHotKey(GetSafeHwnd(),1002);//注销Alt+1键注销热键.

7 按钮ctrl快捷键

我们可以这样想,我们截取用户的F按键,如果用户按了F按键的话,判断一下ctr键是否被按下,如果被按下的话,说明用户按了CTR + F ,然后我们去调相应的按钮事件就可以了。

我们需要覆写CDialog类的 PreTranslateMessage(MSG* pMsg);这是一个虚方法。

代码如下:

BOOL TextBox::PreTranslateMessage(MSG* pMsg) 
{    
    if (pMsg-> message== WM_KEYDOWN)              // 先判断是否是键盘输入消息
	{
        int nkeyDown =  pMsg->wParam;        
        BOOL bkeyState = GetKeyState(VK_CONTROL); // ctr键的状态获取
		//BOOL bAltkeyState = GetKeyState(VK_MENU); 
        if (nkeyDown == 83 && bkeyState)          // 83表示S,要使用大写的ASCII
		{
            OnButton52();                         // 内容保存到origianl.txt
        }
    }
	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);
}