MFC 树形控件的使用

1、树形控件的属性

TVS_EDITLABELS:允许用户进行节点文本的编辑

TVS_HASBUTTONS:节点左侧添加一个按钮

TVS_HASLINES:父节点与子结点出现连线

TVS_LINESATROOT:子节点与根节点之间出现连线

TVS_NOTOOLTIPS:结点无动态提示

TVS_SINGLEEXPAND:节点的选中(未选中)t7展开(合拢)同步

MFC中以两种形式封装树形控件,一种是树形控件CTreeCtrl,另一种是树形视图控件CTreeView。对于一般的要求,比如在对话框中,使用CTreeCtrl比较方便。在使用树形视图控件时,只需要利用成员函数取得其引用,就可以像树形控件一样方便的使用:

CTreeCtrl& GetTreeCtrl( ) const;

调用InsertItem函数能够将节点插入树形控件中,并返回插入的项的HTREEITEM。树形控件的插入工作往往是在对话框的OnInitDialog函数中进行,而对于树形视图控件,则是在OnInitUpdate函数中进行。

树形控件中的节点数据可以是文本,也可以是图像。节点中使用的图像是和树形控件的图像列表相对应的。在树形控件中使用图像列表是通过使用SetImageList函数来完成。

树形控件能产生通告消息,如:

TVN_BEGINDRAG开始拖拽

TVN_ITEMEXPANDED节点被展开或收缩

其消息映射使用WM_NOTIFI,如:

WM_NOTIFI(TVN_BEGINDRAG,IDC_TREECTRL,OnBeginDrag);

2、树形控件TVN_BEGINRDRAG消息的响应

与树形控件有关的、常用的结构是TVITEMTVINSERTSTRUCT 、NMTREEVIEW(NM_TREEVIEW )。前两个是用于插入节点时使用,而NMTREEVIEW是与树形控件的通告消息相关的结构。

当用鼠标左键拖拽树形控件时,控件会发出TVN_BEGINDRAG通告消息;当用鼠标右键拖拽时,则会发出TVN_BEGINRDRAG通告消息。拖拽树形控件时需要使用到IImageList::BeginDrag函数:

IImageList::BeginDrag creates a temporary image list that is used for dragging. In response to subsequent WM_MOUSEMOVE messages, you can move the drag image by using IImageList::DragMove. To end the drag operation, you can use IImageList::EndDrag. 

通常使用CTreeCtrl::CreateDragImage函数创建一个被拖拽节点的图像并返回一个CImageList指针(注意被拖拽的数据节点必须包含图像,否则返回的CImageList指针为空),然后利用该指针来调用CImageList::BeginDrag函数。除此之外还需要调用CImageList::DragEnter函数锁定、更新窗口,并在指定的位置显示被拖拽的图像:

static BOOL PASCAL DragEnter(

   CWnd* pWndLock,

   CPoint point 

);

If pWndLock is NULL, this function draws the image in the display context associated with the desktop window, and coordinates are relative to the upper left corner of the screen.

注意BeginDrag函数只是在拖拽开始时创建要拖拽的图像,而DragEnter函数则显示该图像。

最后调用CWnd::SetCapture函数使后续所有的鼠标输入都发送到当前的CWnd对象而不管鼠标的位置(因为CImageList::DragEnter函数的第一个参数为NULL时表示在与桌面窗口相关的窗口,可以说就是当前程序的框架窗口,但不包括其他应用程序的窗口上显示被拖拽的图像。因此要使得被拖拽的图像在所有的窗口上而不仅仅是应用程序的框架窗口上显示,就需要调用CWnd::SetCapture函数。一旦调用了SetCapture函数,则在当前应用程序的非框架窗口,包括系统菜单上的鼠标按键动作均被发送到当前CWnd 对象,直到调用ReleaseCapture为止)。

然后就是在鼠标移动的消息响应函数中调用CImageList::DragMove函数移动被拖拽的图像,使之与鼠标的移动位置同步。最后是调用CImageList::DragShowNolock函数隐藏或显示拖拽的图像,但它并不是必须的,也可以不调用,因此之前已经调用过CImageList::DragEnter函数显示拖拽的图像了。当传递true值显示拖拽的图像时,DragShowNolock在这个过程中不像DragEnter函数一样锁定窗口。

值得注意的是,在拖拽节点过程中可以使用CTreeCtrl::HitTest函数判断鼠标滑动过程中所经过的点是否位于树形控件的某一个节点之上,如果是,则返回该树形节点的HTREEITEM。此时可以使用CTreeCtrl::SelectDropTarget函数或CTreeCtrl::SelectItem函数来高亮显示该节点。

3、树形控件的成员函数

InsertItem函数插入一个节点,并返回新插入的节点的HTREEITEM。

ItemHasChildren函数根据给定的HTREEITEM判断该节点是否存在子节点。

GetChildItem函数根据给定的HTREEITEM获取该节点下子节点的HTREEITEM,如果没有子节点,则返回NULL

GetNextSiblingItem函数根据给定的HTREEITEM获取该节点的下一个同级节点。

EnsureVisible函数在必要的时候滚动视图列表控件使得其至少部分可见。需要注意的是,在使用TVE_COLLAPSE调用Expand收缩树形控件后不能再调用该函数,否则收缩操作将无效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值