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);
    
  • 相关阅读:
    对MVC模型的自悟,详尽解释,为了更多非计算机人员可以理解
    openSUSE leap 42.3 实现有线 无线同时用
    Fedora27 源配置
    Ubuntu16.04添加HP Laserjet Pro M128fn打印机和驱动
    openSUSE leap 42.3 添加HP Laserjet Pro M128fn打印机和驱动
    OpenSUSE Leap 42.3下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    OpenSUSE Leap 42.3 安装java(Oracle jre)
    linux下支持托盘的邮件客户端Sylpheed
    Ubuntu下通过Firefox Opera Chromium浏览器直接执行java应用程序(打开java jnlp文件)实现在服务器远程虚拟控制台完成远程管理的方法
    Firefox 浏览器添加Linux jre插件
  • 原文地址:https://www.cnblogs.com/echobiscuit/p/12714575.html
Copyright © 2011-2022 走看看