
如何阻止对话框的回车键
当用户按下Enter键时,Windows将发送特殊的WM_GETDEFID消息以获取默认命令ID,然后Windows将其作为WM_COMMAND发送. 因此,您要做的就是重载WM_GETDEFID消息. 在Windows文档中,WM_GETDEFID返回值描述如下: “如果有默认按钮,则返回值的高位字包含DC_HASDEFID,而低位字包含控件的标识符. 否则,返回值为零. “
BEGIN_MESSAGE_MAP(CMyDlg,CDialog)
ON_MESSAGE(DM_GETDEFID,OnGetDefID)
...
END_MESSAGE_MAP()
LRESULT CMyDlg :: OnGetDefID(WPARAM wp,LPARAM lp)
{
返回MAKELONG(0,DC_HASDEFID);
}
另一种笨拙的方法: 添加按钮IDOK,然后删除
CDialog的OnOK虚拟函数控制“确定”按钮,该按钮负责触发数据交换并从对话框退出. 但是mfc对话框去掉关闭按钮,Enter键碰巧具有相同的效果. 也许这就是我们所需要的,或者也许我们不需要此功能,也就是说,我们不希望用户在编辑框中按Enter后关闭程序. 如何解决这个问题?

I. 原因
当用户按下Enter键时,Windows将自动找到输入焦点位于哪个按钮上. 当聚焦按钮被虚线矩形包围时. 如果所有按钮都没有获得输入焦点,则Windows将自动查找程序或资源指定的默认按钮(默认按钮具有较粗的边框). 如果对话框中没有默认按钮,即使对话框中没有“确定”按钮,也会自动调用OnOK函数.
第二,解决方案
为了使Enter键无效,最简单的方法是将CExDlg的OnOK函数编写为空函数,然后编写新函数以响应OK按钮. 具体步骤如下:
首先创建一个名为Ex的基于对话框的程序.
1. 使用ClassWizard将IDOK按钮映射到OnOK虚拟函数.
在ClassWizard中,从CExDlg的“对象ID”列表中选择IDOK,然后单击“ BN_CLICKED”. 这样就产生了OnOK函数的原型和框架.
2. 使用对话框编辑器更改“确定”按钮的ID.
选择“确定”按钮,将其ID从IDOK更改为IDC_OK,然后从“默认按钮”属性中删除复选标记. 然后将OnOK函数分离.
3. 使用ClassWizard创建一个OnClickedOK成员函数.
在ClassWizard中,从CExDlg的“对象ID”列表中选择IDC_OK,然后单击“ BN_CLICKED”. 函数名称为OnClickedOK,它将生成OnClickedOK函数的原型和框架.
4. 编辑代码.

void CExDlg :: OnOK()
{
// TODO: 在此处添加额外的验证
// CDialog :: OnOK();
}
void CExDlg :: OnClickedOk()
{
// TODO: 在此处添加您的控制通知处理程序代码
CDialog :: :: OnOK();
}
5. 编译并测试程序.
重新编译程序并测试Enter键. 按下Enter键后,您将发现没有任何操作mfc对话框去掉关闭按钮,并且单击“确定”按钮仍然与以前相同.

三,OnCancel处理
就像Enter键可以触发对OnOK函数的调用一样,Esc键也可以触发对OnCancel函数的调用. 这将导致控件从对话框退出. 但是,读者可以像“确定”按钮一样处理它,并可以通过设置无效的OnCancel函数来防止这种情况发生.
MFC对话程序屏蔽ESC和ENTER键退出
1. 完全阻止ESC键和ENTER键
BOOLCQQ_chart_serverDlg :: PreTranslateMessage(MSG * pMsg)
{
如果(pMsg->消息== WM_KEYDOWN && pMsg-> wParam == VK_RETURN)
returnTRUE;
如果(pMsg->消息== WM_KEYDOWN && pMsg-> wParam == VK_ESCAPE)
returnTRUE;
returnCDialog :: PreTranslateMessage(pMsg);
}
2. 完全阻止ESC键并捕获ENTER键
BOOLCQQ_chart_clientDlg :: PreTranslateMessage(MSG * pMsg)
{
如果(pMsg->消息== WM_KEYDOWN && pMsg-> wParam == VK_RETURN)
{
if(GetFocus()-> GetDlgCtrlID()== IDC_MSG_SEND)//如果当前焦点位于您想要的控件上,请按Enter键
{
CQQ_chart_clientDlg :: OnBnClickedBtnSend(); //添加您自己的处理代码
}
返回TRUE;
}
如果(pMsg->消息== WM_KEYDOWN && pMsg-> wParam == VK_ESCAPE)
返回TRUE;
returnCDialog :: PreTranslateMessage(pMsg);
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-160183-1.html
幸福的感觉
DF26