如题,如何在"重命名"函数中做到像资源管理器中那样的重命名操作.

解决方案 »

  1.   

    1、在你的重命名函数中,调用CEdit* EditLabel( HTREEITEM hItem );函数,就可以实现编辑功能;
    2、响应OnBeginlabeledit()函数,该函数在命名前调用,在里面记录当前选中的Item和名字;
    3、响应OnEndlabeledit()函数,该函数在命名结束时调用,判断新名字是否符合标准,如果不符合标准,就返回到第一步,继续命名,如果符合,则将选中的Item的名字设置为新名字至于怎么结束命名,一般有两种方法:响应回车键和响应鼠标在该Item外的地方单击,前者系统会自己处理,后者需要自己处理
      

  2.   

    谢谢:
    至于怎么结束命名,一般有两种方法:响应回车键和响应鼠标在该Item外的地方单击,前者系统会自己处理,后者需要自己处理
    我发现如果不用重命名这个函数,系统倒是会处理回车;现在的情况正好与你上面所说的相反,前者系统不处理,后者系统处理了? 
    该在何处处理这个回车? PreTranslateMessage, OnKeyDown, OnEndLabelEdit?
      

  3.   

    呵呵,是我看错了,我用的是PreTranslateMessage(),在其中判断分两步:
    1、用树控件的GetEditControl()函数获取重命名的编辑框,如果返回值不为NULL,则表示正在命名;
    2、判断是否按下了回车键,如果是,就用SetFocus()函数将焦点设置到树控件上,这和左键单击的作用是一样的,所以可以结束命名,它会自动调用那个OnEndlabeledit()函数
      

  4.   

    BOOL CLwndBar::PreTranslateMessage(MSG* pMsg) 
    {
    CEdit *pEdit = m_treeCtrl.GetEditControl();
    if (pEdit != NULL)
    {
    if (pMsg->lParam == 0x000D) // 这样判断回车怎么没反应?
    m_treeCtrl.SetFocus();
    }
        m_TipCtrl.RelayEvent(pMsg);
        return CWnd::PreTranslateMessage(pMsg);
    }
      

  5.   

    //... In PreTranslateMessage
    if( pMsg->message == WM_KEYDOWN )
    {  
    if(pMsg->hwnd == m_treeCtrl.GetEditControl()->m_hWnd)
    {
    if ( pMsg->wParam == VK_RETURN )
    {
    m_treeCtrl.GetEditControl()->LimitText(128);
    m_treeCtrl.GetEditControl()->GetWindowText(strText);
    m_treeCtrl.SetFocus();
    return TRUE;
    }
    }
    }
    //...
    搞定