首先要在树控件属性上加上checkbox;或者用代码;
MFC鼠标点击消息
afx_msg void OnNMClickTreeUnitshow(NMHDR *pNMHDR, LRESULT *pResult);
ON_NOTIFY(NM_CLICK, IDC_TREE_UNITSHOW, OnNMClickTreeUnitshow)
代码控制
void CSelectUnit::OnNMClickTreeUnitshow(NMHDR *pNMHDR, LRESULT *pResult)
{
//对点击显示进行处理
CPoint l_Point;
UINT l_iFlag;
//鼠标点击,获取光标焦点,以防万一
GetCursorPos(&l_Point);
//转为树坐标
m_TreeSelectUnit.ScreenToClient(&l_Point);
//获取鼠标点击的树节点
HTREEITEM l_SelectItem = m_TreeSelect.HitTest(l_Point, &l_iFlag);
//如果为空,直接返回,这里不能省;防止崩溃
if (l_SelectItem == NULL)
{
return;
}
//使光标处于该Item下
m_TreeSelectt.SelectItem(l_SelectItem);
if (l_iFlag & TVHT_ONITEMSTATEICON)
{
//得到当前节点的checkbox是否被选中
//注意:这里的要用相反的去判断,因为chekcbox还没有进行改变;
BOOL l_bCheck = !m_TreeSelectUnit.GetCheck(l_SelectItem);
//至于后面的你是否要选中,如果选中的规则,就可以往后面写了
}
*pResult = 0;
}
我的规则是: 子节点选,父节点一定选; 父节点不选,子节点一定不选;
当然其实这个树控件是满足不了界面三态的显示的,所以一般我都用自绘;用三张图片代替checkbox;有打勾,不打勾,checkbox填满 这三种状态