1. 消息事件
   (1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。
   (2)鼠标点击当前ITEM的TEXT:引发NM_CLICK事件。
   (3)鼠标点击新ITEM的CHECKBOX:引发TVN_SELCHANGED事件、NM_CLICK事件并传递TVHT_ONITEMSTATEICON。
   (4)鼠标点击新ITEM的TEXT:引发NM_CLICK事件、TVN_SELCHANGED事件。
2. 消息事件总结
   点击ITEM会引发NM_CLICK事件。若点击CHECKBOX则传递TVHT_ONITEMSTATEICON。
   因此可不处理TVN_SELCHANGED事件而只处理NM_CLICK事件。
3. 消息处理注意事项
   (1)点击CHECKBOX后会自动更新CheckBox的状态,因此在处理代码中不需要使用SetCheck函数设置状态,而GetCheck函数返回也是其原始状态。
   (2)点击新CHECKBOX后不会自动将对应的ITEM设置为选择状态,需要使用SelectItem函数进行设置。
4. 使用方法
   (1)若传递TVHT_ONITEMSTATEICON
          获取选择ITEM的状态并取反
              若有子项则所有子项设置为一致
              若没有子项则
                  若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。
         若选择了新ITEM则设置新ITEM为选择项
   (2)若未传递TVHT_ONITEMSTATEICON
          设置更新ITEM状态,获取选择ITEM的状态
              若有子项则所有子项设置为一致
              若没有子项则
                  若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。
5. 响应NM_CLICK事件的函数代码

void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
UINT uFlag; //接收有关点击测试的信息的整数
HTREEITEM hTree;
BOOL bCheck;
GetCursorPos(&point); //获取屏幕鼠标坐标
m_TreeCtrl.ScreenToClient(&point); //转化成客户坐标
hTree = m_TreeCtrl.HitTest(point,&uFlag); //返回与CtreeTtrl关联的光标的当前位置和句柄
if((TVHT_NOWHERE & uFlag))
{
return;
}
if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //点中复选框
{
m_TreeCtrl.SelectItem(hTree);
CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";
TRACE(temp);
bCheck = m_TreeCtrl.GetCheck(hTree); //获取当前复选状态
SetChildCheck(hTree,!bCheck); //设置子项复选状态
SetParentCheck(hTree, bCheck); //设置父项复选状态
}
*pResult = 0;
}

void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
m_TreeCtrl.Expand(hTree,TVE_EXPAND);
hTree = m_TreeCtrl.GetChildItem(hTree); //获取子项句柄
while (hTree)
{
m_TreeCtrl.SetCheck(hTree, bCheck);
SetChildCheck(hTree,bCheck); //递归调用
hTree = m_TreeCtrl.GetNextSiblingItem(hTree); //获取兄弟的句柄
}
}
void CTestTimerDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)
{
HTREEITEM hParent = m_TreeCtrl.GetParentItem(hTree);
if (hParent)
{
HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);
while (hChild)
{
if (hChild == hTree)
{
hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
continue;
}
BOOL bflag = m_TreeCtrl.GetCheck(hChild);
if (bCheck == bflag) //判断是否还有兄弟项被选择
{
return;
}
hChild = m_TreeCtrl.GetNextSiblingItem(hChild);
}
m_TreeCtrl.SetCheck(hParent,!bCheck);
SetParentCheck(hParent,bCheck); //设置父项的状态
}

C++ CTreeview的checkbox使用方法的更多相关文章

  1. jQuery操作CheckBox的方法(选中,取消,取值)

    jQuery操作CheckBox的方法(选中,取消,取值). 代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional/ ...

  2. IE对于input checkbox onclick方法显示不支持此对象和方法的解决方案

    网站注册页,协议结束后,通过input checkbox勾选,进行下一步,FF没问题,IE一直显示不支持此对象和方法. 网上查找大部分说函数名称与系统函数重名,而事实上不是. <div name ...

  3. 关于在DBGridEh的一个字段使用checkbox的方法 .

    在DBGridEh的columns中新增加一个字段 1.如果你选择的数据库字段,则选择checkbox为true,并在keylist中输入0和1,就可以了 2.如果你选择的是一个临时字段,在数据集中新 ...

  4. jQuery操作CheckBox的方法(选中,取消,取值)详解

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  5. jquery checkbox radio 标签 选中的3种方法

    张映 发表于 2013-07-16 分类目录: js/jquery 标签:checkbox, jquery, radio, 选中 jquery 很灵活,checkbox radio标签选中的方法有很多 ...

  6. js操作checkbox(复选框)的方法总结

    收集了一些用js代码操作checkbox复选框的代码,分享出来,供需要的朋友参考: <script> //复选框checkbox 处理方法 //搜集整理 www.jbxue.com fun ...

  7. ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

  8. ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法

    一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...

  9. MVC_表单和HTML辅助方法

    表单的使用 action特性告知Web浏览器信息发往哪里. method特性告知浏览器使用HTTP POST 还是 HTTP GET. GET请求用于读操作, POST请求用于写操作 HTML辅助方法 ...

随机推荐

  1. 通过mapreduce把mysql的数据读取到hdfs

    前面讲过了怎么通过mapreduce把mysql的一张表的数据放到另外一张表中,这次讲的是把mysql的数据读取到hdfs里面去 具体怎么搭建环境我这里就不多说了.参考 通过mapreduce把mys ...

  2. Nginx 之防盗链配置

    首先,我们需要知道通过什么来实现防盗的! http referer 是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer,这是在告诉服务器是从哪个页面链接过来的,服务 ...

  3. 「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)

    /** 首先通过SAM求出每个串本质不同的子串 然后发现转移不好处理整体的本质不同 形如串A可能状态有a,b,ab,空,串B可能状态有b,空两种, 那么我们需要处理ab + 空 和 a + b的情况 ...

  4. JVM总结-字节码

    在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数.这个栈帧的大小是提前计算好的,而且 Java 虚拟机 ...

  5. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

  6. py库: xlwt 、xlrd (写读EXCEL文件)

    写EXCEL文件 # -*- coding: utf-8 -*- import xlwt book = xlwt.Workbook(encoding = "utf-8", styl ...

  7. 《算法》第三章部分程序 part 4

    ▶ 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 package package01; import edu.princeton.cs.algs4.Queue; impo ...

  8. github中SSH公钥的生成与添加

    在终端中输入ssh-keygen -t rsa -C "133XXXXXX@qq.com" 按3个回车,密码为空这里一般不使用密钥. 最后得到了两个文件:id_rsa和id_rsa ...

  9. 汉诺塔问题python

    count = 0def hanoi(n,src,mid,dst): global count if n == 1: print("{}:{}->{}".format(1,s ...

  10. 设计模式、j2ee 部 分、EBJ 部 分

    八. 软 件 工 程 与 设 计 模 式 1 .UML 方 面 标准建模语言 UML.用例图,静态图(包括类图.对象图和包图),行为图,交互图(顺序图,合作 图),实现图. 2 .j2ee 常 用 的 ...