如何去掉对话框对Enter和Esc的默认响应 用MFC AppWizard制作的基于对话框的程序,按Escape键会自动关闭对话框。当把所有控件都删除后,按回车键也会关闭对话框,请问如何取消按这两个键关闭对话框的功能? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重载OnOK,OnCancel,置函数内容为空 PreTranslateMessage(MSG *pMsg){if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ENTER || pMsg->wParam == VK_ESCAPE))return TRUE;return Cxx::PreTranslateMessage(pMsg);} flyelf(空谷清音) :你这样做会导致程序对Enter和Escape失去响应。 if( && pMsg->message == WM_KEYDOWN (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)&&pMsg->hwnd ==::GetDlgItem(this->m_hWnd,IDOK)) 重载OnOK置空看起来还可以,但重载OnCancel置空会导致右上角的关闭按钮失效,因为关闭按钮的响应函数OnClose会调用OnCancel.楼上的方法试过吗?好象所有的方法都治标不治本啊,MFC在什么地方调用的OnCancel和OnOK呢? 重载OnOk()和OnClose()不是OnCancel().还有就是可以把对话框上的每个控件属性中的Tab Stop前的勾全部去掉,这样也能起到效果 重载OnOk()和OnClose(),OnCancel().在OnClose()中DestroyWindow() 重载对话框的PreTranslateMessage()函数,在函数中进行如下处理BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN) { switch(pMsg->wParam){ case 0x0d://回车键 return false; case VK_ESCAPE://esc键 return false; } } return CDialog::PreTranslateMessage(pMsg);}这样当你按ESC键和ENTER键的时候对话框就不会关闭了!希望对你有所帮助! 1、重载OnOk()和OnClose(),OnCancel().在OnClose()中DestroyWindow()2、重载对话框的PreTranslateMessage()函数,在函数中进行如下处理BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN) { switch(pMsg->wParam){ case 0x0d://回车键 return false; case VK_ESCAPE://esc键 return false; } } return CDialog::PreTranslateMessage(pMsg);}明显都可以,大家不要争吗,分一下就可以了。 在这个里PreTranslateMessage(MSG *pMsg)加入if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ENTER || pMsg->wParam == VK_ESCAPE)) 重载对话框的ONOK和ONCANCEL函数,让这两个函数什么都不做就OK了。如果你在自己的某个按钮执行确认(ENTER)或取消操作(ESC),只要在该按钮的执行代码中调用CDIALOG的函数:OnOK和OnCancel就可以。 OnOK,OnCancel事件里在return就ok。 很简单只需要在对话框的onchar函数中:把截获到的Enter(13),ESC(27)if(nChar == 13 || nChar == 27) return;就ok了 void CYDlg::OnCancel() { // TODO: Add extra cleanup here // CDialog::OnCancel();}void CYDlg::OnOK() { // TODO: Add extra validation here // CDialog::OnOK();} agree ,最好用 PreTranslateMessage 处理按键 agree to override PreTranslateMessage 关于键盘模拟“CTRL+V”的问题 360,QQ医生,瑞星卡卡漏洞信息界面 删除系统服务必须重启吗 多线程画图的问题! 利用CListCtrl,用鼠标选中一行是不是还要消息函数 关于对话框窗口内部绘图的问题 SendMessage()未何消息发不出去 数据结构中怎样计算一个算法的时间复杂度各空间复杂度?比如快速排序? 请教高手dll的问题 高分请求详细讲解,有意者请进>>(关于CFrameWnd布局问题) 哪里有INSIDE OLE的电子书可以下载? 请问怎么样改变保存文档时候MFC的缺省图标?
{
if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ENTER || pMsg->wParam == VK_ESCAPE))
return TRUE;
return Cxx::PreTranslateMessage(pMsg);
}
关闭按钮的响应函数OnClose会调用OnCancel.
楼上的方法试过吗?好象所有的方法都治标不治本啊,MFC在什么地方调用的OnCancel和OnOK呢?
不是OnCancel().还有就是可以把对话框上的每个控件属性中的Tab Stop前的勾全部去掉,
这样也能起到效果
在OnClose()中DestroyWindow()
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam){
case 0x0d://回车键
return false;
case VK_ESCAPE://esc键
return false;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
这样当你按ESC键和ENTER键的时候对话框就不会关闭了!
希望对你有所帮助!
在OnClose()中DestroyWindow()
2、重载对话框的PreTranslateMessage()函数,在函数中进行如下处理
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
switch(pMsg->wParam){
case 0x0d://回车键
return false;
case VK_ESCAPE://esc键
return false;
}
}
return CDialog::PreTranslateMessage(pMsg);
}明显都可以,大家不要争吗,分一下就可以了。
加入
if(pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ENTER || pMsg->wParam == VK_ESCAPE))
在return就ok。
把截获到的Enter(13),ESC(27)
if(nChar == 13 || nChar == 27)
return;
就ok了
{
// TODO: Add extra cleanup here
// CDialog::OnCancel();
}void CYDlg::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}