CTreeCtrl第二课

    在对CTreeCtrl的Style有所了解后,本来想睡了。还没睡意,就顺便在继续下一课吧。可能是坏习惯吧。

    创建好一个树形窗口后,就是要向里面添加项了,也是树控件存在的意义了。

    很简单一个函数即可完成InsertItem。可是其参数却不少,有些参数初一看都不知道怎么填,反正我开始使用的时候直接是这样的:

    HTREEITEM hItem = m_TreeCtrl.InsertItem("ItemText");反正我又没有什么特殊的功能,得过且过也能勉强过得去吧。但有时真的看上去很不舒服。那就不得不了解InsertItem函数到底是咋回事了。其实,该函数虽然看上去有很多个不同的实现版本,参数也是参差不齐的,但他们最终却都是一个目的。就是对一个结构体的填充,只不过是在某些情况下,某些成员是不需要的,没用的或是已经给了默认值了的。也就形成了函数有多个实现版本了。那该结构是如何的呢。对所有的CTreeCtrl的InsertItem进行追踪,发现其中有一个InsertItem函数HTREEITEM CTreeCtrl::InsertItem(LPTVINSERTSTRUCT lpInsertStruct),其内部调用主要语句为

(HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); 可以看出TVM_INSERTITEM即是向树中发送了一个插入项的消息,而LPARAM参数即是该树的参数。可以想到,所有的插入函数最终都殊途同归地来到这。那这个参数要该怎样填充呢。看看该参数的结构定义如下:
typedef struct tagTVINSERTSTRUCTA {
    HTREEITEM hParent;
    HTREEITEM hInsertAfter;
#if (_WIN32_IE >= 0x0400)
    union
    {
        TVITEMEXA itemex;
        TV_ITEMA  item;
    } DUMMYUNIONNAME;
#else
    TV_ITEMA item;
#endif
} TVINSERTSTRUCTA, FAR *LPTVINSERTSTRUCTA;

hParent
Handle to the parent item. If this member is the TVI_ROOT value or NULL, the item is inserted at the root of the tree view control.
父项的句柄,如果这个成员是TVI_ROOT或NULL的话,那么这个项被插入到树形控件的根部。
hInsertAfter
Handle to the item after which the new item is to be inserted, or one of the following values:
插入新项之后项的句柄,可以取以下值:
ValueDescription
TVI_FIRST

Inserts the item at the beginning of the list.

在列表的开始插入项

TVI_LAST

Inserts the item at the end of the list.

在列表的末尾插入项

TVI_ROOT

Add the item as a root item.

增加一个项到根部

TVI_SORTInserts the item into the list in alphabetical order.
按字母顺序排列插入项。
itemex
Version 4.71 . TVITEMEX structure that contains information about the item to add.
包含关于项添加的信息
item
TVITEM structure that contains information about the item to add.
包含关于项添加的信息。
可以看出,对于hParent和hInsertAfter两个参数,分配指定的是项与其他项之间的关系,如有没有父项,有父项句柄是多少,该项的位置在哪里啊等等。而添加一个项,除了指定与其他项的关系外,少不了的是自身信息了。如,自己的名字是什么总要有个记载吧。那就是itemex或在item的事了,具体是那一个就要看SDK版本了。两个结构罗列如下:
typedef struct tagTVITEM{
    UINT      mask;
    HTREEITEM hItem;
    UINT      state;
    UINT      stateMask;
    LPTSTR    pszText;
    int       cchTextMax;
    int       iImage;
    int       iSelectedImage;
    int       cChildren;
    LPARAM    lParam;
} TVITEM, FAR *LPTVITEM;

typedef struct tagTVITEMEX{
    UINT      mask;
    HTREEITEM hItem;
    UINT      state;
    UINT      stateMask;
    LPTSTR    pszText;
    int       cchTextMax;
    int       iImage;
    int       iSelectedImage;
    int       cChildren;
    LPARAM    lParam;
    int       iIntegral;
} TVITEMEX, FAR *LPTVITEMEX;
两个结构之间好像只是TVITEMEX多了最后一个成员iIntegral。那再次就先拿该成员来开刀了,免得心里总是想着为什么呢?下面是MSDN的解释:
iIntegral
Height of the item. This height is in increments of the standard item height (see TVM_SETITEMHEIGHT ). By default, each item gets one increment of item height. Setting this member to 2 will give the item twice the standard height; setting this member to 3 will give the item three times the standard height; and so on. The tree view control does not draw in this extra area. This extra space can be used by the application for drawing when using custom draw .
iIntegral是项的高度。这个高度是标准项高度的增幅。看TVM_SETITEMHEIGHT设置项高。默认情况下,每个项是标准项高的一倍。如果设置该成员为2,将给该项2倍的标准高度,设置为3将是3被高度。该树形控件不绘制在这个额外的区域,额外的空间不使用当应用程序在使用custom_draw时进行自会使用。
对于TVITEMEX和TVITEM结构相同的成员,明天再说了。困了啊
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值