Visual – MFC – Tree Control – CTreeCtrl, HTREEITEM, GetSelectedItem, GetItemText – C++

Publicado: 15 de abril de 2014 em C/C++

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:

  1. Crie um novo projeto MFC Dialog Based.
  2. Arraste para o dialogo dois componentes Static Text e um Componente Tree Control.
  3. Mude a propriedade Has_Button do componente Tree Control para True.
  4. Crie uma variável chamada m_disco para o Tree Control.
  5. Mude a propriedade ID de um dos Static Text para IDC_Rodape.
  6. Disponha os componentes como na figura abaixo:

    treecontrol-design

    Tree Control – Design

  7. Crie um evento NM_DBCLK para o Tree Control.
  8. Preencha seu código gerado automaticamente com os trechos marcados do código abaixo.
treecontrol-programa

Tree Control – programa

 

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

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s