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消息的响应

与树形控件有关的、常用的结构是TVITEM、TVINSERTSTRUCT 、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收缩树形控件后不能再调用该函数,否则收缩操作将无效。

MFC 树形控件的使用相关推荐

  1. CATIA二次开发CAA实现MFC树形控件的方法研究

    CATIA使用CAA二次开发的时候,如果需要对树形数据对象实现管理,使用树形控件是非常好的选择.但是,CAA本身提供的控件较少,多数情况无法较好地满足项目要求,如果你的水平足够高,也可以使用CATNa ...

  2. VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

    前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统中是很常见的,例如资源管理器左侧的 ...

  3. 我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放

    大约1个半月前,发布了自己写的HEVC码流分析工具.当时的版本显示语法元素使用是的Edit控件.很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法 ...

  4. KFC宅急送点餐系统开发 MFC动态树形控件使用

    本文写于该系统开发完成后的第二年,那时候博主大2,有一门名为<程序设计方法学>的课程,老师上课很幽默风趣,也经常给我们带来一些时事新闻.当然,课余也会给我们布置一些作业.其中"K ...

  5. VS2019/MFC编程入门:树形控件Tree Control 下

    前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例.在内容开始前为大家介绍一款MFC界面 ...

  6. MFC 为树形控件添加图标

    添加控件,树形控件,静态文本框和编辑框.树形控件属性Has Buttons,Has Lines, Lines At Root 勾选为True. 并为树形控件添加变量,m_webTree 在初始化函数中 ...

  7. 树形控件CTreeCtrl的使用详解(一)

    树型视的三个结构TVINSERTSTRUCT.TVITEM.NMTREEVIEW TVINSERTSTRUCT 包含添加新项到树形视控件所使用的信息.这个结构被TVM_INSERTITEM消息使用.这 ...

  8. 树形控件Tree Control

    树形控件Tree Control 前面两节为大家讲了列表视图控件List Control,这一节开始介绍一种特殊的列表--树形控件Tree Control. 树形控件简介 树形控件在Windows系统 ...

  9. MFC工具箱控件的一些用法

    转自https://blog.csdn.net/qq_34174814/article/details/51419967 控件工具箱: 2 图形控件(picture):常用于显示位图(Bitmap)和 ...

  10. MFC树控件的属性和初始化(基于对话框的编程)

    目录 一.控件属性 1.找控件Tree Control 2.Has Lines和Has Buttons属性 3.Lines At Root属性 二.代码操作Tree Control显示内容 1.添加T ...

最新文章

  1. 【ABAP】如何判断单据是否被锁定
  2. 【转】Snackbar和Toast的花式使用,这一篇就够了
  3. 当剩下最后一颗×××时,各国军人的表现!
  4. 整合Activiti Modeler到业务系统(或BPM平台)
  5. 体验完23万的小鹏P5,凯美瑞不香了 | 视频
  6. Pandas 排序之后索引问题
  7. jquery 如何获取动态添加的元素
  8. 计算机系统-电路设计06-振荡器的内部电路实现
  9. android go 刷机教程,安卓用的久了,如何刷机?安卓手机线刷教程
  10. 如何让元素支持 height:100%效果
  11. viewpager 获取当前现实的view
  12. 怎么用计算机求logo,小学计算机教学中的LOGO语言教学(转载)
  13. 【离散数学】陪集精讲
  14. linux在命令行下打开pdf文件
  15. Android应用签名证书(.keystore)生成
  16. linux下国产达梦数据库的命令行安装
  17. xdg在Linux中的用法,Linux – XDG (X Desktop Group)
  18. 80004005错误代码_Win7系统提示0X80004005错误代码怎样解决 Win7系统错误代码0x80004005的解决办法...
  19. linux强制修改只读文件权限
  20. 2010提升你幽默感的经典短句

热门文章

  1. 使用MATLAB计算个人所得税
  2. 3.22 进口物料的报关手册核销
  3. fydeos 安装linux程序,FydeOS安装教程-电脑系统安装手册
  4. CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件
  5. css中标准盒模型和怪异盒模型的区别,如何将标准盒模型转换为怪异盒模型
  6. 基于不确定性量化的非精确概率可靠性理论
  7. 超人再起 Superman Returns
  8. guet-acm-开挂的chair
  9. Prince和学生们侃侃而谈系列06
  10. 为 Drupal 7 构建一个新主题