树控件
<h2>树节点</h2>
<p>树节点CTreeItem,继承于CListItem,支持CListItem的所有属性和方法。插入树控件的节点必须是CTreeItem或其子类,CListItem或其子类。</p>
<h2>树控件</h2>
<p>树控件CTreeView类,继承于CListView,支持CListView的所有属性和方法。</p>
<h2>属性和相关方法</h2>
<h4>插入节点</h4>
<ul>
<li>通过C++程序代码调用方法控制如下:</li>
</ul>
<pre><code class="language-c">void InsertItem(CTreeItem* pParentItem, CListItem* pItem);</code></pre>
<h4>展开树节点</h4>
<ul>
<li>通过C++程序代码调用方法控制如下:</li>
</ul>
<pre><code class="language-c">void ExpandItem(CTreeItem* pItem, BOOL bExpand);</code></pre>
<h4>移除树节点</h4>
<ul>
<li>通过C++程序代码调用方法控制如下:</li>
</ul>
<pre><code class="language-c">void RemoveItem(CListItem* pItem);</code></pre>
<h4>删除树节点</h4>
<ul>
<li>通过C++程序代码调用方法控制如下:</li>
</ul>
<pre><code class="language-c">void DeleteItem(CListItem* pItem);</code></pre>
<h4>删除所有树节点</h4>
<ul>
<li>通过C++程序代码调用方法控制如下:</li>
</ul>
<pre><code class="language-c">void DeleteAllChild();</code></pre>
<h2>请看下面的示例</h2>
<h4>效果图</h4>
<p><img src="http://www.skinui.cn/doc/img/5.0/3/TreeView.png" alt="树控件" /></p>
<h4>布局文件</h4>
<pre><code class="language-xml"><FlexLayout>
<TextView Width="MatchParent" Height="60" HorzAlign="Center" Text="IDS_CONTROL16_2" Font="ID_FONT_H4"/>
<Line Width="MatchParent" Height="1" Margin="0,0,0,20"/>
<RelativeLayout Width="MatchParent" Height="30" Layout="SeparatorLine.xml" ChildText11="简单树控件"/>
<RelativeLayout Width="MatchParent" Height="210">
<TreeView Id="100" AlignParentLeft="40" AlignParentRight="40" Height="200" AlignParentVertCenter="0"/>
</RelativeLayout>
<RelativeLayout Width="MatchParent" Height="30" Layout="SeparatorLine.xml" ChildText11="复杂树控件"/>
<RelativeLayout Width="MatchParent" Height="250">
<TreeView Id="200" AlignParentLeft="40" AlignParentRight="40" Height="240" AlignParentVertCenter="0"/>
</RelativeLayout>
<FlexLayout Width="MatchParent" Height="WrapContent" Margin="40,0,20,20">
<Button Id="2001" Width="WrapContent" Height="WrapContent" Margin="0,0,20,0" Background="Button.png" Layout="Button.xml" ChildText11="插入数据"/>
<Button Id="2002" Width="WrapContent" Height="WrapContent" Margin="0,0,20,0" Background="Button.png" Layout="Button.xml" ChildText11="滚到顶部"/>
<Button Id="2003" Width="WrapContent" Height="WrapContent" Margin="0,0,20,0" Background="Button.png" Layout="Button.xml" ChildText11="滚到底部"/>
</FlexLayout>
</FlexLayout></code></pre>
<h4>h文件</h4>
<pre><code class="language-cpp">#pragma once
class CDemoTreeViewLayout : public CScrollLayout
{
public:
enum
{
IDC_TREEVIEW1 = 100,
IDC_TREEVIEW2 = 200,
IDC_BUTTON_CLOSE = 2000,
IDC_BUTTON_INSERT = 2001,
IDC_BUTTON_SCROLL_TOP = 2002,
IDC_BUTTON_SCROLL_BOTTOM = 2003,
};
public:
CDemoTreeViewLayout(CView* pParent);
public:
virtual void OnBuildFinish();
protected:
void OnBtnClickedClose(UINT uNotifyCode, int nID, CView* pView);
void OnBtnClickedInsert(UINT uNotifyCode, int nID, CView* pView);
void OnBtnClickedScrollTop(UINT uNotifyCode, int nID, CView* pView);
void OnBtnClickedScrollBottom(UINT uNotifyCode, int nID, CView* pView);
SKINUI_DECLARE_MESSAGE_MAP()
protected:
CTreeItem* InsertTreeItem1(int nIndex);
void InsertListItem1(CTreeItem* pTreeItem, int nIndex);
CTreeItem* InsertTreeItem2(int nIndex);
void InsertListItem2(CTreeItem* pTreeItem, int nIndex);
private:
CTreeView* m_pTreeView1;
CTreeView* m_pTreeView2;
SKINUI_DECLARE_DYNCREATE(CDemoTreeViewLayout, CScrollLayout)
};
#### cpp文件
```cpp
#include <stdafx.h>
#include "DemoTreeViewLayout.h"
SKINUI_BEGIN_MESSAGE_MAP(CDemoTreeViewLayout, CScrollLayout)
ON_SKINUI_COMMAND(IDC_BUTTON_CLOSE, OnBtnClickedClose)
ON_SKINUI_COMMAND(IDC_BUTTON_INSERT, OnBtnClickedInsert)
ON_SKINUI_COMMAND(IDC_BUTTON_SCROLL_TOP, OnBtnClickedScrollTop)
ON_SKINUI_COMMAND(IDC_BUTTON_SCROLL_BOTTOM, OnBtnClickedScrollBottom)
SKINUI_END_MESSAGE_MAP()
CDemoTreeViewLayout::CDemoTreeViewLayout(CView* pParent)
: CScrollLayout(pParent)
, m_pTreeView1(NULL)
, m_pTreeView2(NULL)
{
}
void CDemoTreeViewLayout::OnBuildFinish()
{
CScrollLayout::OnBuildFinish();
m_pTreeView1 = dynamic_cast<CTreeView*>(GetChildById(IDC_TREEVIEW1));
if(m_pTreeView1)
{
for(int i = 0; i < 10; ++i)
{
CTreeItem* pTreeItem = InsertTreeItem1(i);
if(pTreeItem)
{
for(int j = 0; j < 10; ++j)
{
InsertListItem1(pTreeItem, j);
}
}
}
}
m_pTreeView2 = dynamic_cast<CTreeView*>(GetChildById(IDC_TREEVIEW2));
if(m_pTreeView2)
{
for(int i = 0; i < 10; ++i)
{
CTreeItem* pTreeItem = InsertTreeItem2(i);
if(pTreeItem)
{
for(int j = 0; j < 10; ++j)
{
InsertListItem2(pTreeItem, j);
}
}
}
}
}
void CDemoTreeViewLayout::OnBtnClickedClose(UINT uNotifyCode, int nID, CView* pView)
{
if(m_pTreeView2)
{
CListItem* pListItem = dynamic_cast<CListItem*>(pView->GetParent());
if(pListItem)
{
CRedrawLocker locker(m_pTreeView2);
m_pTreeView2->DeleteItem(pListItem);
m_pTreeView2->Layout();
}
}
}
void CDemoTreeViewLayout::OnBtnClickedInsert(UINT uNotifyCode, int nID, CView* pView)
{
static int nIndex = 10;
if(m_pTreeView2)
{
CTreeItem* pTreeItem = InsertTreeItem2(nIndex++);
if(pTreeItem)
{
CRedrawLocker locker(m_pTreeView2);
for(int j = 0; j < 10; ++j)
{
InsertListItem2(pTreeItem, j);
}
m_pTreeView2->Layout();
m_pTreeView2->ScrollBottom();
}
}
}
void CDemoTreeViewLayout::OnBtnClickedScrollTop(UINT uNotifyCode, int nID, CView* pView)
{
if(m_pTreeView2)
{
CListItem* pListItem = new CListItem(m_pTreeView2);
if(pListItem)
{
CRedrawLocker locker(m_pTreeView2);
m_pTreeView2->ScrollTop();
}
}
}
void CDemoTreeViewLayout::OnBtnClickedScrollBottom(UINT uNotifyCode, int nID, CView* pView)
{
if(m_pTreeView2)
{
CListItem* pListItem = new CListItem(m_pTreeView2);
if(pListItem)
{
CRedrawLocker locker(m_pTreeView2);
m_pTreeView2->ScrollBottom();
}
}
}
CTreeItem* CDemoTreeViewLayout::InsertTreeItem1(int nIndex)
{
CTreeItem* pTreeItem = new CTreeItem(m_pTreeView1);
if(pTreeItem)
{
pTreeItem->SetBackground(_T("ListItem.png"));
pTreeItem->SetLayout(_T("TreeItem.xml"));
pTreeItem->SetHeight(ITEM_HEIGHT_40);
pTreeItem->SetChildText(ID_TEXTVIEW, SkinUI::Format(_T("树节点%d"), nIndex));
m_pTreeView1->InsertItem(NULL, pTreeItem);
}
return pTreeItem;
}
void CDemoTreeViewLayout::InsertListItem1(CTreeItem* pTreeItem, int nIndex)
{
CListItem* pListItem = new CListItem(m_pTreeView1);
if(pListItem)
{
pListItem->SetBackground(_T("ListItem.png"));
pListItem->SetLayout(_T("ListItem.xml"));
pListItem->SetHeight(ITEM_HEIGHT_40);
pListItem->SetChildText(ID_TEXTVIEW, SkinUI::Format(_T("树叶节点%d"), nIndex));
m_pTreeView1->InsertItem(pTreeItem, pListItem);
}
}
CTreeItem* CDemoTreeViewLayout::InsertTreeItem2(int nIndex)
{
CTreeItem* pTreeItem = new CTreeItem(m_pTreeView2);
if(pTreeItem)
{
pTreeItem->SetBackground(_T("ListItem.png"));
pTreeItem->SetLayout(_T("TreeItem.xml"));
pTreeItem->SetHeight(ITEM_HEIGHT_40);
pTreeItem->SetChildText(ID_TEXTVIEW, SkinUI::Format(_T("树节点%d"), nIndex));
m_pTreeView2->InsertItem(NULL, pTreeItem);
}
return pTreeItem;
}
void CDemoTreeViewLayout::InsertListItem2(CTreeItem* pTreeItem, int nIndex)
{
CListItem* pListItem = new CListItem(m_pTreeView2);
if(pListItem)
{
pListItem->SetBackground(_T("ListItem.png"));
pListItem->SetLayout(_T("DemoListItem.xml"));
pListItem->SetHeight(ITEM_HEIGHT_60);
pListItem->SetChildImage(1, _T("Image.png"));
pListItem->SetChildText(2, SkinUI::Format(_T("姓名%d"), nIndex));
pListItem->SetChildText(3, SkinUI::Format(_T("消息消息消息消息消息消息消息消息%d"), nIndex));
m_pTreeView2->InsertItem(pTreeItem, pListItem);
}
}</code></pre>