官方给的例子效果如下:
其实很多效果开发的时候可以不需要,自己删减了很多,实现的基本功能如下:
接下来一步一步得到这个效果:
1、新建工程,并且拖入控件pic control
2、定义成员,初始化控件
头文件:CBCGPTreeCtrlEx m_wndTree;
实现文件:
BOOL CTreeCtrlDemoDlg::OnInitDialog()
{
CBCGPDialog::OnInitDialog();
UINT nTreeStyles = WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | TVS_LINESATROOT |
TVS_HASLINES | //有线
TVS_HASBUTTONS | //有按钮
TVS_CHECKBOXES | //有选择框
TVS_FULLROWSELECT; //整行选中,注意不能有TVS_EDITLABELS
//TVS_EDITLABELS; //可编辑
m_wndTree.CreateOnPlaceHolder(this, IDC_TREE, 0, nTreeStyles);
{
m_wndTree.EnableHeader(BCGP_GRID_HEADER_SORT); //显示header 0表示不显示
m_wndTree.EnableColumnAutoSize(TRUE); //设置列自适应宽度
m_wndTree.EnableGridLines(TRUE);//显示gridline
m_wndTree.EnableAlternateRows(TRUE);//
}
{
m_wndTree.DeleteAllItems();
m_wndTree.DeleteAllColumns();
m_wndTree.InsertColumn(0, _T("Name"), 100);
m_wndTree.InsertColumn(1, _T("Size"), 100);
m_wndTree.SetHeaderAlign(1, HDF_RIGHT);
m_wndTree.SetColumnAlign(1, HDF_RIGHT);
HTREEITEM htItem = m_wndTree.InsertItem(_T("test1"));
m_wndTree.InsertItem(_T("test1_1"), htItem);
m_wndTree.InsertItem(_T("test2"));
m_wndTree.AdjustLayout();
}
return TRUE; // return TRUE unless you set the focus to a control
}
这个时候 树结构的部分就可以完整显示出来了
3、使用过程中,会对树进行维护操作
添加子级:
void CTreeCtrlDemoDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hSelected = m_wndTree.GetSelectedItem();
HTREEITEM hNew = NULL;
LPCTSTR lpszItem = _T("New item");
// Insert as child item
{
if (hSelected == NULL)
{
return;
}
hNew = m_wndTree.InsertItem(lpszItem, hSelected, TVI_LAST);
}
m_wndTree.AdjustLayout();
m_wndTree.RedrawWindow();
m_wndTree.SelectItem(hNew);
// update the checkbox of the header control
m_wndTree.UpdateHeaderCheckbox();
CEdit* pEdit = m_wndTree.EditLabel(hNew);
if (pEdit != NULL)
{
ASSERT_VALID(pEdit);
pEdit->SetSel(0, -1); // Select All
}
}
添加同级:
void CTreeCtrlDemoDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hSelected = m_wndTree.GetSelectedItem();
HTREEITEM hNew = NULL;
LPCTSTR lpszItem = _T("New item");
{
// Insert after the currently selected item
if (hSelected != NULL)
{
HTREEITEM hParent = m_wndTree.GetParentItem(hSelected);
hNew = m_wndTree.InsertItem(lpszItem, hParent, hSelected);
}
// Insert as last
else
{
hNew = m_wndTree.InsertItem(lpszItem);
}
}
m_wndTree.AdjustLayout();
m_wndTree.RedrawWindow();
m_wndTree.SelectItem(hNew);
// update the checkbox of the header control
m_wndTree.UpdateHeaderCheckbox();
CEdit* pEdit = m_wndTree.EditLabel(hNew);
if (pEdit != NULL)
{
ASSERT_VALID(pEdit);
pEdit->SetSel(0, -1); // Select All
}
}
//删除操作:
void CTreeCtrlDemoDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM hSelected = m_wndTree.GetSelectedItem();
if (hSelected == NULL)
{
return;
}
m_wndTree.SelectItem(hSelected); // select only one item if multiple selection
m_wndTree.SelectSetFirstVisible(hSelected);
m_wndTree.RedrawWindow();
if (BCGPMessageBox(L"are you delete?", MB_YESNO) == IDYES)
{
HTREEITEM hNext = m_wndTree.GetNextItem(hSelected, TVGN_PREVIOUSVISIBLE);
m_wndTree.DeleteItem(hSelected);
m_wndTree.AdjustLayout();
m_wndTree.SelectItem(hNext);
}
}
//展开所有级别
void CTreeCtrlDemoDlg::ExpandTreeItem(CBCGPTreeCtrlEx &tree, HTREEITEM hItem, UINT nCode)
{
HTREEITEM hChild;
if (tree.ItemHasChildren(hItem))
{
tree.Expand(hItem, nCode);
hChild = tree.GetChildItem(hItem);
while (hChild)
{
ExpandTreeItem(tree, hChild, nCode);
hChild = tree.GetNextItem(hChild, TVGN_NEXT);
}
}
}
void CTreeCtrlDemoDlg::OnExpandAll()
{
HTREEITEM hItem = m_wndTree.GetRootItem();
while (hItem)
{
ExpandTreeItem(m_wndTree, hItem, TVE_EXPAND);
hItem = m_wndTree.GetNextItem(hItem, TVGN_NEXT);
}
}
最后,比如勾选之后需要做操作,这时可以参考展开的遍历