我从CTreeCtrl类派生出CMytree,由这个派生类创建的对象在CDialog中一切正常,把CDialog改为CDialogBar之后,为什么接收不到TVN_ENDLABELEDIT消息?奇怪的是,从网上下载的例子,代码和我的基本一致,也是在CDialogBar上建的Tree,但这个例子确可以正常响应TVN_ENDLABELEDIT

解决方案 »

  1.   

    网上下载的例子(其中CTree是我加的):
    /////////////////////////////////////////////////////////////////////////////
    // CIEBar dialogCIEBar::CIEBar(CWnd* pParent /*=NULL*/)
    : CDialogBar()
    {

    }void CIEBar::DoDataExchange(CDataExchange* pDX)
    {
    CDialogBar::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CIEBar)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CIEBar, CDialogBar)
    //{{AFX_MSG_MAP(CIEBar) //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    BOOL CIEBar::InitIEBar()
    {
    // create the tree control
    pTreeCtrl = new CTree();//CTreeCtrl();
    ASSERT(pTreeCtrl);
    if(!pTreeCtrl->Create(WS_CHILD | WS_VISIBLE | TVS_EDITLABELS , CRect(0,0,0,0), this, 101))
    {
    TRACE0("Failed to create tree control!");
    return FALSE;
    }    // create the tool tip
        if(!m_TipCtrl.Create(this))
    return FALSE;

    return TRUE;
    }BOOL CIEBar::PreTranslateMessage(MSG* pMsg) 
    {
        //m_TipCtrl.RelayEvent(pMsg);
        return CWnd::PreTranslateMessage(pMsg);
    }CTreeCtrl* CIEBar::GetTreeCtrl()
    {
    if(pTreeCtrl)
    return pTreeCtrl;
    else
    return NULL;
    }/////////////////////////////////////////////////////////////////////////////
    // CTreeCTree::CTree()
    {
    }CTree::~CTree()
    {
    }
    BEGIN_MESSAGE_MAP(CTree, CTreeCtrl)
    //{{AFX_MSG_MAP(CTree)
    ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CTree::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
             if(pTVDispInfo->item.pszText!=0)
             {
       SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);
                *pResult = TRUE;
             }
             else
                *pResult = FALSE;}/////////////////////////////////////////////////////////
    //CMainFrameint CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    } // TODO: Delete these three lines if you don't want the toolbar to
    //  be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar); if(!m_IEBar.Create(this, IDD_IEBAR, CBRS_LEFT, 100) || !m_IEBar.InitIEBar())
    return -1;
    CTreeCtrl* pTreeCtrl = m_IEBar.GetTreeCtrl();
    ASSERT(pTreeCtrl);
    // modify tree styles
    pTreeCtrl->ModifyStyle(NULL, 
    TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
    HTREEITEM t_hRoot = pTreeCtrl->InsertItem("root");
    for(int i=0; i<40; i++)
    {
    CString t_ItemStr;
    t_ItemStr.Format("node %d", i+1);
    pTreeCtrl->InsertItem(t_ItemStr, t_hRoot);
    } m_IEBar.EnableDocking(CBRS_ORIENT_HORZ);
    DockControlBar(&m_IEBar);
    return 0;
    }我自己的:
    /////////////////////////////////////////////////////////////////////////////
    // CTreeDlg dialog
    CTreeDlg::CTreeDlg(CWnd* pParent /*=NULL*/)
    : CDialogBar()
    {
    //{{AFX_DATA_INIT(CTreeDlg)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    }
    void CTreeDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialogBar::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CTreeDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(CTreeDlg, CDialogBar)
    //{{AFX_MSG_MAP(CTreeDlg)
    ON_WM_CREATE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CTreeDlg message handlersint CTreeDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CDialogBar::OnCreate(lpCreateStruct) == -1)
    return -1;
    m_tree=new CMyTree();
    m_tree->Create(WS_CHILD | WS_VISIBLE | TVS_EDITLABELS,CRect(0,0,200,400),this,101); m_tree->InsertItem("AAAAA");
    return 0;
    }BOOL CTreeDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class

    return CWnd::PreTranslateMessage(pMsg);
    }
    /////////////////////////////////////////////////////////////////////////////
    // CMyTreeCMyTree::CMyTree()
    {
    }CMyTree::~CMyTree()
    {
    }
    BEGIN_MESSAGE_MAP(CMyTree, CTreeCtrl)
    //{{AFX_MSG_MAP(CMyTree)
    ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CMyTree message handlersvoid CMyTree::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
    // TODO: Add your control notification handler code here
    if(pTVDispInfo->item.pszText!=0)
             {
      this->SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);
      *pResult = TRUE;
             }
             else
                *pResult = FALSE;
    }
    ///////////////////////////////////////////////////////////////////
    //CMainFrame
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    } if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
      sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1;      // fail to create
    } // TODO: Delete these three lines if you don't want the toolbar to
    //  be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar); if(!m_treedlg.Create(this, IDD_TREEDLG, CBRS_LEFT, 100))
    return -1;
    CTreeCtrl *pTreeCtrl=m_treedlg.m_tree;
    pTreeCtrl->ModifyStyle(NULL, 
    TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS);
    HTREEITEM t_hRoot = pTreeCtrl->InsertItem("root");
    for(int i=0; i<40; i++)
    {
    CString t_ItemStr;
    t_ItemStr.Format("node %d", i+1);
    pTreeCtrl->InsertItem(t_ItemStr, t_hRoot);
    } m_treedlg.EnableDocking(CBRS_ORIENT_HORZ);
    DockControlBar(&m_treedlg);
    //m_treedlg.EnableDocking(CBRS_ALIGN_LEFT);
    //DockControlBar(&m_treedlg); return 0;
    }