zoukankan      html  css  js  c++  java
  • 【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 ;

    }

     

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

  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/xxt1991/p/3049327.html
Copyright © 2011-2022 走看看