我的程序经常无意中按了一下enter键,程序就退出了。我不想这样呀,有那位知道是怎么回事吗?谢了

解决方案 »

  1.   

    OK按纽的Defualt button属性去掉就好了
      

  2.   

    你重写Default button的响应函数就行了,OK
      

  3.   

    把你的按钮的默认ID名改掉.如果是IDOK就一定要改啦.可能就是这个原因!
      

  4.   

    重载PreTranslateMessage函数,把enter屏蔽掉,哈哈
      

  5.   

    错了,等我改好不再给大家算帐呀.不过我的程序已经把OK和Cancel按钮都删掉了,肯定没有IDOK的ID不.我看看哪个按钮有Default Button属性吧,还有怎么写Default Button的相应函数呀?能给段代码吗?
      

  6.   

    如果你想要disable回车键,最简单的方法是重载OnOK函数,这固然是个不坏的主意,但如果你重载OnOK,让它什么事情也不干,那麽当用户用鼠标按下回车键想真正做些什么的时候怎么办呢?你可以改变回车键的ID,如:ID_MY_OK,并写一个调用EndDialog的处理器,这个方法虽然也能行得通,但显得有点不专业。  
        另外一种方法是disable回车键的“默认”属性。这也是之前开始所提出的方法,之所以没有成功,是因为仅仅uncheck 回车键的 BS_DEFPUSHBUTTON 属性是不够的,你可以利用Spy++仔细地观察控制和实验就能发现回车键仍然我行我素发送退出消息。
        问题出在哪呢?你必须区分OK键和回车键,你可以写一个OnOK处理器调用GetCurrentMessage函数获取最后发送的消息,应该是WM_COMMAND,再检查WPARAM的低位字(low-order word)看看命令来自何处。  
       要解决问题,必须搞清楚背后所发生的一切,在Spy++中可以看到,当用户按下回车键时,Windows发送一个特殊的WM_GETDEFID消息来获得缺省的命令ID,Windows再将它作为WM_COMMAND发送。所以,你要做的就是重载WM_GETDEFID消息,在有关Windows的文档中是这样描述WM_GETDEFID返回值的:“如果有缺省得按钮,则返回值的高位字包含DC_HASDEFID,低位字包含控制的标识符。否则,返回值是零。” 
    根据这段描述,假设如果没有缺省得按钮,则返回值应该是零。如果想要disable缺省得ID,必须在高位字中返回DC_HASDEFID。  
    BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
        ON_MESSAGE(DM_GETDEFID, OnGetDefID)
        ...
    END_MESSAGE_MAP()LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp) 
    {
        return MAKELONG(0,DC_HASDEFID); 

     
      

  7.   

    http://www.vckbase.com/document/viewdoc/?id=481
      

  8.   

    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
    {
    if( pMsg->message == WM_KEYDOWN )
    {        
    switch( pMsg->wParam )
    {
    case VK_RETURN: //屏蔽回车
    return TRUE;
    }
    } return CDialog::PreTranslateMessage(pMsg);
    }
      

  9.   

    同上,要屏蔽ESC就加入一条case VK_ESCAPE:
                                  return TRUE;