分享
 
 
 

树型控件中目录与子节点检查框同步选择

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

[作者按]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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有