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; }