Em computação, um tree view (literalmente do inglês vista de árvore) é um elemento de interface gráfica (isto é um componente widget) que permite ao usuário mostrar dados hierárquicos em forma de árvore, expandir ou recolher os ramos e nós. Dependendo do wiget toolkit ou aplicação em uso, existem muitos estilos de apresentação gráfica de tree views.
CTreeCtrl
Um controle de árvore, representada pela classe CTreeCtrl, é uma janela que exibe uma lista hierárquica de itens, tais como os títulos de um documento, as entradas em um índice, ou os arquivos e diretórios em um disco. Cada item consiste em um rótulo e uma imagem bitmap opcional e cada item pode ter uma lista de subitens associados. Ao clicar em um item, o usuário pode expandir e recolher a lista associada de subitens. A árvore de diretórios no painel do lado esquerdo do File Explorer é um exemplo de um controle de árvore.
HTREEITEM
Representa um nó na arvore de controle.
GetSelectedItem
Retorna o item selecionado da arvore de controle.
GetItemText
Retorna o texto de um item.
Visual Studio
Para usar um Tree Control siga os seguintes passos:
- Crie um novo projeto MFC Dialog Based.
- Arraste para o dialogo dois componentes Static Text e um Componente Tree Control.
- Mude a propriedade Has_Button do componente Tree Control para True.
- Crie uma variável chamada m_disco para o Tree Control.
- Mude a propriedade ID de um dos Static Text para IDC_Rodape.
- Disponha os componentes como na figura abaixo:
- Crie um evento NM_DBCLK para o Tree Control.
- Preencha seu código gerado automaticamente com os trechos marcados do código abaixo.
Exemplo:
Neste exemplo usamos uma visão de arvore para exibir uma discografia musical, você pode abrir e fechar os nós do modelo de dados em visão de árvore, um duplo clique do mouse em cada nó dispara um evento para que exibido a descrição do nó corrente em um rodapé.
C++
// Código gerado automaticamente
// treeviewcppDlg.cpp : implementation file
//
#include "stdafx.h"
#include "treeviewcpp.h"
#include "treeviewcppDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Desenvolvimento Aberto
// Inicializa constantes, variaveis e arrays
const int itemb = 14;
const int itemr = 12;
CString albumB = L"Please, Please Me";
CString MusicaB[itemb] = { L"I Saw Her Standing There", L"Misery", L"Anna (Go to Him)",
L"Chains", L"Boys", L"Ask Me Why", L"Please Please Me", L"Love Me Do",
L"P.S. I Love You", L"Baby It's You", L"Do You Want To Know A Secret?",
L"A Taste of Honey", L"There's A Place", L"Twist and Shout" };
CString albumR = L"The Rolling Stones";
CString MusicaR[itemr] = { L"Route 66", L"I Just Want to Make Love to You", L"Honest I Do",
L"Mona (I Need You Baby)", L"You Can Make It If You Try", L"Little by Little",
L"I\'m a King Bee", L"Carol", L"Tell Me (You \'re Coming Back)", L"Can I Get a Witness",
L"Tell Me (You\'re Coming Back)", L"Walking the Dog" };
CtreeviewcppDlg::CtreeviewcppDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CtreeviewcppDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CtreeviewcppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_disco);
}
BEGIN_MESSAGE_MAP(CtreeviewcppDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_DBLCLK, IDC_TREE1, &CtreeviewcppDlg::OnNMDblclkTree1)
END_MESSAGE_MAP()
BOOL CtreeviewcppDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// Desenvolvimento Aberto
// Inicializa Tree Control
// Cria nós da arvore
HTREEITEM arvore, bandasB, bandasR, albunsB, albunsR, listaB, listaR ;
// Insere nós
arvore = m_disco.InsertItem(L"Discografia", TVI_ROOT);
bandasB = m_disco.InsertItem(L"Beatles", arvore);
bandasR = m_disco.InsertItem(L"Rolling Stones", arvore);
albunsB = m_disco.InsertItem(albumB, bandasB);
albunsR = m_disco.InsertItem(albumR, bandasR);
for (int i = 0; i < itemb; i++)
{
listaB = m_disco.InsertItem(MusicaB[i], albunsB);
}
for (int i = 0; i < itemr; i++)
{
listaR = m_disco.InsertItem(MusicaR[i], albunsR);
}
return TRUE;
}
void CtreeviewcppDlg::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 CtreeviewcppDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
// Desenvolvimento Aberto
// Evento duplo clique do tree control
void CtreeviewcppDlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
// Captura item selecionado
HTREEITEM hItem = m_disco.GetSelectedItem();
// retorna texto do item
CString item;
item = m_disco.GetItemText(hItem);
// Adiona texto em controle statico
GetDlgItem(IDC_Rodape)->SetWindowTextW(item);
*pResult = 0;
}



