<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
[作者按]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;
}
相关推荐
实例048 为EditBox控件添加列表选择框 实例049 多彩边框的编辑框 实例050 改变编辑框文本颜色 2.3 ListBox控件典型实例 实例051 利用ListBox控件实现标签式数据选择 实例052 在ListBox控件间实现数据交换 实例...
实例048 为EditBox控件添加列表选择框 实例049 多彩边框的编辑框 实例050 改变编辑框文本颜色 2.3 ListBox控件典型实例 实例051 利用ListBox控件实现标签式数据选择 实例052 在ListBox控件间实现数据交换 实例...
cc实例048 为EditBox控件添加列表选择框 cc实例049 多彩边框的编辑框 cc实例050 改变编辑框文本颜色 2.3 ListBox控件典型实例 cc实例051 利用ListBox控件实现标签式数据选择 cc实例052 ...
cc实例048 为EditBox控件添加列表选择框 cc实例049 多彩边框的编辑框 cc实例050 改变编辑框文本颜色 2.3 ListBox控件典型实例 cc实例051 利用ListBox控件实现标签式数据选择 cc实例052 ...
cc实例065 多级数据库树状结构数据显示 cc实例066 可动态修改节点的树状结构 cc实例067 带复选功能的树状结构 cc实例068 显示磁盘目录 cc实例069 树型提示框 2.7 RichEdit控件典型实例 cc实例070 利用...
ADO方式填充树型框.ec API操作模块.ec API的使用方法.ec API 设置颜色对话框模块.ec ard.ec Arhz_自动更新.ec Base64编解码.ec BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL...
ADO方式填充树型框.ec API操作模块.ec API的使用方法.ec API 设置颜色对话框模块.ec ard.ec Arhz_自动更新.ec Base64编解码.ec BASE64编解码模块.ec Bios.ec Bios 信息.ec BMP加密数据.ec BMP滤镜模块.ec BOX.EC BPL...
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...
Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...