现在我自己自绘了一个树形控件T1,加了ITEM:树形结构如下:I1
 I1_1
   I1_1_1
   I1_1_2
 I1_2
   I1_2_1
 I1_3
I2
 I2_1
   I2_1_1
 I2_2
要实现这样的效果,1,双击I1,I2不会收缩,双击I1_1,I1_2,I2_1是可以收缩的
2.初始化后就是全部展开的效果,就是上面这种图
3.I1,I2选中后无论单击还是双击都不会自绘,怎么在DrawItem中判断
在线等高手指点,尤其是第一点问题,一直想不到怎么解决?

解决方案 »

  1.   

    响应ON_CLICK消息就可以了
    使用HitTest通过鼠标位置获取当前的节点ITEM
    然后根据ITEM判断是否Expand(展开或或收缩)子节点
    代码自己搞定
      

  2.   

    楼主你查下MSDN吧,树控件的方法函数,你需要的功能里边都有
      

  3.   

    响应树的双击事件如果双击项的父亲项不是根
    用Expand收拢双击项的父亲项的兄弟们如果双击项的父亲项是根
    不予理睬
      

  4.   

    void CWAADlg::OnDblclkTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
         HTREEITEM cur=mTree.GetSelectedItem();     //取得当前选中的项目
     HTREEITEM Father=mTree.GetParentItem(cur); //取得当前选中的项目的父亲项
     HTREEITEM x=Father;                        //当前选中的项目的叔伯们
     if(TVI_ROOT==Father) return;               //如果父亲项就是祖宗就当啥也没发生过
         
     x=Father;                               //从当前选中的项目的父亲项开始
     while(1)
     {
            x=mTree.GetPrevSiblingItem(Father)   //向前找
    if(NULL==x)  break;                  //找到大伯为止
    mTree.Expand(x,0);                   //收起来
     }  x=Father;                               //从当前选中的项目的父亲项开始
     while(1)
     {
            x=mTree.GetNextSiblingItem(fater);   //向后找
    if(NULL==x)  break;                  //找到么叔为止
    mTree.Expand(x,0);                   //收起来
     } *pResult = 0;
    }
      

  5.   

    树形控件TVI_ROOT应该只指I1而不包括I2吧,这样只有I1不响应!我要是有很多,还有I3,I4呢,怎么判断,还有初如化DLG时,树形控件怎么全部展开?
      

  6.   

    那就往上一级别嘛,if(NULL==Father) return; 真笨!
      

  7.   

    NULL=father同样只有根目录没响应,应该说I2的父结点也是I1,
      

  8.   

    错了,应该是父结点为NULL,但我在双击中加了这样的代码
       HTREEITEM cur=mTree.GetSelectedItem();    
         HTREEITEM Father=mTree.GetParentItem(cur);                        
         if(NULL==Father) return;    
       *pResult = 0; 
    发现双击还是可以把I2收缩起来,单步测试的确到了    if(NULL==Father) return;    
    求原因
        
      

  9.   

    void TreeVisit(HTREEITEM hItem)  
    {   
      AfxMessageBox(GetItemText(hItem));   
      if(ItemHasChildren(hItem))   
      {  
       HTREEITEM hChildItem = GetChildItem(hItem);   
       while(hChildItem!=NULL)   
       {  
         TreeVisit(hChildItem); //递归遍历孩子节点   
         hChildItem = GetNextItem(hChildItem, TVGN_NEXT);   
       }   
      }   
    }  树的遍历
      

  10.   


    void ExpandTreeNode(CTreeCtrl& treeCtrl, HTREEITEM hItem)
    {
    if(NULL == hItem)
    {
    return ;
    } treeCtrl.Expand(hItem, TVE_EXPAND);

    HTREEITEM hChildItem = treeCtrl.GetChildItem(hItem);
    ExpandTreeNode(treeCtrl, hChildItem); HTREEITEM hNextItem = treeCtrl.GetNextItem(hItem, TVGN_NEXT);
    ExpandTreeNode(treeCtrl, hNextItem);
    }// 初始化参数中 HTREEITEM hItem = m_tree.InsertItem(_T("I1"));
    HTREEITEM hItem2 = m_tree.InsertItem(_T("I1_1"), hItem);
    m_tree.InsertItem(_T("I1_1_1"), hItem2);
    m_tree.InsertItem(_T("I1_1_2"), hItem2);
    m_tree.InsertItem(_T("I1_1_3"), hItem2); hItem2 = m_tree.InsertItem(_T("I1_2"), hItem);
    m_tree.InsertItem(_T("I1_2_1"), hItem2);
    m_tree.InsertItem(_T("I1_3"), hItem);

    hItem2 = m_tree.InsertItem(_T("I2"));
    HTREEITEM hItem3 = m_tree.InsertItem(_T("I2_1"), hItem2);
    m_tree.InsertItem(_T("I2_1_1"), hItem3);
    m_tree.InsertItem(_T("I2_2"), hItem2); ExpandTreeNode(m_tree, m_tree.GetRootItem());// NM_CLICK消息,NM_DBLCLK与此类似void CXXDlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) //NM_CLICK消息响应函数
    {
    // TODO: Add your control notification handler code here CPoint pt;
    GetCursorPos(&pt);
    m_tree.ScreenToClient(&pt);
    HTREEITEM hItem = m_tree.HitTest(pt);
    if(hItem)
    {
    if(NULL == m_tree.GetParentItem(hItem))
    {
    m_tree.Expand(hItem, TVE_EXPAND);
    *pResult = 1;
    return ;
    }
    }
    *pResult = 0;
    }