在MFC中忽略回车键和ESC键的消息处理
在MFC中忽略回车键和ESC键的消息处理
问题描述:
在使用MFC的对话框时,如果你在文本框内输入文本后按下回车键或者ESC键,此时会退出对话框。
解决办法:
在Class View标签页中选择C*Dlg类,在Properties页中点击“Overrides”图标,在列表中选择PreTranslateMessage方法就行重载,然后输入下面的代码。
BOOL ::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN) return TRUE; } returnCDialog::PreTranslateMessage(pMsg); }
MFC对话框Enter键、Esc键、关闭按钮的消息处理
在MFC对话框中,经常会碰到按Enter或Esc键,对话框会被关闭的现象。
Enter键的处理流程如下: 如果对话框有按钮拥有焦点 响应该按钮的单击事件 如果按钮ID为IDOK,并且没有事件响应函数,则执行函数OnOK() 否则执行函数OnOK() Esc键的处理流程: 执行OnCancel() 关闭按钮的处理流程: 找到消息(WM_CLOSE)的响应函数则执行 否则执行OnCancel() 我们查看源码:CDialog的OnOK和OnCancel的代码如下,都是关闭对话框
BEGIN_MESSAGE_MAP(CDialog, CWnd) ON_COMMAND(IDOK, &CDialog::OnOK) ON_COMMAND(IDCANCEL, &CDialog::OnCancel) END_MESSAGE_MAP() void CDialog::OnOK() { if (!UpdateData(TRUE)) { return; } EndDialog(IDOK); } void CDialog::OnCancel() { EndDialog(IDCANCEL); }
如果你不想按Enter键、Esc键就关闭对话框,可以如下处理:
方法一 重载CDialog的两个虚函数OnOK&OnCancel使其什么也不做,并重载WM_CLOSE消息的处理函数并在其中调用EndDialog(IDCANCEL)
protected: virtual void OnOK(); virtual void OnCancel(); void CYourDlg::OnOK() { } void CYourDlg::OnCancel() { } BEGIN_MESSAGE_MAP(CYourDlg, CDialog) ON_WM_CLOSE() END_MESSAGE_MAP() protected: afx_msg void OnClose(); void CYourDlg::OnClose() { EndDialog(IDCANCEL); }
方法二 重载PreTranslateMessage函数,屏蔽对话框的Enter、Esc键盘消息。
BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { switch(pMsg->wParam) { case VK_RETURN: return TRUE; case VK_ESCAPE: return TRUE; default: break; } } return CDialog::PreTranslateMessage(pMsg); }
下一篇:
想知道好用的音频翻译软件有哪些?