CTreeCtrl操作总结

来源:互联网 发布:php assert 后门 编辑:程序博客网 时间:2024/05/17 07:39

                                                         CTreeCtrl操作总结

   1.插入结点

      InsertItem

      第一个参数是结点字符串,第二个参数是父节点句柄,如果没有父节点,就TVI_ROOT

      HTREEITEM   hitem,hsubitem;

      hitem=m_treeCtrl.InsertItem(“Lef  1”,TVI_ROOT);

      就插入了第一个节点  Lef 1

 

      要插入它的子结点:

      hsubitem=m_treeCtrl.InsertItem(“Lef 1-1”,hitem);

    2.如果要让 树控件 有滚动条,在资源里面的 Scroll属性设置为true就可以了。

 

    3.如果要在每个节点前面加上个Check box,那么将资源里面的Check Boxes设置为

       true就可以了。

    4.要知道选择的结果,可以在父窗口中重写 OnNotify 函数

        //处理树形控件复选框被勾选的消息
BOOL CSelDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
 // TODO: 在此添加专用代码和/或调用基类
 int   idCtrl   =   (int)   wParam;
 NMHDR*   pnmh   =   (LPNMHDR)   lParam;
 UINT   UNotifyCode   =   pnmh-> code;

 if (idCtrl==IDC_TREE1 && UNotifyCode==NM_CLICK)
 {
        NotifyClick();
 }


 return CDialog::OnNotify(wParam, lParam, pResult);
}

 

 相关的处理都放在 NotifyClick函数中。

 

  void CSelDialog::NotifyClick(void)
{
 HTREEITEM   hClickItem;
 UINT   nFlags;

//首先获得光标的位置
 CPoint   curPoint;
 GetCursorPos(&curPoint);
 m_treeCtrl.ScreenToClient(&curPoint);

//然后调用CTreeCtrl的HitTest函数来返回点击的是那个ITEM结点。

 hClickItem=m_treeCtrl.HitTest(curPoint,&nFlags);

 //选中Check
 if   ((hClickItem) && (TVHT_ONITEM & nFlags) )
 {
  GetCheckChange(hClickItem,nFlags);
 }

 return;

}

 

 如果是点击了,那么调用GetCheckChange通知具体的ITEM结点。

 接下来就是处理具体的了。

 

     5.要让一个ITEM被选中,调用 SelectItem(hItem)

 

     6.要获得一个ITEM的字符串,调用 GetItemText(hItem)

 

     7.要获得一个ITEM前的Check BOx是否被选中,调用GetCheck,反正,

        调用SetCheck

   

     8.对树的遍历

         首先调用  ItemHasChildren(hitem)来判断是否有子树

         如果有就遍历。

         然后调用 GetChildItem  来获得第一个孩子的hitem,然后一个while循环

         在里面调用 GetNextSiblingItem获得下一个孩子结点。 同时递归当前孩子,

         如果当前孩子有孩子,那么递归。

         代码如下:

          if (m_treeCtrl.ItemHasChildren(treeitem))
 {
        parent_sel_item=treeitem;

  
  tempitem=m_treeCtrl.GetChildItem(treeitem);

  while (tempitem)
  {
   if (bCheck)
   {
               m_treeCtrl.SetCheck(tempitem,false);
   }
   else
   {
      m_treeCtrl.SetCheck(tempitem,true);
   }
   
   tempitem=m_treeCtrl.GetNextSiblingItem(tempitem);
  }
 }

 

    9.如何对树控件节点进行排序,用SortChildrenCB成员函数

     TVSORTCB  tvs;
    tvs.hParent=PartentItem;
    tvs.lParam=(LPARAM)&m_TreeChannel;
    tvs.lpfnCompare=lpfuc;
    BOOL  bRet=m_TreeChannel.SortChildrenCB(&tvs);

 

    其中 lpfuc是一个回调函数

    定义如下:

    typedef  int   (CALLBACK  * LPTREESORTFUC ) (LPARAM   lParam1,LPARAM   lParam2,  LPARAM   lParamSort );

 

   //回调函数
static int CALLBACK
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
  // lParamSort contains a pointer to the tree control.
  // The lParam of an item is just its handle.
  CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*) lParamSort;
  CString    strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
  CString    strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);

  return strcmp(strItem2, strItem1); 
}

 

  上面是微软的MSDN给出的回调函数的例子,其中lparam1,lparam2是你在SetItemData中设置的值,这里先前被设置的显然就是本节点的 HITREEITEM

 

  要决定排序的顺序,如果返回 《0,那么就将第一个结点排在前面,如果返回>0,那么就将前后两个结点元素颠倒过来,如果返回0,那么认为他们两个是相等的。

   

 

 

 

 

 

 

 

原创粉丝点击