转自:https://blog.csdn.net/leichelle/article/details/7991371 
作者:LL-Studio 

      建立好的MFC的对话框,按下Enter或Esc时,系统会调用”默认“事件处理函数,也就是OnOK(),倘若自己的CFormView子类或者CDialog子类没有重写OnOK()函数,则会调用父类的OnOK,其结果是关闭界面。要屏蔽Enter键或Esc退出的功能,只需要将在CDialog中重写ONOK()函数即可。而要实现默认为“确定”功能,下面两种方法供参考:


1.采用ClassWizard进行实现重载OnOK()


 OnOK()
{
         if(...)
         {// 当是Enter或Esc按键事件时
           .....
         }
         else
         {   // 点击关闭按钮时
                   ....
                   CDialog::OnOK();
         }
}


2.采用ClassWizard进行实现重载PreTranslateMessage

     在类视图里面选择你要实现的类,右键属性,在属性里面找到函数PreTranslateMessage,然后添加PreranslateMessage的消息函数,在PreTranslateMessage的消息函数中添加你要实现处理按键事件的代码。

  1. /********************************************************
  2. * 方法名称: PreTranslateMessage(MSG *pMsg)
  3. * 描述: 该方法主要是处理传递消息的,任何消息产生的消息都会经过这个方法处理,
  4. * 然后,消息才会到达相应的应用程序中。
  5. * 调用模块:CDialogEx::PreTranslateMessage(pMsg)父类的对应方法
  6. * 输入: MSG类型的消息对象指针
  7. * 输出: 无
  8. * 返回值: bool值
  9. *********************************************************/
  10. BOOL CSerialDlg::PreTranslateMessage(MSG* pMsg)
  11. {
  12.     // TODO: Add your specialized code here and/or call the base class
  13.     // 把Esc和Enter按键事件消息过滤掉,否则该消息会导致对应应用程序调用OnOK()方法,结束应用程序
  14.     if (pMsg->message == WM_KEYDOWN)
  15.     {
  16.         switch(pMsg->wParam)
  17.         {
  18.             case VK_ESCAPE: //Esc按键事件
  19.                 return true;
  20.             case VK_RETURN: //Enter按键事件
  21.                 return true;
  22.             default:
  23.                 ;
  24.         }
  25.     }
  26.     
  27.     return CDialogEx::PreTranslateMessage(pMsg);
  28. }
————————————————
版权声明:本文为CSDN博主「LL-Studio」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leichelle/java/article/details/7991371
09-08 23:25
查看更多