【List Control】基本用法

一、属性

如图所示就是树形控件了,这个没什么好说的。

下来是一些常用的属性:

1.想要编辑树节点的文本内容,需要Edit Labels。

2.显示的风格,扩展线之类的,Has Lins等。

3.数据太多需要滚动,找Scroll。

二、控件变量&初始化:

 DDX_Control(pDX,IDC_TEXT_GROUP_TREE,m_ctr_tree);

CTreeCtrl         m_ctr_tree;

1.初始化(这里写在page,只看用法就行无所谓的)

BOOL CXXXPage::OnInitDialog()
{
   CPropertyPage::OnInitDialog();

   HTREEITEM hRoot;     //根节点  

   HTREEITEM hCataItem; //分类节点   

  for(int i = 0 ; i < 3; i++)  

  {

      CString _str_root;//根节点名称   

      _str_root.Format(_T("我是根节点%d"),i);   

      hRoot = m_ctr_tree.InsertItem(_str_root.GetString());  //以此插入根节点(BTW:这里有CString->std:wstring的转换)

         m_ctr_tree.SetItemData(hRoot,i);  //设置一个整数,可以理解成结点的ID (用来查找什么的)

            for (int j = 0; j < 4; j++)

       {    

      CString _text;    

      _text.Format(L"小分队%d",j+1);  

       hCataItem = m_ctr_tree.InsertItem((_text),1,1,hRoot,TVI_LAST);  //依次添加子节点,到对应的根节点上

         m_ctr_tree.SetItemData(hCataItem,10000+ j+1);  //设置一个整数,可以理解成结点的ID  (用来查找什么的)

     }

   }

   UpdateData(FALSE); 
   return TRUE;

}

运行结果如下:

2.一个获取结点ID的函数,返回是否为根节点。

bool CXXXPage::get_cur_id(int& _root_id,int& _son_id)
{
   HTREEITEM hItem = m_ctr_tree.GetSelectedItem();  //得到当前选中的结点
   int  id = m_ctr_tree.GetItemData(hItem);  //当前结点的id
   if (id < 10000 && id >= 0 )  //根据竖直判断是根节点还是子节点
   {
      _root_id = id;
      return true;
   }
   else
   {
      HTREEITEM patrnt = m_ctr_tree.GetParentItem(hItem); //如果当前id>10000,那么就是刚才添加的子节点。可以获取根节点
      _root_id = m_ctr_tree.GetItemData(patrnt);  //得到它的根节点ID
      _son_id = id;  
      return false;
   }
   return true;
}

三、消息响应

 选择不同行的响应消息:

void CXXXPage::OnTvnSelchangedLineGroupTree(NMHDR *pNMHDR, LRESULT *pResult)

{

    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);  

   *pResult = 0;

   int  _root_id = -1;  //结点的id

   int  _son_id = -1;   

   bool _is_root = get_cur_id(_root_id,_son_id);

   UpdateData(TRUE);  //得到控件的值

   HTREEITEM hItem = m_ctr_tree.GetSelectedItem();  //当前选择的结点

   CString strText;  

   strText = m_ctr_tree.GetItemText(hItem);//当前选择的结点上的内容

   if (_is_root)  //如果是根节点,作相应操作……

  {   

    SetDlgItemText(IDC_EDIT_ROOT_NAME, strText); //将根节点的内容显示到Edit控件上   

    SetDlgItemText(IDC_EDIT_SON_NAME, _T(""));  //显示子节点的Edit控件,字符串为空

  }  

  else  

  {   

    //当前选择的是子节点,也可以自由发挥……

    }

这个消息是用来编辑结点内容的:

void CXXXPage::OnTvnEndlabeleditLineGroupTree(NMHDR *pNMHDR, LRESULT *pResult)

{  

  LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);

    UpdateData(TRUE); //获取当前空间的值

   if (TVIF_TEXT & pTVDispInfo->item.mask)  //这一句决定了消息是否正确。切换一行有三种状态,这里可以仔细研究下。否则会执行三次!

  {  

     int  i = m_ctr_tree.GetItemData(pTVDispInfo->item.hItem);  //获取当前的结点id

    if (i < 10000 && i >= 0 )  //根节点   

    {  

         m_ctr_tree.SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);//将新名字设置到树上    

       //其它操作……

    }

     (i >= 10000) ? *pResult = 0 : *pResult = 1;  //如果是子节点则不允许修改名称  (*pResult 的值决定是否能够修改结点的内容,0是不可以修改)

  }  

  *pResult = 0 ;

}

 

 

这些都是简单的用法, 基本的都够用啦!

 

 

 

 

 

 

 

 

posted @ 2013-04-28 15:03  醪糟汤圆  Views(280)  Comments(0Edit  收藏  举报