CImageList* SetImageList(CImageList * pImageList,int nImageListType)
如果树节点需要显示图标时,则必须先创建一个CImageList类的对象,并为其添加多个图像组成一个图像序列,然后调用SetImageList函数为树形控件设置图像序列,在用InsertItem插入节点时传入所需图像在图像序列中的索引即可。后面的例子中会演示。参数pImageList为指向图像序列类CImageList的对象的指针,若为NULL则删除树形控件的所有图像。参数nImageListType指定图像序列的类型,可以是TVSIL_NORMAL(普通图像序列)或TVSIL_STATE(状态图像序列,用图像表示节点的状态)。
DWORD_PTR GetItemData(HTREEITEM hItem) const;
获取树形控件中某个指定节点的附加32位数据。参数hItem为指定的树节点的句柄。
BOOL SetItemData(HTREEITEM hItem,DWORD_PTR dwData);
为树形控件中某个指定节点设置附加的32位数据。参数hItem同上,dwData为要设置的32位数据。
CString GetItemText(HTREEITEM hItem) const;
获取树形控件中某个指定节点的标签文本。参数hItem同上。返回值是包含标签文本的字符串。
BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);
为树形控件中某个指定节点设置标签文本。参数hItem同上,lpszItem为包含标签文本的字符串的指针。
HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;
获取树形控件中某个指定节点的下一个兄弟节点。参数hItem同上。返回值是下一个兄弟节点的句柄。
HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;
获取树形控件中某个指定节点的上一个兄弟节点。参数hItem同上。返回值是上一个兄弟节点的句柄。
HTREEITEM GetParentItem(HTREEITEM hItem) const;
获取树形控件中某个指定节点的父节点。参数hItem同上。返回值是父节点的句柄。
HTREEITEM GetRootItem( ) const;
获取树形控件根节点的句柄。
HTREEITEM GetSelectedItem( ) const;
获取树形控件当前选中节点的句柄。
BOOL DeleteAllItems( );
删除树形控件中的所有节点。删除成功则返回TRUE,否则返回FALSE。
BOOL DeleteItem(HTREEITEM hItem);
删除树形控件中的某个节点。参数hItem为要删除的节点的句柄。删除成功则返回TRUE,否则返回FALSE。
HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);
在树形控件中插入一个新节点。参数lpszItem为新节点的标签文本字符串的指针,参数nImage为新节点的图标在树形控件图像序列中的索引,参数nSelectedImage为新节点被选中时的图标在图像序列中的索引,参数hParent为插入节点的父节点的句柄,参数hInsertAfter为新节点的前一个节点的句柄,即新节点将被插入到hInsertAfter节点之后。
BOOL SelectItem(HTREEITEM hItem);
选中指定的树节点。参数hItem为要选择的节点的句柄。若成功则返回TRUE,否则返回FALSE。
五.程序实例
1.简单步骤:创建
基于对话框的MFC工程tree,删除掉“确定”和“取消”按钮,和静态文本框。添加树形控件,设置属性Has Buttons、Has Lines和Lines At Root都设为True,为了在鼠标划过某个节点时显示提示信息还需要将Info Tip和ToolTip属性设为True。在vs资源视图里添加Icon,在此自己画三个32x32的Icon图标;为树形控件添加变量m_tree,并在treeDlg.h文件中为treeDlg类添加成员对象:CImageList m_imageList;在对话框初始化时,编辑树形控件。在添加三个对话框时,其ID分别为IDC_DIALOG1、IDC_DIALOG2、IDC_DIALOG3,在treeDlg.h中添加 Cdialog * m_treepages[3],并在构造函数中为它们分配空间,要把对话框的属性style和Border设为child和NONE .如下为treeDlg.cpp
-
// treeDlg.cpp : 实现文件
-
//
-
-
#include "stdafx.h"
-
#include "tree.h"
-
#include "treeDlg.h"
-
#include "afxdialogex.h"
-
#include "Cdialog1.h"
-
#include "Cdialog2.h"
-
#include "Cdialog3.h"
-
-
#ifdef _DEBUG
-
#define new DEBUG_NEW
-
#endif
-
-
-
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
-
-
class CAboutDlg : public CDialogEx
-
{
-
public:
-
CAboutDlg();
-
-
// 对话框数据
-
enum { IDD = IDD_ABOUTBOX };
-
-
protected:
-
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
-
-
// 实现
-
protected:
-
DECLARE_MESSAGE_MAP()
-
};
-
-
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
-
{
-
}
-
-
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
-
{
-
CDialogEx::DoDataExchange(pDX);
-
}
-
-
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
-
END_MESSAGE_MAP()
-
-
-
// CtreeDlg 对话框
-
-
-
-
-
CtreeDlg::CtreeDlg(CWnd* pParent /*=NULL*/)
-
: CDialogEx(CtreeDlg::IDD, pParent)
-
{
-
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
-
m_treepages[0]=new Cdialog1;
-
m_treepages[1]=new Cdialog2;
-
m_treepages[2]=new Cdialog3;
-
}
-
-
void CtreeDlg::DoDataExchange(CDataExchange* pDX)
-
{
-
CDialogEx::DoDataExchange(pDX);
-
DDX_Control(pDX, IDC_TREE1, m_tree);
-
}
-
-
BEGIN_MESSAGE_MAP(CtreeDlg, CDialogEx)
-
ON_WM_SYSCOMMAND()
-
ON_WM_PAINT()
-
ON_WM_QUERYDRAGICON()
-
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CtreeDlg::OnSelchangedTree)
-
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, &CtreeDlg::OnBeginlabeleditTree)
-
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, &CtreeDlg::OnEndlabeleditTree1)
-
ON_NOTIFY(TVN_GETINFOTIP, IDC_TREE1, &CtreeDlg::OnGetInfoTipTree)
-
-
END_MESSAGE_MAP()
-
-
-
// CtreeDlg 消息处理程序
-
-
BOOL CtreeDlg::OnInitDialog()
-
{
-
CDialogEx::OnInitDialog();
-
-
// 将“关于...”菜单项添加到系统菜单中。
-
-
// IDM_ABOUTBOX 必须在系统命令范围内。
-
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
-
ASSERT(IDM_ABOUTBOX < 0xF000);
-
-
CMenu* pSysMenu = GetSystemMenu(FALSE);
-
if (pSysMenu != NULL)
-
{
-
BOOL bNameValid;
-
CString strAboutMenu;
-
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
-
ASSERT(bNameValid);
-
if (!strAboutMenu.IsEmpty())
-
{
-
pSysMenu->AppendMenu(MF_SEPARATOR);
-
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
-
}
-
}
-
-
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
-
// 执行此操作
-
SetIcon(m_hIcon, TRUE); // 设置大图标
-
SetIcon(m_hIcon, FALSE); // 设置小图标
-
-
// TODO: 在此添加额外的初始化代码
-
HTREEITEM hItem,hSubItem,hThidItem;
-
HICON hIcon[4];
-
hIcon[0]=AfxGetApp()->LoadIconW(IDI_Parent1);
-
hIcon[1]=AfxGetApp()->LoadIconW(IDI_Parent2);
-
hIcon[2]=AfxGetApp()->LoadIconW(IDI_Parent3);
-
hIcon[3]=AfxGetApp()->LoadIconW(IDR_MAINFRAME);
-
m_imagelist.Create(32,32,ILC_COLOR32,3,3);
-
for (int i=0; i<4; i++)
-
{
-
m_imagelist.Add(hIcon[i]);
-
}
-
m_tree.SetImageList(&m_imagelist, TVSIL_NORMAL);
-
-
hItem=m_tree.InsertItem(_T("Parent1"),3,3,TVI_ROOT);
-
hSubItem=m_tree.InsertItem(_T("child1"),1,1,hItem);
-
m_tree.SetItemData(hSubItem,1);
-
hThidItem=m_tree.InsertItem(_T("subchild1"),2,2,hSubItem);
-
m_tree.SetItemData(hThidItem,2);
-
hThidItem=m_tree.InsertItem(_T("subchild2"),2,2,hSubItem,hThidItem);
-
m_tree.SetItemData(hThidItem,3);
-
hSubItem=m_tree.InsertItem(_T("child2"),1,1,hItem);
-
m_tree.SetItemData(hSubItem,4);
-
hSubItem=m_tree.InsertItem(_T("child3"),1,1,hItem,hSubItem);
-
m_tree.SetItemData(hSubItem,5);
-
hSubItem=m_tree.InsertItem(_T("child4"),1,1,hItem,hSubItem);
-
m_tree.SetItemData(hSubItem,6);
-
hItem=m_tree.InsertItem(_T("Parent2"),3,3,TVI_ROOT); //作为一个根项添加
-
m_tree.SetItemData(hItem,7);
-
hItem=m_tree.InsertItem(_T("Parent3"),3,3,TVI_ROOT,hItem);
-
m_tree.SetItemData(hItem,8);
-
-
m_tree.SetBkColor(RGB(0,250,255));
-
-
m_treepages[0]->Create(IDD_DIALOG1,this);
-
m_treepages[1]->Create(IDD_DIALOG2,this);
-
m_treepages[2]->Create(IDD_DIALOG3,this);
-
m_treepages[0]->ShowWindow(SW_HIDE);
-
m_treepages[1]->ShowWindow(SW_HIDE);
-
m_treepages[2]->ShowWindow(SW_HIDE);
-
//把dialog放到合适的位置
-
CRect rect;
-
GetClientRect(rect);
-
rect.left=250;
-
m_treepages[0]->MoveWindow(rect);
-
m_treepages[1]->MoveWindow(rect);
-
m_treepages[2]->MoveWindow(rect);
-
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
-
}
-
-
void CtreeDlg::OnSysCommand(UINT nID, LPARAM lParam)
-
{
-
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
-
{
-
CAboutDlg dlgAbout;
-
dlgAbout.DoModal();
-
}
-
else
-
{
-
CDialogEx::OnSysCommand(nID, lParam);
-
}
-
}
-
-
// 如果向对话框添加最小化按钮,则需要下面的代码
-
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
-
// 这将由框架自动完成。
-
-
void CtreeDlg::OnPaint()
-
{
-
if (IsIconic())
-
{
-
CPaintDC dc(this); // 用于绘制的设备上下文
-
-
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
-
-
// 使图标在工作区矩形中居中
-
int cxIcon = GetSystemMetrics(SM_CXICON);
-
int cyIcon = GetSystemMetrics(SM_CYICON);
-
CRect rect;
-
GetClientRect(&rect);
-
int x = (rect.Width() - cxIcon + 1) / 2;
-
int y = (rect.Height() - cyIcon + 1) / 2;
-
-
// 绘制图标
-
dc.DrawIcon(x, y, m_hIcon);
-
}
-
else
-
{
-
CDialogEx::OnPaint();
-
}
-
}
-
-
//当用户拖动最小化窗口时系统调用此函数取得光标
-
//显示。
-
HCURSOR CtreeDlg::OnQueryDragIcon()
-
{
-
return static_cast<HCURSOR>(m_hIcon);
-
}
-
-
-
-
void CtreeDlg::OnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
-
{
-
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
-
// TODO: 在此添加控件通知处理程序代码
-
UpdateData(true);
-
HTREEITEM selItem;
-
CString curtext;
-
//获得选择项
-
selItem=m_tree.GetSelectedItem();
-
curtext=m_tree.GetItemText(selItem);
-
SetDlgItemTextW(IDC_EDIT2,curtext);
-
SetWindowTextW(curtext);
-
-
if(curtext=="child1")
-
{
-
m_treepages[1]->ShowWindow(SW_SHOW);
-
m_treepages[0]->ShowWindow(SW_HIDE);
-
m_treepages[2]->ShowWindow(SW_HIDE);
-
}
-
else if (curtext=="child2")
-
{
-
m_treepages[0]->ShowWindow(SW_SHOW);
-
m_treepages[1]->ShowWindow(SW_HIDE);
-
m_treepages[2]->ShowWindow(SW_HIDE);
-
}
-
else if (curtext=="child3")
-
{
-
m_treepages[0]->ShowWindow(SW_HIDE);
-
m_treepages[1]->ShowWindow(SW_HIDE);
-
m_treepages[2]->ShowWindow(SW_SHOW);
-
}
-
else
-
{
-
m_treepages[0]->ShowWindow(SW_HIDE);
-
m_treepages[1]->ShowWindow(SW_HIDE);
-
m_treepages[2]->ShowWindow(SW_HIDE);
-
}
-
UpdateData(false);
-
*pResult = 0;
-
}
-
-
-
void CtreeDlg::OnBeginlabeleditTree(NMHDR *pNMHDR, LRESULT *pResult)
-
{
-
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
-
// TODO: 在此添加控件通知处理程序代码
-
-
if(pTVDispInfo->item.lParam == 0)
-
{
-
*pResult = 1;//取消编辑
-
}
-
else
-
*pResult = 0;
-
-
}
-
-
-
void CtreeDlg::OnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
-
{
-
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
-
// TODO: 在此添加控件通知处理程序代码
-
*pResult = 0;
-
if (pTVDispInfo->item.pszText != NULL)
-
{
-
m_tree.SetItemText(pTVDispInfo->item.hItem,pTVDispInfo->item.pszText);
-
}
-
}
-
-
-
void CtreeDlg::OnGetInfoTipTree(NMHDR *pNMHDR, LRESULT *pResult)
-
{
-
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
-
// TODO: 在此添加控件通知处理程序代码
-
*pResult = 0;
-
-
HTREEITEM hRoot = m_tree.GetRootItem(); // 获取树的根节点
-
CString strText; // 每个树节点的提示信息
-
if (pGetInfoTip->hItem ==hRoot)
-
{
-
// 如果鼠标划过的节点是根节点,则提示信息为空
-
strText = _T("根节点");
-
}
-
else
-
{
-
// 如果鼠标划过的节点不是根节点,则将该节点的附加32位数据格式化为字符串
-
strText.Format(_T("它的节点号为: %d"),pGetInfoTip->lParam);
-
}
-
-
// 将strText字符串拷贝到pTVTipInfo结构体变量的pszText成员中,这样就能显示内容为strText的提示信息
-
wcscpy(pGetInfoTip->pszText, strText);
-
}