将一个CTreeCtrl上的节点进行编辑,我发现只有在节点离开焦点或者输入回车,此节点才结束编辑状态。现在我想自己用代码来结束它的编辑状态,比如输入一个字符"Q",就结束编辑。怎么实现呢?难道发一个WM_NOTIFY (TVN_ENDLABELEDIT)来通知自己?

解决方案 »

  1.   

    给TreeCtrl发TVM_ENDEDITLABELNOW消息。
      

  2.   

    //TVM_ENDEDITLABELNOW消息--
    //直接在结束编辑后设置文本为刚输入文本
    void CTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
    if (pTVDispInfo->item.pszText)
    {
    pTVDispInfo->item.mask=TVIF_TEXT;
    SetItem(&pTVDispInfo->item);
    }
    *pResult = 0;
    }
    //截取消息 这里可以自己定义想要以什么方式结束      
    BOOL CTreeCtrl::PreTranslateMessage(MSG* pMsg) 
    {
    if(pMsg->message==WM_KEYDOWN)   
    {   
    if(GetEditControl()     
    &&   (pMsg->wParam==VK_RETURN  ||   pMsg->wParam==VK_DELETE     
    ||   pMsg->wParam==VK_ESCAPE   ||   GetKeyState(VK_CONTROL)))   
    {   
    ::TranslateMessage(pMsg);   
    ::DispatchMessage(pMsg);   
    return   TRUE;                                                          
    }   }  else if(WM_LBUTTONDOWN == pMsg->message)  {
    if(MK_CONTROL & pMsg->wParam)  
    {
    CPoint point(LOWORD(pMsg->lParam),HIWORD(pMsg->lParam));
    TVHITTESTINFO info;
    info.flags=0;
    info.pt=point;
    HitTest(&info);
    SelectItem(info.hItem);
    }
    }
    return CTreeCtrl::PreTranslateMessage(pMsg);
    }
      

  3.   


    这个方法很标准,其实有个函数啊,好像就叫 EndEdit吧?好久不弄了,都记不清了。
      

  4.   

    将一个CTreeCtrl上的节点进行编辑,我发现只有在节点离开焦点或者输入回车,此节点才结束编辑状态。现在我想自己用代码来结束它的编辑状态,比如输入一个字符"Q",就结束编辑。怎么实现呢?难道发一个WM_NOTIFY (TVN_ENDLABELEDIT)来通知自己?