zoukankan      html  css  js  c++  java
  • MFC中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法 拓荒者

        今日康复,感谢自己能有一个好身体!现在是2010-8-17 23:31:47,抬头看不见月亮,但风很爽,如果有月亮,应该能够算得上苏轼所说的“月白风清”了。如此良夜,又学会了两个控件的简单用法,心里很爽啊。

        首先是CImageList控件,用来保存一组相同大小的图标或位图,它没有图形显示界面,主要用途是为其它控件提供图形列表。可以通过索引访问图标或位图。CImageList常用的函数有:

    函数 说明
    Create 创建一个CImageList控件
    GetImageCount 获取图像的数目
    GetImageInfo 获取图像信息
    Add 添加图像到图像列表控件
    Remove 从列表中删除图像
    Replace 替换列表中指定的图像

    例如:

    CImageList m_imageList;

    //创建CImageList对象
    m_imageList.Create(16, 16, ILC_COLOR8, 0, 4);
    //加载图标
    m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));

        然后该CTreeCtrl了,这是一个树形列表控件,提供了分层级结构显示数据的功能。这个控件有可视化的界面,可以通过界面编辑器进行创建,只需要拉到界面上即可;同样也可以通过Create函数创建一个树形列表控件,由于这种方法通常不用,这里不再赘言。另外该控件还有很多树形,如Has Button、Has Line等,可以在界面编辑器的属性中查看并设置。

        树形控件有两个非常重要的数据结构:TV_ITEM和TV_INSERTSTRUCT。前者用来描述一个树节点的信息;后者描述要插入树时所需的信息。结构如下:

    typedef struct _TV_ITEM {
        UINT       mask;          //结构成员有效性屏蔽位
        HTREEITEM  hItem;          //数据项控制句柄
        UINT       state;         //数据项状态
        UINT       stateMask;     //状态有效性屏蔽位
        LPSTR      pszText;       //数据项名称字符串
        int        cchTextMax;    //数据项名称的最大长度
        int        iImage;       //数据项图标索引号
        int        iSelectedImage;    //选中数据项图标索引号
        int        cChildren;      //子项标识
        LPARAM     lParam;        //程序定义的32位数据TVIF_PARAM
    } TV_ITEM, FAR *LPTV_ITEM;

    typedef struct _TV_INSER    TSTRUCT
    {
        HTREEITEM hParent;         //父项控制句柄
        HTREEITEM hInsertAfter;    //插入树项的位置
        TV_ITEM   item;             //数据项的结构
    } TV_INSERTSTRUCT, FAR *LPTV_INSERTSTRUCT;

        使用CImageList可以方便的为CTreeCtrl提供图标。首先设置树形控件的图形列表:

    m_treeStruct.SetImageList(&m_imageList,TVSIL_NORMAL);

        然后在添加树形列表节点时可以设置节点的选中时图标索引和未选中时的图标索引。如果没有设置,则数据结构会默认为0。数据结构为上面的TV_ITEM。

        向树形控件中添加根节点

        添加根节点是比较麻烦的,具体代码如下:

    TVINSERTSTRUCT tvInsert;                        //定义一个插入结构
    HTREEITEM hParent;                                //用来保存插入的位置
    tvInsert.hParent = NULL;                        //设置父节点为空
    tvInsert.hInsertAfter = NULL;                    //设置之前的节点同样为空
    tvInsert.item.mask = TVIF_TEXT;                    //设置掩码
    tvInsert.item.pszText = _T("公司");                //要显示的文字为“公司”
    hParent = m_treeStruct.InsertItem(&tvInsert);    //插入树形结构中,并返回插入的位置

        有了父节点hParent ,再要插入子节点就方便了:

    //添加第一级项目"技术部"
    //参数列表:显示的文字、已选择的图标索引、未选择的图标索引、父节点的HTREEITEM值
    HTREEITEM h1 = m_treeStruct.InsertItem("技术部",1,2,hParent);

    //添加第一级项目"管理学院"下的子项目,即第二级
    m_treeStruct.InsertItem("ERP组",3,4,h1);
    m_treeStruct.InsertItem("UI组",3,4,h1);
    m_treeStruct.InsertItem("核心研发组",3,4,h1);

    //添加其他第一级项目
    m_treeStruct.InsertItem("销售部",1,2,hParent);

        展开树节点:

    //展开第一级项目
    m_treeStruct.Expand(hParent,TVE_EXPAND);

        向选中节点添加子节点:

    //获取树形控件选择的项目
    HTREEITEM hItem = m_treeStruct.GetSelectedItem();
    //获取选择项目的子项目图像的索引、子项目选择后的图像索引,
    //以便设置新添加的项目索引
    int index,selindex;
    m_treeStruct.GetItemImage(m_treeStruct.GetChildItem(hItem),index,selindex);
    //插入新的子项目到选择的项目下
    m_treeStruct.InsertItem(m_strItem,index,selindex,hItem);
    //展开选择的项目,以便查看新增加的子项
    m_treeStruct.Expand(hItem,TVE_EXPAND);

        删除选中节点:

    //获取树形控件选择的项目
    HTREEITEM hItem = m_treeStruct.GetSelectedItem();
    //删除选择的项目以及其下的所有子项
    m_treeStruct.DeleteItem(hItem);

    作者:独钓寒江
    来源:草屋&拾荒 - 独钓寒江的技术博客
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    2021年9月 北京、西安两地,高薪诚聘 .NET工程师,请私信联系!
    如果认为此文对您有帮助,别忘了支持一下哦!
    声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。
  • 相关阅读:
    HDU1814 Peaceful Commission
    POJ1679 The Unique MST
    POJ 3243 Clever Y
    POJ 3463 Sightseeing
    POJ1274 The Perfect Stall
    POJ 2417 Discrete Logging
    POJ1011 Sticks
    前端面试资源整理(一)
    小程序和腾讯地图联合使用
    快速创建 HTML5 Canvas 电信网络拓扑图
  • 原文地址:https://www.cnblogs.com/youring2/p/1801946.html
Copyright © 2011-2022 走看看