CTreeCtrl类的选择消息的处理方式是:在当前树结点点击其他结点时,发出一个WM_SELCHANGED消息,假如再次点击当前结点时,则不响应(即不发出消息)。问题是当我有两个树时,比如tree1和tree2。我先点击tree1上的a结点 ,这时候tree1发消息响应我,然后我点tree2上的b结点,tree2也响应我。可是当我再去点击tree1的a结点时,由于对于tree1来说,我选择的上次结点和这次结点相同,它就不在响应我,可是对我来说,是从tree2的b结点变到了tree1的a结点,我需要知道这个变化,请高手指点一下。

解决方案 »

  1.   

    使用ClassWizard编写响应WM_SELCHANGED 的消息响应函数,然后在OnSelchanged函数里编写具体代码,比如点击tree1时执行什么,点击tree2时执行什么。
    例如:
    void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    CDataManageDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CTreeCtrl& eepromtree=GetTreeCtrl();
    HTREEITEM hItem; //树型目录中被选中的Item句柄
    hItem = eepromtree.GetSelectedItem();
    pDoc->m_strFlag = eepromtree.GetItemText(hItem); //得到选中Item的文本//根据选中的Item执行相应的操作
    if(pDoc->m_strFlag ==tree1)
             {         }
             else if(pDoc->m_strFlag ==tree2)
             {         }
    *pResult = 0;
    }
      

  2.   

    响应WM_LBUTTONDOWN或者NM_CLICKHTREEITE  hItem = GetSelectedItem();
    if( hItem )
    {
    pDoc->m_strFlag = eepromtree.GetItemText(hItem); //得到选中Item的文本//根据选中的Item执行相应的操作
    if(pDoc->m_strFlag ==tree1)
             {         }
             else if(pDoc->m_strFlag ==tree2)
             {         }
      
    }
      

  3.   

    也可以响应WM_SETFOCUS消息,在里面获取选择的树项目,在根据项目执行需要的工作。
      

  4.   

    Skyling你是个典型错误, phoenix96_2000(eXMe) 你说的 GetSelectedItem是tree的属性,按照我的理解,你是要在CMainFrame里添加左键事件,我不知道你为什么这么用:                    HTREEITE  hItem = GetSelectedItem();
    我的理解是需要分别调用tree1,tree2的属性GetSelectedItem去获得他们当前选择的项目(也就是a节点,b节点),通过上一个左键事件记录所选择的项目对比来判断,问题出现,我只知道tree1选择的是a节点,tree2选择的是b节点,但是我并不知道这次选择的是a还是b。想问一下,我能不能在选择tree2的时候,把tree1的选择项置空?
      

  5.   

    zxyjyzxyjy(星星)你和 phoenix96_2000(eXMe)是同一个问题
      

  6.   

    怎么会错呢?我写程序的时候也是这么用的,没有错啊,使用
    HTREEITEM hItem; //树型目录中被选中的Item句柄
    hItem = eepromtree.GetSelectedItem();
    pDoc->m_strFlag = eepromtree.GetItemText(hItem); //得到选中Item的文本
    就可以得到选中的文本,然后根据此文本执行相应操作啊。
      

  7.   

    你试试两次点击a节点,第二次根本不会发送WM_SELCHANGED消息,所以也不会调用OnSelchanged
      

  8.   

    我没说过写在CMainFrame中,
    从CTreeCtrl继承,添加即使你要添加到 CMainFrame里面,NM_CLICK可以分别对两个控件增加事件
    ON_NOTIFY(NM_CLICK,IDC_TREE1,OnClickTree1)
    ON_NOTIFY(NM_CLICK,IDC_TREE2,OnClickTree2)OnClickTree2()
    {
      m_tree1.DeleteAllItems();
    }
    }