CTreeCtrl SelectItem不选择项目

时间:2014-01-15 14:00:46

标签: mfc tree

我在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);

我的假设是选择和突出显示不正确吗?单击该项可突出显示该项目。

3 个答案:

答案 0 :(得分:3)

我认为rtischer8277的突出显示意味着鼠标似乎选择了一个树项目。 因此,当程序启动时,“根项目”如下所示,

enter image description here

如果没有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建议的那样将句柄标志添加到面具中。我假设你只是这样做,因为你想要扩展和选择项目,是吗?