如题

解决方案 »

  1.   

    让窗口接收按键事件,如果发现ESC按下,退出程序,
      

  2.   

    如果是这样的话,好像和MultiLine没什么关系吧,
      

  3.   


    我就是不想退出程序
    窗口接受的都被 过滤了
    就是在CEdit控件中接收esc 整个窗口都退出去了
      

  4.   

    pretranslateMessage()捕获ESC消息后,将这个消息KILL掉,就OK 了!
      

  5.   

    if (pMsg->wParam == VK_RETURN ||
    pMsg->wParam == VK_ESCAPE)
    {
    // don't allow dialog to process return or escape keys.
    ::TranslateMessage(pMsg);
    ::DispatchMessage(pMsg); return TRUE;
    }这段代码根本抓不到多行的CEdit的esc消息阿
    if (GetFocus()->m_hWnd == GetDlgItem(IDC_EDIT3)->m_hWnd)
    {
    if (pMsg->wParam == VK_ESCAPE)
    {
    return TRUE;
    }
    }
        if (pMsg->wParam == VK_RETURN ||
    pMsg->wParam == VK_ESCAPE)
    {
    // don't allow dialog to process return or escape keys.
    ::TranslateMessage(pMsg);
    ::DispatchMessage(pMsg); return TRUE;
    }
    我又加了一段代码 判断如果如果焦点在CEdit控件上 经常程序中断...
      

  6.   

    处理Edit的父窗口的ESC按键事件,这个和Edit没有关系
      

  7.   


    if (pMsg->wParam == VK_RETURN ||
            pMsg->wParam == VK_ESCAPE)
        {
            // don't allow dialog to process return or escape keys.
            ::TranslateMessage(pMsg);
            ::DispatchMessage(pMsg);        return TRUE;
        }中间的Translate和dispatch语句要屏蔽掉啊!直接返回TRUE
      

  8.   

    我刚才弄了个测试程序,这种现象好像与Multiline有关。
      

  9.   

    重载edit所在的表单的PreTranslateMessage(MSG* pMsg)在里面加上:
    if(pMsg->message  == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE;
      

  10.   

    我测试没这个现象,你怎么测试的?
    我的做法:
    1.创建一个对话框工程
    2. 点击Cancel按钮,并把里面的CDialog::OnCancel()删除
    3. 在对话框上加一个edit,然后选上Multiline
      

  11.   

    点击Cancel按钮,并把里面的CDialog::OnCancel()删除???在实际应用时不能这么做吧,用户点击取消时就应该退出对话框。 
      

  12.   

    呵呵~刚才留意了一下,对于一个对话框,无论鼠标焦点在对话框什么地方,点击ESC时都会退出对话框,这样的情况以前还没注意过。
      

  13.   

    MFC在CDialog::PreTranslateMessage中专门对多行的edit做了处理,不知道是何原因,有可能又是兼容问题吧 if (pMsg->message == WM_KEYDOWN &&
    (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_CANCEL) &&
    (::GetWindowLong(pMsg->hwnd, GWL_STYLE) & ES_MULTILINE) &&
    _AfxCompareClassName(pMsg->hwnd, _T("Edit")))
    {
    HWND hItem = ::GetDlgItem(m_hWnd, IDCANCEL);
    if (hItem == NULL || ::IsWindowEnabled(hItem))
    {
    SendMessage(WM_COMMAND, IDCANCEL, 0);
    return TRUE;
    }
    }如果想不影响对话框的ESC键退出的作用的话,可以派生CEdit关联到控件,然后在CMyEdit::PreTranslateMessage中处理掉VK_ESCAPE