树型控件中目录与子节点检查框同步选择

原创 2004年06月07日 09:51:00

[作者按]CTreeCtrl树型控件的检查框,并没有直接的点击消息。也就是说,当我们点击检查框时,没有直接对应的消息映射。不知道是微软故意所为还是什么原因。笔者个人认为可能是微软只是想把检查框作为一个静态的标识吧。

[程序功能]许多网友的一个问题是:点击树中某个目录的检查框,希望该目录下的子节点与目录同时选中或者不选中(即检查框同时打勾或者不打勾)。在一些软件的安装程序中,我们可以看到类似的功能。

[实现方式]本文仅实现点击目录的检查框时,同时选中或者不选中该目录下的直接子节点,而不考虑该目录下的子目录下的子节点,如果要实现子目录下的子节点,可以对本文提供的程序稍作扩充即可。至于其它的应用,相信在得到选中的检查框后都很容易实现。本文程序在VC6.0下测试通过。

本文实现的方式是派生一个CTreeCtrl的子类CMyTreeCtrl,然后重载CTreeCtrl的NM_CLICK事件,在该事件中进行以下处理:

1。用GetCursorPos函数,获取鼠标位置。用ScreenToClient函数将点坐标转换为相对于控件的坐标。

 CPoint pt;
 GetCursorPos(&pt);
 ScreenToClient(&pt);

2。用HitTest函数,检测点击选中了哪个目录

 HTREEITEM hItem = HitTest(pt);

3。用GetItemRect获取该目录的矩形大小(只计算文字)

 CRect rc;
 GetItemRect(hItem,rc,true);//true表示只计算文字所占大小

4。根据文字的大小和位置,计算检查框的大小和位置

 CRect checkRc;
 checkRc.top = rc.top;
 checkRc.bottom = rc.bottom;
 checkRc.left = rc.left - rc.Height();//考虑检查框是个矩形
 checkRc.right = rc.left ;

5。判断鼠标的位置是否在该目录的检查框的位置。如果在,则修改子节点状态

 if(PtInRect(checkRc,pt))
 {
}

如果是,则可以确认鼠标点击了目录的检查框,下面的操作就是将该目录下的子节点的检查框状态和目录状态设置成一致:

 if(PtInRect(checkRc,pt))
 {
  if(ItemHasChildren(hItem))//判断是否为目录
  {
   BOOL bCheck = GetCheck(hItem);//获取目录状态
   HTREEITEM hNext = GetChildItem(hItem);//获取第一个子节点
   while(hNext!=NULL)
   {
    SetCheck(hNext,!bCheck);//修改子节点状态
    hNext = GetNextSiblingItem(hNext);//获取下一个子节点
   }
  }
 }

============================================================

完整程序如下:

void CMyTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
 CPoint pt;
 GetCursorPos(&pt);
 ScreenToClient(&pt);
 HTREEITEM hItem = HitTest(pt);
 CRect rc;
 GetItemRect(hItem,rc,true);
 CRect checkRc;
 checkRc.top = rc.top;
 checkRc.bottom = rc.bottom;
 checkRc.left = rc.left - rc.Height();
 checkRc.right = rc.left ;
 if(PtInRect(checkRc,pt))
 {
  if(ItemHasChildren(hItem))
  {
   BOOL bCheck = GetCheck(hItem);
   HTREEITEM hNext = GetChildItem(hItem);
   while(hNext!=NULL)
   {
    SetCheck(hNext,!bCheck);
    hNext = GetNextSiblingItem(hNext);
   }
  }
 }
 *pResult = 0;
}

java实现树的添加和取父节点,子节点;聚合树,实现选项菜单功能

package com.kane.test; import java.util.ArrayList; import java.util.List; public class Tree { pr...
  • u010026901
  • u010026901
  • 2014年03月22日 20:32
  • 1476

树的子节点链表示法及其Java实现

父节点表示法的思想是让每个节点持有它的父节点的索引,这种方式是从子节点出发;反过来可以让父节点持有它的所有子节点。这种方式下,由于每个父节点需要记住多个子节点,因此必须采用“子节点链”表示法。...
  • bruce_6
  • bruce_6
  • 2014年06月07日 21:01
  • 2567

MFC 树形控件CTreeCtrl显示文件路径及文件

在上篇文章中简单讲述了"MFC单文档分割窗口显示图片",但是我想实现的是左边显示图片的路径,右边显示图片的情况,所以这里需要讲述如何使用控件List Control\CListCtrl实现该功能,希望...
  • Eastmount
  • Eastmount
  • 2014年02月13日 01:06
  • 14256

Delphi选择文件夹

在Delphi中,定位文件的操作主要有两种方法。一种是直接定位文件,即通过“打开”对话框(OpenDialog)控件来实现。另一种是只定位到文件夹,然后再在此文件夹内寻找文件,...
  • zjluming
  • zjluming
  • 2014年03月06日 21:47
  • 1126

MFC树型控件浏览文件目录(一)--显示文件树

转载▼ 本文对MFC中,用树型控件实现文件目录的浏览进行了简单的介绍。 主要实现以下几个功能: 1、显示文件目录树; 2、对于文件,在树型控件中双击进行打开; 3...
  • zmr1991
  • zmr1991
  • 2015年01月20日 17:04
  • 1091

C++算法之 求二叉树的节点个数、深度、四种遍历方法

[cpp] view plain copy  print? //节点的数据结构   class BTree   {   public:    int       m...
  • huangyimo
  • huangyimo
  • 2017年05月20日 10:10
  • 421

MFC树型控件浏览文件目录(三)

MFC树型控件浏览文件目录(三)--添加 右键菜单    转载▼ 今天把树型控件这个小小的工程写完吧,最后一部就是加上右键弹出菜单,效果图如图3-1,就是在树的...
  • zmr1991
  • zmr1991
  • 2015年01月20日 17:02
  • 824

带选择框的JS树控件2 (为JSTree再次提速)

以前写过一个带选择框的JS树控件 但是当时发现一个问题,第一次选中根节点会明显感觉卡一下。 那是因为子节点的数据还没有生成,选中根节点的话需要初始化全部数据。(那个tree有5000个节点) 于是我...
  • relucent
  • relucent
  • 2015年05月15日 19:31
  • 1498

HTML5文件选择框(各种类型)

浏览时只显示指定文件类型 input type="file" accept="application/msword" >br>br>accept属性列表br> 1.accept="appl...
  • pwh309315228
  • pwh309315228
  • 2016年11月30日 09:35
  • 1608

关于MFC中树形控件(CTreeCtrl)复选框(CheckBox)的显示一致性解决方案

关于MFC中树形控件(CTreeCtrl)复选框(CheckBox)的显示一致性解决方案  树形控件在Windows系统中是很常见的控件,例如资源管理器左侧的窗口中就有用来显示目录的树形视图。树形视图...
  • plzhou
  • plzhou
  • 2015年04月07日 16:59
  • 8150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树型控件中目录与子节点检查框同步选择
举报原因:
原因补充:

(最多只允许输入30个字)