本人初学MFC,新建了一个基于对话框的MFC应用程序,但是按了ESC后,窗口就会关闭。看了网上的好多代码,都说重载OnCancel函数或PreTranslateMessage函数。重载OnCancel时遇到问题:不知道在哪里添加?
我在CXXDialog类上右击,选择“Add virtual Function...”,但是在窗口中找不到OnCancel函数,不知道是怎么回事?
请大家帮忙。但是有PreTranslateMessage函数,为什么会这样呢?

解决方案 »

  1.   

    类向导里(ctrl + W)   Message Maps 中 IDs 选择 IDCANCEL 消息选择BN_CLICKED  然后选择 Add function 就可以 重载了!
      

  2.   

    我要的是按下ESC时不关闭窗口,但是按下取消按钮时,效果不变(仍然是关闭窗口)。所以1楼的答案不是我要的!
      

  3.   

    重写PreTranslateMessage不就行了吗, 当收到VK_ESCAPE时直接返回不做处理
      

  4.   

    呵呵 。 你别急嘛!
    首先 :
    我回答的是     重载OnCancel时遇到问题:不知道在哪里添加?   。
    其次:
    你 把重载的函数 清空, 你再按下ESC 窗口就不会被关闭了。
    void CXDlg::OnCancel() 
    {
    // TODO: Add extra cleanup here

    //CDialog::OnCancel();
    }
      

  5.   

    我只想重写下OnCancel试试,并没说用PreTranslateMessage达不到效果!难道没人会我要的吗?
      

  6.   

    发现重载OnCancel后,取消按钮的点击事件,以及关闭对话框右上角的叉,都关闭不了窗口了呀。重载过程如下:
    void CDdDlg::OnCancel() 
    {
    // TODO: Add extra cleanup here

    // CDialog::OnCancel();
    }有没有办法,在按下ESC不关闭窗口,但不影响"确定”和“取消”按钮的功能呢?难道只有PreTranslateMessage?
      

  7.   

    不用PreTranslateMessage也可以 
    屏蔽OnCancel中的 CDialog::OnCancel();把IDCANCEL按钮的ID修改一下 如 IDC_APPEXIT 添加响应函数 OnAppExit()
    OnAppExit()
    {
      CDialog::EndDialog(IDCANCEL);
    }
      

  8.   


    重载PreTranslateMessage函数,确实可以解决问题,且不影响"确定”和“取消”按钮的功能,以及菜单中的“关闭”和窗口右上角的“关闭”按钮。重载过程如下:
    BOOL CDdDlg::PreTranslateMessage(MSG* pMsg) 
    {
    if(pMsg->wParam == VK_ESCAPE)
    {
    return 0;
    }

    return CDialog::PreTranslateMessage(pMsg);
    }