走出憧憬的专栏

开开心心学习,快快乐乐工作!从底层出发,一起东西都裸露无疑。

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_SORT Inserts 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结构相同的成员,明天再说了。困了啊
阅读更多
个人分类: CTreeCtrl
想对作者说点什么? 我来说一句

VS2008 MFC下支持拖拽的CtreeCtrl控件

2014年07月30日 16.97MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭