[作者按]ctreectrl树型控件的检查框,并没有直接的点击消息。也就是说,当我们点击检查框时,没有直接对应的消息映射。不知道是微软故意所为还是什么原因。笔者个人认为可能是微软只是想把检查框作为一个静态的标识吧。
[实现方式]本文仅实现点击目录的检查框时,同时选中或者不选中该目录下的直接子节点,而不考虑该目录下的子目录下的子节点,如果要实现子目录下的子节点,可以对本文提供的程序稍作扩充即可。至于其它的应用,相信在得到选中的检查框后都很容易实现。本文程序在vc6.0下测试通过。 【相关文章:解释(学计算机的必看)】
[程序功能]许多网友的一个问题是:点击树中某个目录的检查框,希望该目录下的子节点与目录同时选中或者不选中(即检查框同时打勾或者不打勾)。在一些软件的安装程序中,我们可以看到类似的功能。 【扩展阅读:VC.Net从DLL传递消息到EXE】
1。用getcursorpos函数,获取鼠标位置。用screentoclient函数将点坐标转换为相对于控件的坐标。 【扩展信息:MDI应用中的单实例(singleton】
本文实现的方式是派生一个ctreectrl的子类cmytreectrl,然后重载ctreectrl的nm_click事件,在该事件中进行以下处理:
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; ... 下一页