MFC对话框程序屏蔽回车与ESC键,Tab键

       这里仅介绍重载对话框的消息预处理函数PreTranslateMessage(MSG* pMsg)来进行消息屏蔽。

       MFC下基于对话框的程序,默认的会有一个“确定”按钮,还有一个“取消”按钮,那个“确定”按钮是默认按钮。这时候运行程序,按下回车键或者ESC键,程序都会退出。

     《Inside Visual C++》一书中:“当用户按下Enter键时,Windows就会自动去查找“输入焦点”落在了哪一个按钮上,获得焦点的按钮的四周将被点线矩形框所包围。如果所有按钮都没有获得输入焦点,Windows就会自动去寻找程序或资源所指定的默认按钮。如果对话框没有默认按钮,那么即使对话框中没有“确定”按钮,OnOK函数也会自动被调用”。有的时候肯定是不想在按下回车键之后退出对话框程序,ESC也是一样。解决方法也很简单,重载对话框的PreTranslateMessage函数,然后在该函数中干掉ESC和回车这两个按键的消息。

在XXXDlg.h文件中的CXXXDlg类中添加:

protected: 
    virtual BOOL PreTranslateMessage(MSG* pMsg);

在XXXDlg.cpp文件中添加实现:

 1 BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
 2 {
 3      if (pMsg->message == WM_KEYDOWN)
 4     {
 5          switch (pMsg->wParam)
 6         {
 7          case VK_RETURN: //屏蔽回车键
 8              return TRUE;
 9          case VK_ESCAPE: //屏蔽ESC键
10              return TRUE;
11          case VK_TAB:
12             {
13                  int nStart, nEnd; 
14                 HWND hWnd = ::SetFocus(m_ctrlEditContent.m_hWnd); //  m_ctrlEditContent为编辑框名称 
15                   if(hWnd != m_ctrlEditContent.m_hWnd)
16                 {
17                     ::SetFocus(hWnd);    
18                 }
19                  else         // 处理编辑框中的Tab键,使得可以在其中输入制表符'\t'
20                  {    
21                     m_ctrlEditContent.GetSel(nStart,nEnd);    
22                     m_ctrlEditContent.SetSel(nStart,nEnd);    
23                     m_ctrlEditContent.ReplaceSel( " \t ");
24                      return TRUE;
25                 }   
26             }        
27          default:
28              break;
29         }
30     }
31      return CDialog::PreTranslateMessage(pMsg);
32 }

编辑框接受TAB为'\t',而不是在各个空间之间转移。这就是上面case VK_TAB的作用。或许有的程序用不到这个功能,个人觉得写在这里可以加深消息预处理的理解。同时可以参考更改回车键的响应。参见:http://www.vckbase.com/index.php/wv/31.html

      另一个屏蔽回车键的方法,解释见注释。

在XXXDlg.h文件中的CXXXDlg类中添加:

//  生成的消息映射函数
...
virtual BOOL PreTranslateMessage(MSG* pMsg); // 这里是上面所添加的消息预处理函数
afx_msg  void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg  void OnPaint();
afx_msg LRESULT OnGetDefID(WPARAM wp, LPARAM lp); // 添加消息响应函数
DECLARE_MESSAGE_MAP()

在XXXDlg.cpp文件中添加实现:

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
     ... 
     ON_MESSAGE(DM_GETDEFID, OnGetDefID) 
END_MESSAGE_MAP()



// 屏蔽按enter键就退出的情况
// 当用户按下回车键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,
// Windows再将它作为WM_COMMAND发送。所以,要重载WM_GETDEFID消息,
// 在有关Windows的文档中是这样描述WM_GETDEFID返回值的:
// “如果有缺省得按钮,则返回值的高位字包含DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零。” 
LRESULT CXXXDlg::OnGetDefID(WPARAM wp, LPARAM lp) 

     return MAKELONG( 0,DC_HASDEFID); 

有人说屏蔽ESC键也可以用后面这种方法,但是本人未找到按下ESC时window是对应的特殊消息,有请知道的不吝告知。

 

 


 

转载于:https://www.cnblogs.com/Totems/archive/2012/07/11/2586841.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值