现在已实现了右键单击树节点,并弹出了右键菜单,且菜单项里也有“重命名”,请问如何实现点击菜单项“重命名”后实现该功能。需要在“重命名”对应的函数里面做什么处理啊?
我已将EditLabel设置为了true,然后添加了TVN_BEGINLABELEDIT 和 TVN_ENDLABELEDIT 。亦需要重载它们两个对应的事件函数?
有实例代码帮助理解最好了。谢谢解答。

解决方案 »

  1.   

    这个嘛,你可以判断这个名字,再按对应名字发出一个值,用switch获取该值进行对应处理。
      

  2.   

    #define a 1switch(n)
    case 1: xxxxx;if( aaaa1 == aaaa) switch(1)
      

  3.   

    if( aaaa1 == aaaa) switch(a)
      

  4.   

    看看这个
    http://blog.sina.com.cn/s/blog_4b44e1c00100d4lr.html
      

  5.   

    楼上已经正解了 ,结贴吧
    void CMyTreeCtrl::OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
    {
          LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
          // TODO: 在此添加控件通知处理程序代码
          *pResult=1;
          CEdit*pEdit=GetEditControl();
          ASSERT(pEdit);
          if (pEdit)
          {
              pEdit->LimitText(15);
              *pResult=0;
          }  
    }
    void CMyTreeCtrl::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
    {
          LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
          // TODO: 在此添加控件通知处理程序代码      BOOL bValidItem=FALSE;
          CString strItem=pTVDispInfo->item.pszText;
          if (0<strItem.GetLength())
          {
              HTREEITEM hParent=GetParentItem(pTVDispInfo->item.hItem);
              bValidItem=!DoesItemExist(hParent,strItem);    
          }
          *pResult = bValidItem;
    }
      

  6.   

    那我在OnRename()里面如何触发OnTvnBeginlabeledit进行编辑啊?即在点击菜单项(重命名)对应的函数里做什么操作?
      

  7.   

    onRename(){
    // Show the edit control on the label of the selected item.
    // The tree control must have the TVS_EDITLABELS style set.
    HTREEITEM hSel = m_TreeCtrl.GetSelectedItem();
    CEdit* pmyEdit = m_TreeCtrl.EditLabel(hSel);
    ASSERT(pmyEdit != NULL);
      

  8.   

    插入数据时候将Hitem与你的文本信息绑定,放入内存中(map),右键点击获取当前点击Hitem,找到文本,修改内存,刷新节点
      

  9.   

    1.创建一个基于CTreeCtrl类的新类CMyTreeCtrl
    2.在新类中添加CEdit m_edit,然后在新类中重载PruSubClassWindow这个函数,然后在这个函数中添加如下代码:
    CRect rcEdit;
    rcEdit.left=10;   //Edit大小随便定义,大小对后面的操作没影响
    rcEdit.top=10;
    rcEdit.right=20;
    rcEdit.bottom=20;
    m_edit.Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN  | ES_LEFT,rcEdit,this,1);
    m_edit.ShowWindow(SW_HIDE);
    3.在新类中添加:HTREEITEM hItem; //用这个来记录鼠标选中项..
    4.在新类中添加鼠标右键的消息,在消息的响应函数中添加:
    hItem=GetSelectedItem();
    CMenu menu;
    menu.LoadMenu(你的菜单ID);
    CMenu *pSubMenu=menu.GetSubMenu(0); //假设你的要弹出的菜单创建在主菜单的第一个主菜单下
    pSubMenu->TrackPopMenu(........);   //对菜单进行显示 ,具体参数可参考MSDN
    4.在新类中创建一个新的函数void ShowEdit();
    在函数中添加:
    CRect rcItem;
    GetItemRect(hItem,rcItem,true);
    CString strText;
    GetItemText(hItem,strText);
    m_edit.MoveWindow(rcItem);
    m_edit.ShowWindow(SW_SHOW);
    m_edit.SetWindowText(strText);
    m_edit.BringWindowToTop();
    }
    5.在新类中消息映射中添加:ON_EN_KILLFOCUS(1,OnEnKillFocusEdit) // 数字1是前面创建Edit时的ID.
      在类中添加:afx_msg void OnEnKillFocusEdit();
    然后添加
    void CMyCtreeCtrl::OnEnKilkFocusEdit()
    {
       POINT pt;
       GetCursorPos(&pt);
       ScreenToClient(&pt);
       CRect rcItem;
       GetItemRect(hItem,rcItem,true);
       if(!rcItem.PtInRect(pt))
       { 
          CString strText;
          m_edit.GetWindowText(strText);
          SetItemText(hItem,strText);
          m_edit.ShowWindow(SW_HIDE);
       }
    }
    这个函数起到的作用是,点击鼠标左键实现树项目文本修改.(鼠标要点击在修改项之外,才能实现修改项的文本)..    
    5.在对话框中添加树控件,把树控件和CMyTreeCtrl关联起来..关联的变量名为:m_treectrl,在你的菜单项“重命名”的映射函数中添加如下代码:
    m_treectrl.ShowEdit();
    添加了以上的步骤,相信就应该能实现你想要实现的效果...嘻嘻...