我的edit控件是在对话框上直接加上的.在控件里面选择文本后,点击右键可以看到弹出菜单中有copy,cut,paste,undo等项,但是为什么我不能用热键比如Ctrl+C, Ctrl+X, Ctrl+V等对选中文本进行操作呢?
还需要重载PreTranslateMessage()函数做这些系统基本的热键做处理吗?或者是有什么设置我没搞好啊?

解决方案 »

  1.   

    重载PreTranslateMessage()函数,函数里添加如下代码
        if(GetFocus() == GetDlgItem(IDC_EDIT2)) //判断焦点在不在edit框内
        {
    if (pMsg->message == WM_KEYDOWN)
    {
    switch (pMsg->wParam)
    {  
    case VK_ESCAPE:
    SetFocus();
    return TRUE;
    case 'A':
                                  if(::GetKeyState(VK_CONTROL) < 0)
      {
                                     AfxMessageBox("Ctrl + A!");
      

  2.   

    我刚才又仔细检查了一下,发现如果edit控件是画在CDialog类的对话框资源上的话,什么都不用做,就可以用Ctrl+C, Ctrl+X, Ctrl+V等热键操作了,
    但是我的edit控件是画在CFormView类加载的对话框资源上,就不能用Ctrl+C, Ctrl+X, Ctrl+V等热键操作了,
    可能是因为CFormView的原因吧。对于这些系统标准的热键,似乎没有必要自己重载PreTranslateMessage吧,应该有别的办法吧,哪位知道?
      

  3.   

    bohut(伯虎)的方法不是不行,但是如果你的formview中的edit控件太多时,一个一个做判断就太麻烦了。
    我自己把它解决了,我看了看MFCCFormView中PreTranslateMessage的源代码,发现它先调用Cview的CView::PreTranslateMessag函数,如果不成功,然后再调用GetTopLevelFrame()得到最顶层的frame,调用它的CFrameWnd::PreTranslateMessag函数,如果不成功,最后再调用PreTranslateInput()函数。
    照分析,很有可能对于Ctrl+C, Ctrl+X, Ctrl+V这样的热键消息,CView::PreTranslateMessag或者CFrameWnd::PreTranslateMessag返回了TRUE,但是并没有做相应的处理,最后真正做处理的PreTranslateInput()函数便没有被调用到。恐怕这是MFC中CFormView的一个bug吧我继承于CFormView的类CMyFormView中,我先判断是不是Ctrl+C, Ctrl+X, Ctrl+V这样的热键消息,如果是,就调用的PreTranslateInput()函数处理并返回。如果不是这样的消息,则调用基类的CFormView::PreTranslateMessage(pMsg)函数。BOOL CMyFormView::PreTranslateMessage(MSG* pMsg)
    {
        if(pMsg->message == WM_KEYDOWN)
            if(GetKeyState(VK_CONTROL) & 0x80)
                if(pMsg->wParam == 'c' || pMsg->wParam == 'C' 
                    ||pMsg->wParam == 'v' || pMsg->wParam == 'V'
                    ||pMsg->wParam == 'z' || pMsg->wParam == 'Z'
            ||pMsg->wParam == 'x' || pMsg->wParam == 'X')
                {
                    return PreTranslateInput(pMsg);
                }    return CFormView::PreTranslateMessage(pMsg);
    }
      

  4.   

    重载Edit的Cut等,如下
    void CSdi_formView::OnEditCut() 
    {
    // TODO: Add your command handler code here
    GetFocus()->SendMessage(WM_CUT);
    }void CSdi_formView::OnUpdateEditCut(CCmdUI* pCmdUI) 
    {
    // TODO: Add your command update UI handler code here
    pCmdUI->Enable();//此处可根据具体情况Enable
    }
      

  5.   

    to vcmute(横秋),这样好像不行吧。
    我的问题是CFormView对其上的CEdit控件中的选中文本的Ctrl+X等消息不做相应。
    你这样只是搞了一个这样的函数OnEditCut() ,我估计你是在某个控件被选中,有focus时这个消息响应函数被调用的。这样的话,只要是有focus的控件,你就给它发了一个WM_CUT消息。呵呵,如果是一个没有选中文本的控件,也就无所谓了。如果是选中文本的控件,人家没剪切,你就发了剪切文本的消息,这样怎么行?