我在MyCTreeCtrl树控件中有3个HTREEITEM,一个rootHti和两个孩子,hti1和hti2。我想hightlight rootHti所以我调用myTreeCtrl.SelectItem(rootHti);.但是,树项目没有变化。我也尝试了相同结果的长手。也就是说,该项目不会突出显示。
TVITEM item;
item.hItem = rootHti;
item.mask = TVIF_STATE;
item.state = TVIS_EXPANDED | TVIS_SELECTED;
item.stateMask = TVIS_EXPANDED | TVIS_SELECTED;
result = myTreeCtrl.SetItem(&item);
我的假设是选择和突出显示不正确吗?单击该项可突出显示该项目。
答案 0 :(得分:3)
我认为rtischer8277的突出显示意味着鼠标似乎选择了一个树项目。 因此,当程序启动时,“根项目”如下所示,
如果没有TVS_SHOWSELALWAYS
样式,即使调用SelectItem()
,“根项目”也会有所不同。
如果我更正(我希望如此),可以使用 TVS_SHOWSELALWAYS 样式。使用TVS_SHOWSELALWAYS
以及使用“树控件”的“属性”窗口可以设置GetWindowLong() & SetWindowLong()
。
修改强>
以下代码显示了如何使用GetWindowLong()
,SetWindowLong()
更改树控件样式。
CTreeCtrl* tree_ctrl = static_cast<CTreeCtrl*>(GetDlgItem(IDC_TREE1));
LONG tree_ctrl_style = GetWindowLongPtr(tree_ctrl->GetSafeHwnd(), GWL_STYLE);
if(!tree_ctrl_style)
{
//FAIL
AfxMessageBox(L"fail to get tree ctrl style");
//GetLastError
//
return FALSE;
}
tree_ctrl_style |= TVS_SHOWSELALWAYS;
if(!SetWindowLongPtr(tree_ctrl->GetSafeHwnd(), GWL_STYLE, tree_ctrl_style))
{
//FAIL
AfxMessageBox(L"fail to set tree ctrl style");
//GetLastError
//
return FALSE;
}
HTREEITEM root_item = tree_ctrl->InsertItem(L"Root");
tree_ctrl->InsertItem(L"Child1", 0, 0, root_item);
tree_ctrl->InsertItem(L"Child2", 0, 0, root_item);
tree_ctrl->SelectItem(root_item);
我使用GetWindowLongPtr(), SetWindowLongPtr()
,因为MSDN说,
编写与32位和64位版本兼容的代码 的Windows,使用GetWindowLongPtr。
但是,如果您的程序只是样本或测试,那么您并不关心。
答案 1 :(得分:1)
将TVIF_HANDLE
值添加到mask
字段。
(并确保rootHti
是有效的物品处理)
答案 2 :(得分:0)
如果致电
myTreeCtrl.SelectItem (rootHti);
有效,那么你的句柄是正确的,你只需要像manuell建议的那样将句柄标志添加到面具中。我假设你只是这样做,因为你想要扩展和选择项目,是吗?