zoukankan      html  css  js  c++  java
  • Visual studio C++ MFC之树形控件Tree Control

    背景

    本篇旨在MSDN帮助文档下总结树形控件Tree Control的使用,并列出碰到的具体问题。

    正文

    树形控件Tree Control的类则是CTreeCtrl,具体成员对象详见链接,以下则描述一些典型应用。

    1. 树形控件的创建
      当然,所有控件均有两种实现方式,一是在对话框模版中直接将控件Tree Control拖入对应的窗口上,另一种则是通过CtreeCtrl内的成员函数Creat(..)来创建。本文章不想过于繁琐,因此只记录前者。当然也可以根据Creat(...)函数的参数来创建,详见第三部分的关于鸡啄米博客的参考链接。
      为了能对添加的树形控件进行操作,因此需要在对应的属性控件添加变量——在对应的窗口的树形控件右击选择添加变量,取一个变量名,此处为m_DevlistTree,至此则由VS自动创建了该控件的控制变量m_DevlistTree

    2. 在树形控件上添加元素
      调用函数CTreeCtrl::InsertItem(...),此函数有如下几个函数原型;

    HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct);
    

    此函数根据结构体LPTVINSERTSTRUCT来添加属性控件元素,结构体如下:

    typedef struct {
    //插入对应节点下,为TVI_ROOT value 或者 NULL则表示插入的在根节点下。
        HTREEITEM hParent;
    /*定义按照何种顺序插入属性控件。
    TVI_FIRST:在节点下最开头插入元素
    TVI_LAST:在节点下最末尾插入元素(当节点下元素特别多的情况下,使用该属性,在添加过程中会导致整个APP卡在此处,直至添加完毕。)
    TVI_ROOT:在根节点插入元素
    TVI_SORT:按照元素的首字母来排序插入元素
    */
        HTREEITEM hInsertAfter;
    /*
    该Item结构体描述了插入的元素的属性。
    */
        TVITEM    item;
    #endif 
    } TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
    

    按照Item结构体元素定义的属性来插入元素,如下:

    // 本次未使用该函数,待使用的时候再来做详细解释。
    HTREEITEM InsertItem(
        UINT nMask,  
        LPCTSTR lpszItem, 
        int nImage,  
        int nSelectedImage,  
        UINT nState,  
        UINT nStateMask,  
        LPARAM lParam,  
        HTREEITEM hParent,  
        HTREEITEM hInsertAfter);
    

    以下函数很好理解,在根节点的尾部插入文本地址为lpszItem的元素:

    HTREEITEM InsertItem(
        LPCTSTR lpszItem,  
        HTREEITEM hParent = TVI_ROOT,  
        HTREEITEM hInsertAfter = TVI_LAST);
    

    这个函数,则同样是在根节点的尾部插入文本地址为lpseItem的元素,不同的是,指定了元素图片索引以及元素被选中后的图片索引。

    HTREEITEM InsertItem(
        LPCTSTR lpszItem,  
        int nImage,  
        int nSelectedImage,  
        HTREEITEM hParent = TVI_ROOT,  
        HTREEITEM hInsertAfter = TVI_LAST);
    

    图片的索引操作如下:

    // 图标句柄数组  
    HICON hIcon[3];      
    // 加载三个图标,并将它们的句柄保存到数组 
    // 此三个图标为加载进的ICON资源文件
    hIcon[0] = theApp.LoadIcon(IDI_ICON0);   
    hIcon[1] = theApp.LoadIcon(IDI_ICON1);   
    hIcon[2] = theApp.LoadIcon(IDI_ICON2);
    // 创建图像序列CImageList对象   
    m_imageList.Create(32, 32, ILC_COLOR32, 3, 3);   
    // 将三个图标添加到图像序列   
    for (int i=0; i<3; i++)   
    {   
        m_imageList.Add(hIcon[i]);   
    }   
    // 为树形控件设置图像序列   
    m_webTree.SetImageList(&m_imageList, TVSIL_NORMAL);  
    // 至此,0代表IDI_ICON0    1代表IDI_ICON1    2代表IDI_ICON2
    // 传入对应的值既可以使对应的元素图标覆盖为对应的图标。
    
    1. 将树形控件折叠或者展开:
      调用函数Expand(..)可实现,函数如下:
    BOOL Expand(
    HTREEITEM hItem,  
    UINT nCode );
    /*
    hItem: 要操作的Item
    nCode: 要执行的操作:
    *TVE_COLLAPSE:折叠 
    *TVE_COLLAPSERESET:折叠并移除所有的该节点下的子节点,必须配合TVE_COLLAPSE使用 
    *TVE_EXPAND 展开元素
    *TVE_TOGGLE 当前为折叠则展开,当前为展开则折叠。
    */
    
    1. 获取树形控件的焦点Item
      在树形控件右击选择添加事件处理程序,消息类型选择TVN_SELCHANGED,类列表的类选择对应窗口的类,本初的类为CMenueditortestDlg,最后点击添加编辑,生成的代码如下:
    void CMenueditortestDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    		*pResult = 0;
    	// TODO: 在此添加控件通知处理程序代码
    	*pResult = 0;
    
    	HTREEITEM hItem = m_DevlistTree.GetSelectedItem();    // 获取点击的焦点Item
    	m_DevlistTree.Expand(hItem, TVE_EXPAND);    // 将焦点Item展开
    }
    

    以上事件如宏TVN_SELCHANGED(select changed)所描述的一样,当焦点由一个Item换为另外一个Item时,就会进入该处理函数,此处函数内执行的代码的效果既是,鼠标单击到某个Item,对应的Item会被展开。

    参考链接

    MSDN关于CTreeCtrl的帮助文档。;
    鸡啄米的博客VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)详细叙述了该控件的使用。

    至此记录完毕。

    记录时间:2017-2-15
    记录地点:深圳WZ

  • 相关阅读:
    输入adb shell 时 提示error: more than one device and emulator
    增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
    Android音乐编程:管理音频焦点
    Android MediaScanner 详尽分析
    MediaScanner与音乐信息扫描==
    Vold工作流程分析学习
    [LeetCode] Majority Element II
    Android 四大组件学习之ContentProvider五
    HDU 1171 Big Event in HDU(01背包)
    Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
  • 原文地址:https://www.cnblogs.com/ChYQ/p/6401519.html
Copyright © 2011-2022 走看看