MFC控件之TreeCtrl

当无法可视化设置控件属性的时候,需要手动对控件属性进行设置。此时需要对控件属性十分了解。在此看一下TreeCtrl控件的属性设置。

一、TreeCtrl
不管是作用TreeCtrl控件还是ListCtrl控件,都得用到几个结构体,如果对这些结构体不了解,那在使用控件时就糊理糊涂的,胡乱修改结构体的值,设置不出想要的结果,也不知改哪里,结果出来了也不知怎么出来的。所以必须对我们所要认知的东西十分的了解方可。
使用TreeCtrl控件需要掌握两个重要的结构体TVITEM、TVINSERTSTRUCT。掌握之后控制TreeCtrl就基本不成问题了。

1.TVITEM结构体
该结构体是用来设置节点信息的,比如节点的名称、节点名称占用的长度、指定能使用的结构体成员以及节点状态等信息。先来看看TVITEM结构体的定义:
typedef struct tagTVITEM {
    UINT mask;
    HTREEITEM hItem;
    UINT state;
    UINT stateMask;
    LPTSTR pszText;
    int cchTextMax;
    int iImage;
    int iSelectedImage;
    int cChildren;
    LPARAM lParam;
} TVITEM, *LPTVITEM;

mask 

是指定能使用的结构体成员,比如将mask的值设置为“TVIF_TEXT | TVIF_STATE”,那么就只能使用TVITEM结构体中的pszText和state成员,当然,mask成员无论在什么时候都是可用的。

hItem

选择该节点的句柄,搞了半天才明白这个成员的作用,既然是句柄,那就得先获取句柄,然后才能使用句柄。在TreeView创建第一个节点时,是不用设置这个成员的。有了第一个节点后,可以通过多种途径来获取一个节点的句柄,如TreeView_InsertItem函数、TreeView_GetNextItem函数、TreeView_GetParnt函数等,都可以获取节点的句柄,获取节点的句柄后,就可以对该节点进行控制了。

state

这个是用来设置节点状态的,这个成员的设置貌似挺复杂的,一个节点到底有多少种状态,没搞清。好像应该大概可能是16种状态。好好的研究了一下,发现state成员是一个UINT类型,也就是unsigned int数据类型,是16位的,也就是说每1位是一种状态,刚好有16种状态。0-7位是普通节点的状态,8-11是覆盖图像索引,啥意思?没看懂!12-15位是图像索引,我估摸着,8-11和12-15应该是节点图片的几种状态,操,转了一圈又转回去了。到是0-7位的节点状态比较好理解,整理如下:

TVIS_BOLD  -节点名称加粗
TVIS_CUT - 将选择的节点作为复制和粘贴的目标
TVIS_DROPHILITED  - 将选择的节点作为拖拽目标,用于拖动节点的
TVIS_EXPANDED - 展开该节点下的子节点
TVIS_EXPANDEDONCE -搞不懂??????
TVIS_EXPANDPARTIAL  -展开部分节点
TVIS_SELECTED -节点处于选择状态

TVIS_OVERLAYMASK  -覆盖图像索引的掩码,不太懂
TVIS_STATEIMAGEMASK -图像索引掩码,还是不太懂
TVIS_USERMASK -同TVIS_STATEIMAGEMASK
这数来数去,怎么只有10种状态,还有6种呢?

stateMask

stateMask的作用类似于mask,是用于指定有效的节点状态,例如要使用TVIS_BOLD和TVIS_EXPANDED两种状态,就必须在stateMask中指定这两种状态,也就是说state和stateMask中的设置得一样。

pszText 节点名称。

cchTextMax 节点名称长度。

iImage 节点在非选中状态下的图像索引,好像是通过IMAGELIST来建立图像索引。

iSelectedImage 节点在选中状态下的图像索引

表示树控件项是否有相关的子结点的标志位。此成员可以是以下值之一:
0 —— 表示此项没有子结点。
1 —— 表示此此项有一个或多个子结点。
I_CHILDRENCALLBACK —— 父窗口会始终跟踪确定此项是否有子结点。此时,如果树控件需要显示项时,它会给父窗口发送TVN_GETDISPINFO通知消息,决定此项是否有子结点。如果树控件含有TVS_HASBUTTONS风格,则它使用此成员来决定是否显示按钮以表明存在子结点。也可以使用此成员来强制树控件显示按钮,尽管没有在此项之下插入任何子结点。这样可以最小化由于在此项之下插入了子结点所占用的控件内存。

lParam 同控件相关的32位值。是些啥值?不知道
到此虽然对TVITEM结构还有些不清不楚,但对于一般的节点控制应该没啥问题了。


2.TVINSERTSTRUCT结构体


TVITEM结构体是对单个的、独立的节点信息进行设置,而TVINSERTSTRUCT则是对要添加节点的所有属性进行设置,也包括TVITEM结构体,比如节点添加到TreeView的哪个位置、以及父节点的句柄,其结构体的定义中下:


typedef struct tagTVINSERTSTRUCT {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEX itemex;
        TVITEM item;
    } DUMMYUNIONNAME;
#else
    TVITEM item;
#endif
} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
一共个四个成员


hParent


父节点句柄


hInsertAfter


在哪个节点前插入


item


一个TVITEM结构体


以上这两个结构体,除了TVITEM中的少数几个成员的作用还弄不清外,其余的都了解个七七八八了。熟悉的是TreeView控件。

一、TreeView

不管是作用TreeView控件还是ListView控件,都得用到几个结构体,如果对这些结构体不了解,那在使用控件时就糊理糊涂的,胡乱修改结构体的值,设置不出想要的结果,也不知改哪里,结果出来了也不知怎么出来的。不知为什么,今晚状态特别好,心很静,前几天熟悉控件的使用时,直接从MSDN上把代码复制下来,也没心思去读代码,搞了半天也显示不出想要的结果,有句话说得很对,心态决定成败。

使用TreeView控件会用到TVITEM、TVINSERTSTRUCT二个结构体,熟悉了这二个结构体,控制TreeView就基本不成问题了。

1.TVITEM结构体

该结构体是用来设置节点信息的,比如节点的名称、节点名称占用的长度、指定能使用的结构体成员以及节点状态等信息。先来看看TVITEM结构体的定义:

typedef struct tagTVITEM {
    UINT mask;
    HTREEITEM hItem;
    UINT state;
    UINT stateMask;
    LPTSTR pszText;
    int cchTextMax;
    int iImage;
    int iSelectedImage;
    int cChildren;
    LPARAM lParam;
} TVITEM, *LPTVITEM;

mask 

是指定能使用的结构体成员,比如将mask的值设置为“TVIF_TEXT | TVIF_STATE”,那么就只能使用TVITEM结构体中的pszText和state成员,当然,mask成员无论在什么时候都是可用的。

hItem

选择该节点的句柄,搞了半天才明白这个成员的作用,既然是句柄,那就得先获取句柄,然后才能使用句柄。在TreeView创建第一个节点时,是不用设置这个成员的。有了第一个节点后,可以通过多种途径来获取一个节点的句柄,如TreeView_InsertItem函数、TreeView_GetNextItem函数、TreeView_GetParnt函数等,都可以获取节点的句柄,获取节点的句柄后,就可以对该节点进行控制了。

state

这个是用来设置节点状态的,这个成员的设置貌似挺复杂的,一个节点到底有多少种状态,没搞清。好像应该大概可能是16种状态。好好的研究了一下,发现state成员是一个UINT类型,也就是unsigned int数据类型,是16位的,也就是说每1位是一种状态,刚好有16种状态。0-7位是普通节点的状态,8-11是覆盖图像索引,啥意思?没看懂!12-15位是图像索引,我估摸着,8-11和12-15应该是节点图片的几种状态,操,转了一圈又转回去了。到是0-7位的节点状态比较好理解,整理如下:

TVIS_BOLD  -节点名称加粗

TVIS_CUT - 将选择的节点作为复制和粘贴的目标

TVIS_DROPHILITED  - 将选择的节点作为拖拽目标,用于拖动节点的

TVIS_EXPANDED - 展开该节点下的子节点

TVIS_EXPANDEDONCE -搞不懂??????

TVIS_EXPANDPARTIAL  -展开部分节点

TVIS_SELECTED -节点处于选择状态

 

还有三个

TVIS_OVERLAYMASK  -覆盖图像索引的掩码,不太懂

TVIS_STATEIMAGEMASK -图像索引掩码,还是不太懂

TVIS_USERMASK -同TVIS_STATEIMAGEMASK

这数来数去,怎么只有10种状态,还有6种呢?

stateMask

stateMask的作用类似于mask,是用于指定有效的节点状态,例如要使用TVIS_BOLD和TVIS_EXPANDED两种状态,就必须在stateMask中指定这两种状态,也就是说state和stateMask中的设置得一样。

pszText

节点名称。

cchTextMax

节点名称长度。

iImage

节点在非选中状态下的图像索引,好像是通过IMAGELIST来建立图像索引。

iSelectedImage

节点在选中状态下的图像索引

表示树控件项是否有相关的子结点的标志位。此成员可以是以下值之一:
0 —— 表示此项没有子结点。
1 —— 表示此此项有一个或多个子结点。
I_CHILDRENCALLBACK —— 父窗口会始终跟踪确定此项是否有子结点。此时,如果树控件需要显示项时,它会给父窗口发送TVN_GETDISPINFO通知消息,决定此项是否有子结点。如果树控件含有TVS_HASBUTTONS风格,则它使用此成员来决定是否显示按钮以表明存在子结点。也可以使用此成员来强制树控件显示按钮,尽管没有在此项之下插入任何子结点。这样可以最小化由于在此项之下插入了子结点所占用的控件内存。

lParam

同控件相关的32位值。是些啥值?不知道

到此虽然对TVITEM结构还有些不清不楚,但对于一般的节点控制应该没啥问题了。

2.TVINSERTSTRUCT结构体

TVITEM结构体是对单个的、独立的节点信息进行设置,而TVINSERTSTRUCT则是对要添加节点的所有属性进行设置,也包括TVITEM结构体,比如节点添加到TreeView的哪个位置、以及父节点的句柄,其结构体的定义中下:

typedef struct tagTVINSERTSTRUCT {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEX itemex;
        TVITEM item;
    } DUMMYUNIONNAME;
#else
    TVITEM item;
#endif
} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
一共个四个成员

hParent

父节点句柄

hInsertAfter

在哪个节点前插入

item

一个TVITEM结构体

以上这两个结构体,除了TVITEM中的少数几个成员的作用还弄不清外,其余的都了解个七七八八了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值