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++中MFC Tab Control控件的使用详解
栏 目:C语言
下一篇:C++实现的链表类实例
本文标题:C++ CTreeview的checkbox使用方法
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3050.html
您可能感兴趣的文章
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言没有round函数 round c语言
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery
- 01-10SublimeText编译C开发环境设置
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什