zoukankan      html  css  js  c++  java
  • MFC之树控件

    初始操作

    新建MFC应用程序,项目名为TreeCtrl,同样基于对话框。

    删除原有控件在右侧工具箱中找到Tree Control。放置到窗口中。如图:

    右键属性,找到Has Lines,改为True。则原来的节点和叶之间会出现虚线相连。如图:

    同样属性中,找到Has Buttons,改为True,则会出现加号按钮,具体看图:

    找到Lines At Root,改为True,则根节点会出现虚线相连,如图:

    控件中右键,选择添加变量,访问方式:private,变量名:n_tree。

    定位到:类视图--CTreeCtrlDlg--OnInitDialg()中,在其中添加代码。

    添加图片资源

    将图片保存到所在项目res文件夹下:

    在资源视图中找到icon,右键添加资源,点击导入,即可添加想要的图片:

    添加四张图片后:

    CImageList::Create()函数

    BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
    BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );
    BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREFcrMask );
    BOOL Create( CImageList& ImageList1, int nImage1, CImageList& ImageList2, int nImage2, int dx, int dy );

    返回值:如果成功,则返回非零值,否则为0。

    参数:
    cx 每个图象的尺寸,以像素为单位。
    cy 每个图象的尺寸,以像素为单位。
    nFlags 确定创建的图象列表类型。此参数可能为以下值的组合,但只能有一个ILC_COLOR值

    值 含义
    ILC_COLOR 如果没有其它ILC_COLOR* 标记被确定,则使用缺省行为。典型地,缺省为ILC_COLOR4;但对于旧的显示驱动程序,缺省为ILC_COLORDDB
    ILC_COLOR4 使用4位(16色)设备独立位图(DIB)部分作为图象列表的位图
    ILC_COLOR8 使用8位DIB部分。彩色表格使用的颜色与半色调调色板的一样
    ILC_COLOR16 使用16位(32/64K色)DIB部分
    ILC_COLOR24 使用24位DIB部分
    ILC_COLOR32 使用32位DIB部分
    ILC_COLORDDB 使用设备独立位图
    ILC_MASK 使用掩码。图象列表包含两个位图,其中一个是用做掩码的位图。如果不包括此值,图象列表只包含一个位图

    nInitial 图象列表最初包含的图象数。
    nGrow 当系统需要改变列表为新图象准备空间时,图象列表可生成的图象数。此参数替代改变的图象列表所能包含的新图象数。
    nBitmapID 与图象列表联系的位图的源ID。
    crMask 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色,掩码中相应位设置为1。
    lpszBitmapID 包含图象的源ID的字符串。
    ImageList1 CImageList对象的参考。
    nImage1 第一个存在的图象的索引。
    ImageList2 CImageList对象的参考。
    nImage2 第二个存在的图象的索引。
    dx 每个图象的尺寸,用像素表示。
    dy 每个图象的尺寸,用像素表示。

    说明:
    需要两步构造一个CImageList。首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。

    CTreeCtrl::SetImageList()函数

    CImageList* SetImageList( CImageList* pImageList, int nImageListType );

    返回值:
    返回指向先前的图像列表的指针(如果有);否则返回NULL。

    参数:
    pImageList 指向要被分配的图像列表的指针。如果pImageList是NULL,则从tree view控件中删除所有的图像。
    nImageListType 要设置的图像列表的类型。图像列表可以是下列值之一:
    · TVSIL_NORMAL 获取常规的图像列表,它包含了该tree view项的被选择的和不被选择的图像。
    · TVSIL_STATE 获取状态图像列表,它包含了处于用户定义状态的treeview项的图像。

    说明:
    此成员函数用来设置一个tree view控件的常规或状态图像列表,并使用新的图像来重画该tree view项的图像。

    CTreeCtrl::InsertItem()函数

    HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
    HTREEITEM InsertItem( UINT nMask,
    LPCTSTR lpszItem,
    int nImage,
    int nSelectedImage,
    UINT nState,
    UINT nStateMask,
    LPARAM lParam,
    HTREEITEM hParent,
    HTREEITEM hInsertAfter
    );

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

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

    返回值:如果成功则返回新项的句柄;否则返回NULL。

    参数: lpInsertStruct 一个指向用来指定要插入的tree view项的属性的TVINSERTSTRUCT的指针。
    nMask 用来指定要设置的属性的整数。
    lpszItem 一个包含项的文本的字符串的地址。
    nImage 项的图像在tree view控件的图像列表中的索引。
    nSelectedImage 项的被选择图像在tree view控件的图像列表中的索引。
    nState 为项的状态指定的值。
    nStateMask 指定要设置的状态。
    lParam 与此项关联的一个32位的应用程序指定的值。
    hParent 要被插入的项的父项的句柄。
    hInsertAfter 新项要被插入其后的项的句柄。

    说明:
    此成员函数用来在一个tree view控件中插入一个新项。

    添加代码

    初始化函数中添加代码

    //1.设置图标
    
    //准备HICON图标
    HICON icons[4];
    icons[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
    icons[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
    icons[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
    icons[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
    	
    CImageList list;
    
    //创建图片集合
    list.Create(30, 30, ILC_COLOR32, 4, 4);
    
    //添加具体图片
    for(int i = 0; i < 4; i++)
    {
    	list.Add(icons[i]);
    }
    
    n_tree.SetImageList(&list, TVSIL_NORMAL);
    
    //2.设置节点
    //                           参数: 1.节点名称 2.默认显示节点的索引 3.被选择图像的索引 4.此节点的父节点
    HTREEITEM root = n_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
    HTREEITEM parent = n_tree.InsertItem(TEXT("父节点"), 1, 1, root);
    HTREEITEM sub1 = n_tree.InsertItem(TEXT("子节点1"), 2, 2, parent);
    HTREEITEM sub2 = n_tree.InsertItem(TEXT("子节点2"), 3, 3, parent);
    

    执行结果:

    此时添加的图片并未显示出来。

    完善已添加代码

    上面代码中函数执行完,才去找图片资源,而CImageList list保存在栈中,图片资源后面会被释放掉,必须保存这个集合,写到.h中成为成员属性。所以先注释掉这行。

    双击dlg定位到.h文件中。在private中添加CImageList list; 如图所示:

    此时执行,结果如下图,图片显示成功:

    其他一些API以及作用

    1.设置默认选项

    n_tree.SelectItem(sub1);
    

    设置后运行程序,直接定位在子节点1上。

    2.不同节点切换时,触发事件。
    回到界面视图中(即Dialog中),右键属性,选择控件事件(图标中闪电状)

    然后在其中添加想要触发的东西

    //切换时,打印当前项内容(切换后的内容)
    
    //获取当前项
    HTREEITEM item = n_tree.GetSelectedItem();
    
    CString name = n_tree.GetItemText(item);
    
    MessageBox(name);                     //弹出内容
    

    执行后成功显示。

    注意执行的时候,会直接先弹出节点1,因为之前的代码有设置节点1为默认项。相应代码如下:

    //设置默认选项
    n_tree.SelectItem(sub1);
    
  • 相关阅读:
    [bzoj2038] [2009国家集训队]小Z的袜子
    浅谈莫队
    [bzoj2754] [SCOI2012]喵星球上的点名
    [bzoj3676] [APIO2014]回文串
    [bzoj5472] 数列
    [bzoj5457] 城市
    [bzoj1023] [SHOI2008]cactus仙人掌图
    [bzoj2125] 最短路
    [bzoj5473] 仙人掌
    读《深入理解Elasticsearch》点滴-查询评分
  • 原文地址:https://www.cnblogs.com/echobiscuit/p/12714575.html
Copyright © 2011-2022 走看看