MFC中基于对话框程序快捷键的实现 下载源代码 //用PreTranslateMessage的方法,判断Ctrl+Q是否按下,按下就执行快捷键对应的操作 if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q' && IsCTRLPressed()) { AfxMessageBox("Ctrl + Q 被按下"); return TRUE; } 二是在PreTranslateMessage函数中,通过载入快捷键资源,并建立快捷键与消息的映射的方法来实现。先插入快捷键资源,通过下面的代码来载入该资源。 HACCEL hAcc; hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));在PreTranslateMessage函数中进行快捷键的翻译,如果是WM_KEYDOWN和WM_SYSKEYDOWN消息就翻译,翻译成功返回TRUE。 BOOL CAccelerator2Dlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class int iResult; //针对WM_KEYDOWN消息和WM_SYSKEYDOWN消息,翻译快捷键 switch(pMsg->message) { case WM_KEYDOWN: case WM_SYSKEYDOWN: iResult = TranslateAccelerator(m_hWnd,hAcc,pMsg); //翻译快捷键成功,返回TRUE if(iResult) return TRUE; } return CDialog::PreTranslateMessage(pMsg); }下面处理快捷键对应的响应,在该实例中,快捷键表中建立了Ctrl +Q,Shift + Q,Alt + Q,Ctrl + Shift + Q,Ctrl + Alt + Q,Shift + Alt + Q,Ctrl + Shift + Alt + Q六个快捷键分别进行测试。 void CAccelerator2Dlg::OnCtrlQ() { // TODO: Add your control notification handler code here AfxMessageBox("你按下了定义的快捷键"); } 两种方法的比较:第一中方法显然比较直接,仅应用于快捷键比较少的程序。第二种方法比较实用。 上述两种方法都在Windows XP和Visual C++6.0下调试成功。 |
|