MFC中基于对话框程序快捷键的实现

MFC中基于对话框程序快捷键的实现

 

http://hi.baidu.com/skyloong/blog/item/d40a393f63f8d3eb55e7236e.html

 

MFC中基于SDI和MDI的程序,默认情况下有快捷键资源,直接建立快捷键与消息的映射,就能实现程序的快捷键,而基于对话框的程序默认情况下没有快捷键资源,鉴于网友问到这个问题,下面我就分别用两种方法来实现。

    一是在PreTranslateMessage函数中,判断键盘的按键消息,比如快捷键是Ctrl + Q,我们就检测按键消息的Ctrl键和Q是否同时按下就可以了。

    //用PreTranslateMessage的方法,判断Ctrl+Q是否按下,按下就执行快捷键对应的操作

if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q' && IsCTRLPressed())
{
AfxMessageBox("Ctrl + Q 被按下");
return TRUE;
}

MFC中基于对话框程序快捷键的实现_第1张图片


    二是在PreTranslateMessage函数中,通过载入快捷键资源,并建立快捷键与消息的映射的方法来实现。先插入快捷键资源,通过下面的代码来载入该资源。

    HACCEL hAcc;hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));

//此处原文有错,代码应该修改为:

-------------------------------------------------------------------------------

HACCEL hAcc;
  hAcc = LoadAccelerators(AfxGetInstanceHandle(),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("你按下了定义的快捷键"); 
}

MFC中基于对话框程序快捷键的实现_第2张图片


    两种方法的比较:第一中方法显然比较直接,仅应用于快捷键比较少的程序。第二种方法比较实用。

    上述两种方法都在Windows XP和Visual C++6.0下调试成功。

你可能感兴趣的:(MFC中基于对话框程序快捷键的实现)