想问问,TreeCtrl control 怎么样判断是展开了,并且读取它的每个结点的信息.

草履虫程序员 2006-02-25 09:07:13
请教,一个树型控件,从根开始到叶子有好几层,请问这个控件有没有展开如何判断,他得每层的结点信息如何读取?
...全文
384 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
草履虫程序员 2006-04-09
  • 打赏
  • 举报
回复
楼上的,我这个tree control控件在一个form里,而这个form所在的窗口是继于CFormView的,如果你这样做了,我该如何来放到自己的工程里,怎么样调用?
aa3000 2006-04-06
  • 打赏
  • 举报
回复
zzpzheng(Aeolus) 是正解,怎么不行呢?
草履虫程序员 2006-04-06
  • 打赏
  • 举报
回复
楼上这个好象不行吧。
MLiang 2006-04-06
  • 打赏
  • 举报
回复
class CTreeCtrlEx : public CTreeCtrl
{
DECLARE_DYNAMIC(CTreeCtrlEx)

public:
CTreeCtrlEx();
virtual ~CTreeCtrlEx();

protected:
DECLARE_MESSAGE_MAP()
public:
//获得hTreeItem的下一代子数的数量不包含跨代的(跟孙子没关系)
int GetSubItemCount(HTREEITEM hTreeItem)const;

//判断hItem是否含有满足条件(按照句柄或文字)的子树
BOOL ItemHasTheChild(HTREEITEM hItem, HTREEITEM hChild);
BOOL ItemHasTheChild(HTREEITEM hItem, CString strChild);

//获得第一个满足条件(Text)的子树选项
HTREEITEM GetFirstChildByText(HTREEITEM hItem, CString strChild);

//获取所选树的级别
int GetCurSelTreeLevel(void)const;
};

////////////////////////////////////////////////////////////////////////////////

// TreeCtrlEx.cpp : 实现文件
//

#include "stdafx.h"
#include "ExchangePlatform.h"
#include "TreeCtrlEx.h"


// CTreeCtrlEx

IMPLEMENT_DYNAMIC(CTreeCtrlEx, CTreeCtrl)
CTreeCtrlEx::CTreeCtrlEx()
{
}

CTreeCtrlEx::~CTreeCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CTreeCtrlEx, CTreeCtrl)
END_MESSAGE_MAP()



// CTreeCtrlEx 消息处理程序

int CTreeCtrlEx::GetSubItemCount(HTREEITEM hTreeItem)const
{
int nCount = -1;
HTREEITEM hItem = GetChildItem(hTreeItem);

if(hItem)
nCount++;

do{
hItem = GetNextSiblingItem(hItem);
nCount++;
}
while(hItem);

return nCount;
}

BOOL CTreeCtrlEx::ItemHasTheChild(HTREEITEM hItem, HTREEITEM hChild)
{
if (!ItemHasChildren(hItem))
return FALSE;

//hItem的第一个子条目
HTREEITEM hItemTemp = GetChildItem(hItem);

int i = 0;
while(hItemTemp != NULL)
{
if (hItemTemp == hChild)
return TRUE;

hItemTemp = GetNextSiblingItem(hItem);
if(hItemTemp == NULL)
return FALSE;
}

return FALSE;
}

BOOL CTreeCtrlEx::ItemHasTheChild(HTREEITEM hItem, CString strChild)
{
if (!ItemHasChildren(hItem))
return FALSE;

//hItem的第一个子条目
HTREEITEM hItemTemp = GetChildItem(hItem);

int i = 0;
while(hItemTemp != NULL)
{
if (GetItemText(hItemTemp) == strChild)
return TRUE;

hItemTemp = GetNextSiblingItem(hItemTemp);

if(hItemTemp == NULL)
return FALSE;
}
return FALSE;
}

HTREEITEM CTreeCtrlEx::GetFirstChildByText(HTREEITEM hItem, CString strChild)
{
if (!ItemHasChildren(hItem))
return NULL;

//hItem的第一个子条目
HTREEITEM hItemTemp = GetChildItem(hItem);

while (hItemTemp != NULL)
{
CString strTemp = GetItemText(hItemTemp);

if (strTemp == strChild)
return hItemTemp;

hItemTemp = GetNextSiblingItem(hItemTemp);

if (NULL == hItemTemp)
return NULL;
}

return NULL;
}

int CTreeCtrlEx::GetCurSelTreeLevel(void)const
{
HTREEITEM hSelItem = GetSelectedItem();

if (hSelItem == NULL)
return -1;

HTREEITEM hParentItem = GetParentItem(hSelItem);

int nReslut = 0;
while (hParentItem != NULL)
{
nReslut++;
hParentItem = GetParentItem(hParentItem);
}

return nReslut;
}

草履虫程序员 2006-04-06
  • 打赏
  • 举报
回复
zzpzheng(Aeolus),你好,给我你的一段代码,给我点如何判断当前展开在哪一层?
taole0160 2006-04-06
  • 打赏
  • 举报
回复
zzpzheng(Aeolus),是对的,我也是这么用的,没错
郑再鹏 2006-03-14
  • 打赏
  • 举报
回复
可以从根节点开始依次判断每个节点是否展开
UINT nState = GetItemState(hItem, TVIS_EXPANDED);
if (0 != (nState & TVIS_EXPANDED))
{
// 表示已经展开
}
else
{
// 没展开
}
MapleInHG 2006-02-27
  • 打赏
  • 举报
回复
连续使用GetParentItem取得父结点,直到父结点为空.
草履虫程序员 2006-02-26
  • 打赏
  • 举报
回复
再想请教一下,如何判断处在第几层上面?假如根结点开始到下面有好几层,判断一下,当前在第几层上.
vcmute 2006-02-25
  • 打赏
  • 举报
回复
GetFirstVisibleItem Retrieves the first visible item of the specified tree view item.
GetNextVisibleItem Retrieves the next visible item of the specified tree view item.
GetPrevVisibleItem Retrieves the previous visible item of the specified tree view item.
MapleInHG 2006-02-25
  • 打赏
  • 举报
回复
通过CTreeCtrl::EnsureVisible判断一个子项是否可见可知其父结点有没有展开.
获取结点数据可用:CTreeCtrl::GetItemText, CTreeCtrl::GetItemData等.

15,975

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧