MFC中的快捷键是一资源的方式,建立起一个快捷键表,表中的内容就是对于键的id号。首先要加载这个加速器资源,和menu一样,要使用就要加载。然后是在消息预处理函数中添加一些东西,来响应键盘事件,这就需要重载 virtual BOOL PreTranslateMessage(MSG* pMsg)函数,最后就是建立起快捷键的事件,实现映射函数。
先是加载:
- //HACCEL hAcc; 定义为一个私有变量 ,可以加在在init函数中,m_hAcc只要加载一次
- m_hAcc=LoadAccelerators(AfxGetApp()->m_hInstance,MAKEINTRESOURCE
- (IDR_ACCELERATOR1));
然后重载PreTranslateMessage函数
- BOOL CCalculatorDlg::PreTranslateMessage(MSG* pMsg)
- {
- int iRet=0;
- // 处理键盘消息
- switch(pMsg->message)
- {
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- iRet= TranslateAccelerator(m_hWnd,m_hAcc,pMsg);
- if(iRet)
- return TRUE;
- }
- return CDialog::PreTranslateMessage(pMsg);
- }
假如在资源IDR_ACCELERATOR1中有一个id为ID_A_COPY的快捷键,那么添加了消息映射
ON_COMMAND(ID_A_COPY, &CCalculatorDlg::OnACopy) 后,在OnACopy就能实现拷贝功能的快捷键了。
可以看出PreTranslateMessage函数是在SDK中的TranslateMessage函数之前执行,然后才调用它。所以可以在这个地方来预处理一些消息,改变他们的走向。
if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q')
{
AfxMessageBox(_T("Q被按下"));
return TRUE;
}
以上代码放在PreTranslateMessage函数开始处,将有机会获得Q键被按下,然后结束消息的传递。