MFC里使用快捷键的原理:按键组合成一个COMMAND/COMMAND_UI消息放入消息队列,然后程序对该消息进行处理。
1.添加Accelerator表(按键组合与消息的对应表)
编辑Accelerator表
修改表ID
在Resource View窗口修改表ID为 IDR_MYACCEL
2.添加消息处理
第一种:右键单击Accelerator表选项,Add Event Handler
第二种:在程序其他地方处理,比如MenuBar、ToolBar及右键菜单消息处理中,只要其中消息的ID与表中ID一致即可
3.加载Accelerator资源
在OnInitDialog中:
HACCEL m_hAccel;
m_hAccel = LoadAccelerators ( AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_MYACCEL) );
4.激活快捷键
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if ( NULL != m_hAccel &&
pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST )
{
return TranslateAccelerator ( m_hWnd, m_hAccel, pMsg );
}
else
return CDialog::PreTranslateMessage(pMsg);
}
TranslateAccelerator()函数试图将按键组合成COMMAND消息并处理。
或者直接在函数内判断按键的组合情况
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(GetAsyncKeyState(VK_CONTROL)) //CTRL 按下
{
if( pMsg->wParam == 'C') //C按下
OnCopy();
if( pMsg->wParam == 'V') //V按下
OnPaste();
if( pMsg->wParam == 'L') //L按下
OnClear();
if( pMsg->wParam == 'A') //A按下
OnSelectAll();
}
}
else
return CDialog::PreTranslateMessage(pMsg);
}