Mfc CTreeCtrl SelectItem未选择项

Mfc CTreeCtrl SelectItem未选择项,mfc,tree,Mfc,Tree,我在MyCTreeCtrl树控件中有3个HTREEITEMs,一个rootHti和两个子项hti1和hti2。我想高亮显示rootHti,所以我调用myTreeCtrl.SelectItem(rootHti);。但是,树项目中没有任何更改。我也尝试了同样的结果。也就是说,该项不会高亮显示 TVITEM item; item.hItem = rootHti; item.mask = TVIF_STATE; item.state = TVIS_EXPANDED | TVIS_SELECTED; it

我在MyCTreeCtrl树控件中有3个HTREEITEMs,一个rootHti和两个子项hti1和hti2。我想高亮显示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);

我的选择和突出显示的假设是否不正确?单击该项目会突出显示该项目。将
TVIF\u句柄
值添加到
掩码
字段


(并确保
rootHti
是有效的项目句柄)

TVIF\u句柄
值添加到
掩码
字段

(并确保
rootHti
是有效的项目句柄)

如果调用

myTreeCtrl.SelectItem (rootHti);
如果成功,那么你的手柄是正确的,你只需要按照manuell的建议将手柄标志添加到面具上。我假设您这样做只是因为您希望项目扩展并被选中,是吗?

如果调用

myTreeCtrl.SelectItem (rootHti);

如果成功,那么你的手柄是正确的,你只需要按照manuell的建议将手柄标志添加到面具上。我假设您这样做只是因为您希望项目扩展和选中,是吗?

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

如果没有
TVS\u SHOWSELALWAYS
style,即使调用了
SelectItem()
,根项目也会有所不同

如果我更正了(我希望如此),可以使用样式。通过使用
GetWindowLong()&SetWindowLong()
,以及使用“树控件”的“属性”窗口,可以设置
TVS\U SHOWSELALWAYS

编辑 下面的代码显示了如何使用
GetWindowLong()
SetWindowLong()
更改树控件样式

CTreeCtrl*tree\u ctrl=static\u cast(GetDlgItem(IDC\u TREE1));
longtree\u ctrl\u style=GetWindowLongPtr(tree\u ctrl->GetSafeHwnd(),GWL\u样式);
如果(!tree\u ctrl\u样式)
{
//失败
AfxMessageBox(L“无法获取树ctrl样式”);
//GetLastError
//
返回FALSE;
}
tree_ctrl_style |=TV_SHOWSELALWAYS;
如果(!SetWindowLongPtr(tree\u ctrl->GetSafeHwnd(),GWL\u样式,tree\u ctrl\u样式))
{
//失败
AfxMessageBox(L“无法设置树控制样式”);
//GetLastError
//
返回FALSE;
}
HTREEITEM root\u item=tree\u ctrl->InsertItem(L“root”);
树\u ctrl->InsertItem(L“Child1”,0,0,根\u项);
树\u ctrl->InsertItem(L“Child2”,0,0,根\u项);
tree\u ctrl->SelectItem(根项目);
我使用了
GetWindowLongPtr(),SetWindowLongPtr()
,因为

编写与32位和64位版本兼容的代码 对于Windows,请使用GetWindowLongPtr


但是,如果您的程序只是样本或测试,您就不必关心这一点。

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

如果没有
TVS\u SHOWSELALWAYS
style,即使调用了
SelectItem()
,根项目也会有所不同

如果我更正了(我希望如此),可以使用样式。通过使用
GetWindowLong()&SetWindowLong()
,以及使用“树控件”的“属性”窗口,可以设置
TVS\U SHOWSELALWAYS

编辑 下面的代码显示了如何使用
GetWindowLong()
SetWindowLong()
更改树控件样式

CTreeCtrl*tree\u ctrl=static\u cast(GetDlgItem(IDC\u TREE1));
longtree\u ctrl\u style=GetWindowLongPtr(tree\u ctrl->GetSafeHwnd(),GWL\u样式);
如果(!tree\u ctrl\u样式)
{
//失败
AfxMessageBox(L“无法获取树ctrl样式”);
//GetLastError
//
返回FALSE;
}
tree_ctrl_style |=TV_SHOWSELALWAYS;
如果(!SetWindowLongPtr(tree\u ctrl->GetSafeHwnd(),GWL\u样式,tree\u ctrl\u样式))
{
//失败
AfxMessageBox(L“无法设置树控制样式”);
//GetLastError
//
返回FALSE;
}
HTREEITEM root\u item=tree\u ctrl->InsertItem(L“root”);
树\u ctrl->InsertItem(L“Child1”,0,0,根\u项);
树\u ctrl->InsertItem(L“Child2”,0,0,根\u项);
tree\u ctrl->SelectItem(根项目);
我使用了
GetWindowLongPtr(),SetWindowLongPtr()
,因为

编写与32位和64位版本兼容的代码 对于Windows,请使用GetWindowLongPtr


但是,如果您的程序只是样本或测试,您不必在意。

设置TVS\U SHOWSELALWAYS样式是有效的。因为对于这个测试,我使用的是资源编辑器,所以我将外观样式属性设置为始终显示选择,这设置了TVS_SHOWSELALWAYS标志。至少有两种高亮显示:着色和鼠标单击。设置TVS_SHOWSELALWAYS标志会生成阴影突出显示,看起来像是屏幕快照中的根项目。我尝试在我的MFC应用程序中以编程方式设置样式:“long style=GetWindowLong(m_hWnd,GWL_style);风格|=电视节目始终;SetWindowLong(NULL,0,样式);',但它不起作用。@rtischer8277我已经编辑了我的答案。您可以使用主窗口的
m_-hWnd
,而不是树控件的
m_-hWnd
。感谢您的回复。您的代码告诉我,我未正确地将SetWindowLongPtr的nIndex参数设置为0,而该参数本应为GWL_样式。设置TVS_SHOWSELALWAYS样式有效。因为对于这个测试,我使用的是资源编辑器,所以我将外观样式属性设置为始终显示选择,这设置了TVS_SHOWSELALWAYS标志。至少有两种高亮显示:着色和鼠标单击。设置TVS_SHOWSELALWAYS标志会生成阴影突出显示,看起来像是屏幕快照中的根项目。我尝试在我的MFC应用程序中以编程方式设置样式:“long style=GetWindowLong(m_hWnd,GWL_style);风格|=电视节目始终;SetWindowLong(NULL,0,样式);',日分