基于对话框的MFC,解决了退出键程序退出的问题

电脑杂谈  发布时间:2020-04-01 15:14:30  来源:网络整理

mfc 按钮取消焦点_mfc 按钮颜色_mfc对话框去掉关闭按钮

如何阻止对话框的回车键

当用户按下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后关闭程序. 如何解决这个问题?

mfc 按钮颜色_mfc对话框去掉关闭按钮_mfc 按钮取消焦点

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. 编辑代码.

mfc对话框去掉关闭按钮_mfc 按钮取消焦点_mfc 按钮颜色

void CExDlg :: OnOK()

{

// TODO: 在此处添加额外的验证

// CDialog :: OnOK();

}

void CExDlg :: OnClickedOk()

{

// TODO: 在此处添加您的控制通知处理程序代码

CDialog :: :: OnOK();

}

5. 编译并测试程序.

重新编译程序并测试Enter键. 按下Enter键后,您将发现没有任何操作mfc对话框去掉关闭按钮,并且单击“确定”按钮仍然与以前相同.

mfc 按钮取消焦点_mfc 按钮颜色_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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...