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 CxxxDlg::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 CxxxDlg::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 CxxxDlg::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); //设置父项的状态
·
[精华] VC中BSTR、Char和CString类型的转换
(2015-12-25)
·
VC DDE(Dynamic Data Exchange)与EXCEL连接
(2016-01-20)
·
VC 对话框背景颜色、控件颜色
(2016-05-16)
·
VC/Linux C++ 递归访问目录下所有文件
(2016-06-07)
·
vc第三方界面库BCGControlBar与Xtreme Toolkit对比
(2016-09-02)
1
google mock分享(全网最全最好的gmock文...
2
【解决】asan runtime does not come ...
3
MFC学习总结 (90个技巧) dlg 上建立View
4
coinitialize失败,返回值是0x80010106 无...
5
VS Addin插件基本开发入门
6
use of deleted function std::unique_...
7
浅析Linux段错误:SEGV_MAPERR、SEGV_ACCERR
8
hidden symbol ... is referenced by DSO 剖析
9
c++编译错误:invalid new-expression of abstract class type
10
Reference to ' ' is ambiguous:符号定义重复
5
海量数据相似度计算之simhash和海...
2次评论
6
C++使用OLE/COM高速读写EXCEL的源码
2次评论
7
AfxIsValidAddress 测试内存地址
2次评论
8
C++入门进阶最佳实战
2次评论
9
phpcms附件上传 Flash换成H5
2次评论
10
解决xrdp登陆不上的问题:xrdp s...
2次评论