在MFC对话框中,经常会碰到按Enter或Esc键,对话框会被关闭的现象。
Enter键的处理流程如下:
1.如果对话框有按钮拥有焦点 响应该按钮的单击事件 ,如果按钮ID为IDOK,并且没有事件响应函数,则执行函数OnOK()
2.否则执行函数OnOK()
Esc键的处理流程:
1.执行OnCancel()
关闭按钮的处理流程:
1.找到消息(WM_CLOSE)的响应函数则执行
2.否则执行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);
}
---------------------
作者:HisinWang
来源:CSDN
原文:https://blog.csdn.net/hisinwang/article/details/45751625
版权声明:本文为博主原创文章,转载请附上博文链接!