手动发送选中消息:
:SendMessage(GetTreeCtrl().m_hwnd,
TVM_SELECTITEM,(WPARAM)TVGN_CARET,(LPARAM)hItem);
取消选中任何节点
SelectItem(NULL),
但是,这个方法使用后,切换一下窗口,再回来,树就会呈灰色。。。
替代的另一个方法是
HTREEITEM hItem = GetTreeCtrl().GetSelectedItem();
if (hItem != NULL);
{
GetTreeCtrl().SetItemState(hItem, 0, TVIS_SELECTED);
}
设置0就表示取消选中的意思,
但是,这个方法也有问题,虽然取消了选中,但实际在节点上还会存在一个虚框,再次点这个节点的话,虽然是选中了,但是由于虚框的存在,该节点背景不会变深(即选中状态),那么解决这个问题的方法就是,当下一次点击上的时候,执行下面的操作:
GetTreeCtrl().SetItemState(hCurrentItem, TVIS_SELECTED, TVIS_SELECTED);
GetTreeCtrl().SelectItem(hCurrentItem);
设置TVIS_SELECTED就表示选中的意思,注意千万不要写为1(以为与0对应),这样就把节点状态又变回了选中状态,接下来调用SelectItem执行选中操作。
当一个节点的子节点很多时,展开合并也有时会出现重绘问题,方法是在OnItemExpanded函数里Invalidate,updatewindow。