15,979
社区成员
发帖
与我相关
我的任务
分享
void CxxxDlg::TreeVisit(CTreeCtrl& tree, HTREEITEM hItem)
{
AfxMessageBox(tree.GetItemText(hItem));
if (tree.ItemHasChildren(hItem))
{//有子项
HTREEITEM hChildItem = tree.GetChildItem(hItem);
while(hChildItem != NULL)
{
TreeVisit(tree, hChildItem); //递归遍历子节点
hChildItem = tree.GetNextItem(hChildItem, TVGN_NEXT);
}
}
else//关键是这里这个else里面怎么写
{//没有子项
HTREEITEM hRootItem = tree.GetNextSiblingItem(hItem);
if (hRootItem != NULL)
{
TreeVisit(tree, hRootItem); //递归遍历根节点
hRootItem = tree.GetNextItem(hRootItem, TVGN_NEXT);
}
}
}
// CTreeCtrlFind message handlers
/*
如果T是一棵空树,那么对T进行前序遍历、中序遍历和后序遍历都是空操作,得到的列表为空表。
如果T是一棵单结点树,那么对T进行前序遍历、中序遍历和后序遍历都只访问这个结点。这个结点本身就是要得到的相应列表。
否则,设它以n为树根,树根的子树从左到右依次为T1,T2,..,Tk,那么有:
对T进行前序遍历是先访问树根n,然后依次前序遍历T1,T2,..,Tk。
对T进行中序遍历是先中序遍历T1,然后访问树根n,接着依次对T2,T2,..,Tk进行中序遍历。
对T进行后序遍历是先依次对T1,T2,..,Tk进行后序遍历,最后访问树根n。
*/
/***************************************************************
*
* 名称:FindItem
*
* 功能:在树控制中根据数据项名称查找数据项
*
* 参数:item - 要查询的数据项及其子数据项
*
* strText - 要查询的数据项名称
*
* 返回值:NULL - 没找到
*
* (非空的HTREEITEM ) - 找到
* 先序遍历
*
***************************************************************/
HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
if (!item)
return NULL;
CString strTemp = GetItemText(item);
if (GetItemText(item) == strText) //"root" node
return item;
if (ItemHasChildren(item)) {
item = GetChildItem(item); //"first" tree
while (item != NULL) {
hFind = PreorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
return NULL;
}
else //leaf node
return NULL;
}
HTREEITEM CTreeCtrlFind::PreorderFindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (GetItemData(item) == dwItem) //"root" node
return item;
if (ItemHasChildren(item)) {
item = GetChildItem(item);
while (item != NULL) {
hFind = PreorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
return NULL;
}
else
return NULL;
}
HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
if (!item)
return NULL;
CString strTemp = GetItemText(item);
if (GetItemText(item) == strText) //"root" node
return item;
item = GetChildItem(item); //"first" tree
while (item != NULL) {
hFind = PreorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item); //"other" trees
}
return NULL;
}
HTREEITEM CTreeCtrlFind::Preorder2FindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (GetItemData(item) == dwItem) //"root" node
return item;
item = GetChildItem(item); //"first" tree
while (item != NULL) {
hFind = PreorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item); //"other" trees
}
return NULL;
}
HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (ItemHasChildren(item)) {
HTREEITEM v = item;
item = GetChildItem(item);
hFind = InorderFindItem(item, strText);
if (hFind)
return hFind;
if (GetItemText(v) == strText)
return v;
item = GetNextSiblingItem(item);
while (item != NULL) {
hFind = InorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
return NULL;
}
else {
if (GetItemText(item) == strText)
return item;
else
return NULL;
}
}
HTREEITEM CTreeCtrlFind::InorderFindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (!ItemHasChildren(item)) {
if (GetItemData(item) == dwItem)
return item;
else
return NULL;
}
else {
HTREEITEM v;
v = item;
item = GetChildItem(item);
hFind = InorderFindItem(item, dwItem);
if (hFind)
return hFind;
if (GetItemData(v) == dwItem)
return v;
item = GetNextSiblingItem(item);
while (item != NULL) {
hFind = InorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
return NULL;
}
}
HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
HTREEITEM v, child;
if (!item)
return NULL;
v = item;
child = GetChildItem(item);
if (child) {
hFind = InorderFindItem(child, strText);
if (hFind)
return hFind;
}
if (GetItemText(v) == strText)
return v;
if (child) {
item = GetNextSiblingItem(child);
while (item != NULL) {
hFind = InorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
}
return NULL;
}
HTREEITEM CTreeCtrlFind::Inorder2FindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind, v, child;
if (!item)
return NULL;
v = item;
child = GetChildItem(item);
if (child) {
hFind = InorderFindItem(child, dwItem);
if (hFind)
return hFind;
}
if (GetItemData(v) == dwItem)
return v;
if (child) {
item = GetNextSiblingItem(child);
while (item != NULL) {
hFind = InorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
}
return NULL;
}
HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (ItemHasChildren(item)) {
HTREEITEM v;
v = item;
item = GetChildItem(item);
while (item != NULL) {
hFind = PostorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
if (GetItemText(v) == strText)
return v;
return NULL;
}
else {
if (GetItemText(item) == strText)
return item;
else
return NULL;
}
}
HTREEITEM CTreeCtrlFind::PostorderFindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind;
if (!item)
return NULL;
if (!ItemHasChildren(item)) {
if (GetItemData(item) == dwItem)
return item;
else
return NULL;
}
else {
HTREEITEM v;
v = item;
item = GetChildItem(item);
while (item != NULL) {
hFind = PostorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
if (GetItemData(v) == dwItem)
return v;
return NULL;
}
}
HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, CString strText)
{
HTREEITEM hFind;
HTREEITEM v;
if (!item)
return NULL;
v = item;
item = GetChildItem(item);
while (item != NULL) {
hFind = PostorderFindItem(item, strText);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
if (GetItemText(v) == strText)
return v;
return NULL;
}
HTREEITEM CTreeCtrlFind::Postorder2FindItem(HTREEITEM item, DWORD dwItem)
{
HTREEITEM hFind;
HTREEITEM v;
if (!item)
return NULL;
v = item;
item = GetChildItem(item);
while (item != NULL) {
hFind = PostorderFindItem(item, dwItem);
if (hFind)
return hFind;
else
item = GetNextSiblingItem(item);
}
if (GetItemData(v) == dwItem)
return v;
return NULL;
}
HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, CString strText)
{
HTREEITEM v = GetNextSiblingItem(NULL);
return Preorder2FindItem(item, strText);
}
HTREEITEM CTreeCtrlFind::FindItem(HTREEITEM item, DWORD dwItem)
{
return PreorderFindItem(item, dwItem);
}