问题是这样的:    在一个CDialogA中,有三个按钮,[关闭][帮助][添加],还有一些CListCtrl和EditText,
 当焦点在[关闭]上,回车后,窗体关闭。但是当焦点在CListCtrl上,按下回车键窗体也会关闭。  但是在窗体中,重载OnOK()后,并且在OnOK的代码里,不作任何操作,当焦点在CListCtrl上
 窗体就不会关闭。窗体中没有IDOK按钮。    这是为什么呢?  另外,我还想在窗体的回车事件里做一些事情,重载WM_KEYDOWN怎么没有作用阿!
   请教各位大虾!

解决方案 »

  1.   

    防止对话框程序按Enter和ESC退出的对策http://www.mzkp.com/cooldog/blogview.asp?logID=15&cateID=1在一般情况下编写的对话框程序,用户在运行的时候,如果不注意按下了ENTER或者ESC键,程序就会立刻退出,之所以会这样,是因为按下Enter键时,Windows就会自动去找输入焦点落在了哪一个按钮上,当获得焦点的按钮的四周将被点线矩形包围。如果所有按钮都没有获得输入焦点,Windows就会自动去寻找程序或资源所指定的默认按钮(默认按钮边框较粗)。如果对话框没有默认按钮,那么即使对话框中没有OK按钮,OnOK函数也会自动被调用,对于一个普通的对话框程序来说,OnOK函数的调用,以为着程序会立刻退出。为了使Enter键无效,最简单的办法就是将CExDlg的OnOK函数写成空函数,然后针对OK按钮写一个新的函数来响应。ESC键的原理也是如此,它是默认和OnCancel函数映射在一起的。对于ESC键,需要自己重载CDialog类的PreTranslateMessage函数,当发现是ESC键的时候,过滤掉这个消息或者是替换掉这个消息。一下是简单的代码示例:【方法1】
    可以先重载OnOK函数
    voidCTestDlg::OnOK()
    {  //里面什么也不写}然后重载PreTranslateMessage函数
    把ESC键的消息,用RETURN键的消息替换,这样,按ESC的时候,也会执行刚才的OnOK函数,这样问题就可以解决了。BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg) 
    {
     if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE) 
     { 
     pMsg->wParam=VK_RETURN; //将ESC键的消息替换为回车键的消息,这样,按ESC的时候
                                              //也会去调用OnOK函数,而OnOK什么也不做,这样ESC也被屏蔽
      } 
     return CDialog::PreTranslateMessage(pMsg);}【方法2】直接在重载的PreTranslateMessage函数中屏蔽回车和ESC的消息,和以上方法大同小异:BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg) 
    {
     if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)  return TRUE;
     if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN) return TRUE; 
     else 
        return CDialog::PreTranslateMessage(pMsg);
    }
      

  2.   

    强烈同意 kugou123(酷狗)(每天学VC,补充你我的维C) 的方法。
      

  3.   

    强烈不同意 kugou123(酷狗)(每天学VC,补充你我的维C) 的方法。
    会造会某些控件不能响应回车键.
      

  4.   

    窗体中即使没有IDOK按钮时,当用户按回车仍然会触发ID=IDOK的WM_COMMAND
    而该消息由引起对OnOk虚似函数的调用。如果你不重载它,它就按原来的处理方式,也就是调用
    EndDialog。
    至于解决方法,就按kugou123(酷狗)所说的去做
      

  5.   

    在你的CMyDialog,构造函数中加一行:
    SetDefaultID(-1); //按Enter键不会直接响应OnOk();另在CMyDialog中加入:
    BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) 
    {
      if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN && (GetFocus() == GetDlgItem(IDOK) || GetFocus()==CListCtrl)
      //处理要完成的工作,然后EndDialog.
      else
        return CDialog::PreTranslateMessage(pMsg);
    }
      

  6.   

    好象dialog默认的响应回车的消息就是关闭窗体!