C++ CTreeview的checkbox使用方法
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使用方法的更多相关文章
- jQuery操作CheckBox的方法(选中,取消,取值)
jQuery操作CheckBox的方法(选中,取消,取值). 代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional/ ...
- IE对于input checkbox onclick方法显示不支持此对象和方法的解决方案
网站注册页,协议结束后,通过input checkbox勾选,进行下一步,FF没问题,IE一直显示不支持此对象和方法. 网上查找大部分说函数名称与系统函数重名,而事实上不是. <div name ...
- 关于在DBGridEh的一个字段使用checkbox的方法 .
在DBGridEh的columns中新增加一个字段 1.如果你选择的数据库字段,则选择checkbox为true,并在keylist中输入0和1,就可以了 2.如果你选择的是一个临时字段,在数据集中新 ...
- jQuery操作CheckBox的方法(选中,取消,取值)详解
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
- jquery checkbox radio 标签 选中的3种方法
张映 发表于 2013-07-16 分类目录: js/jquery 标签:checkbox, jquery, radio, 选中 jquery 很灵活,checkbox radio标签选中的方法有很多 ...
- js操作checkbox(复选框)的方法总结
收集了一些用js代码操作checkbox复选框的代码,分享出来,供需要的朋友参考: <script> //复选框checkbox 处理方法 //搜集整理 www.jbxue.com fun ...
- ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法
一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...
- ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法
一.一个功能强大的页面开发辅助类—HtmlHelper初步了解 1.1 有失必有得 在ASP.Net MVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归. ...
- MVC_表单和HTML辅助方法
表单的使用 action特性告知Web浏览器信息发往哪里. method特性告知浏览器使用HTTP POST 还是 HTTP GET. GET请求用于读操作, POST请求用于写操作 HTML辅助方法 ...
随机推荐
- Python的可迭代对象、迭代器和生成器
可迭代对象(Iterable) 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.t ...
- unity3d简介
一.介绍: Unity3D软件:综合开发环境,实时三维动画等类型的多媒体内容,并支持这些内容在Windows.iOS.Android等多种平台的发布. Mono:脚本编程基于Mono技术,可使用Jav ...
- (转)WebApi返回Json格式字符串
原文地址:https://www.cnblogs.com/elvinle/p/6252065.html WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉 ...
- hadoop 分布式机群搭建
描述:鉴于本地电脑内存限制,采用三台虚机安装此环境. 主机名,分别为master.slave1.slave2. zookeeper分别安装这三台机器上,master和slave1做主从备份, slav ...
- hbase 核心知识
Hbase 负载均衡 Hbase全局计划 Hbase全局计划执行的流程--估算 Hbase随机分配计划 Hbase 批量启动分配计划 Hbase 通过shell控制负载均衡 何时使用HBase
- js第四天学习小结:
(1)函数的四种形式小结: 无参无返回值 function tellstory(){ console.log("从前有座山"); console.log(" ...
- HTML中head与body标签
一 head内常用标签 1.meta相关 #1.指定字符集 <meta charset="gbk"> #2.页面描述 <meta name="Descr ...
- 将任何GitHub内的代码转为外部CDN网址
rawgit.com 有时候在GitHub找到需要使用于网站的档案(例如:CSS.JavaScript),但没有提供CDN网址就必须自己手动下载.上传到主机上才能够使用,有点耗时又不方便,因为GitH ...
- day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数
本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...
- eclipse创建的maven项目中使用javafx
类似普通maven项目,不需要特地创建javafx项目. 将fxml资源文件放在resource目录下即可.