当tree被点击的时候,会发出多个消息。我响应 TVN_SELCHANGED 可以知道那个条目被点击,但是当两次的点击都是同一个条目时,第二次的点击没有收到消息。如果响应 NM_CLICK 得不到当前点击的条目,得到的是前一次点击的条目。不知道如何处理为好?

解决方案 »

  1.   

    NM_CLICK 可以得到当前选中的条目啊
    GetSelectedItem
      

  2.   

    楼上,不行的,得到NM_CLICK消息时,条目更新还没有开始,GetSelectedItem只能得到上一次选中的条目。
      

  3.   

    如果这个tree不是很复杂的话可以用下面这个办法:可以通过GetItemText根据所点击条目的名称来确定你点击的是什么条目,如果有两个以上条目名称相同,就再通过GetParentItem得到它们的上层条目名称来判断是什么条目。
    以下是我一个项目中的部分代码,你可以参考下。
    void Dlg1::OnDblclkTree3(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    CMainFrame* p= (CMainFrame*)AfxGetApp()->m_pMainWnd;m_hTreeItem=m_tree.GetSelectedItem();
    CString S1=m_tree.GetItemText(m_hTreeItem);
    m_tree.GetParentItem(m_hTreeItem);if (S1=="新建工程")
    {
    ::PostMessage(p->m_hWnd,0x503,0L,0L);
    }
    if (S1=="打开工程")
    {
    ::PostMessage(p->m_hWnd,0x504,0L,0L);
    }
    if (S1=="保存工程")
    {
    ::PostMessage(p->m_hWnd,0x505,0L,0L);
    }if (m_tree.GetItemText(m_tree.GetParentItem(m_hTreeItem))=="IRI数据")
    {

    if (S1=="上行行车道")
    {
    if (p->iri_1==1)
    {
    data_select=1;
    road_select=1;
    ::PostMessage(p->Splitter3.GetPane(0,0)->m_hWnd,0x411,0L,0L);
    }
    if (p->iri_1==0)
    {
    ::PostMessage(p->m_hWnd,0x601,0L,0L);
    }
    }
    if (S1=="上行超车道")
    {
    if (p->iri_2==1)
    {
    data_select=1;
    road_select=2;
    ::PostMessage(p->Splitter3.GetPane(0,0)->m_hWnd,0x412,0L,0L);
    }
    if (p->iri_2==0)
    {
    ::PostMessage(p->m_hWnd,0x602,0L,0L);
    }
    }
    }
    }
      

  4.   

    在单击事件中的参数里面有选择的。。
    void CClassView::OnLClickTree(NMHDR* pNMHDR, LRESULT* pResult)
    {
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    pNMTreeView->itemNew//这个就是新选中的节点
    }
      

  5.   

    响应NM_CLICK时,直接读取tree的状态还是不行的,但是消息中带的参数是可行的。