Visual – MFC – TabControl – InsertItem – TcnSelChange – C++

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

Em interfaces gráficas de usuário (GUI), uma interface tabulada  ou um Tab Control  é um widget que permite a interação de vários documentos ou painéis para ser contido dentro de uma única janela, usando guias como um widget de navegação para alternar entre conjuntos de painéis.

TabControl

O componente TabControl para C++ é um componente complexo, quando você o arrasta para o dialogo, logo você descobre que este componente não é nada intuitivo, um modo simples e eficaz de controlar o TabControl é usando um jogo de visualização entre suas guias e os componentes no dialogo manipulando seu evento de mudança de seleção de abas manualmente. Porem se torna um pouco complexo caso haja muitos componentes em um dialogo. Você também pode usar as classes CTabCtrl e CPropertySheet para criar um controle de tabulação e suas respectivas paginas.

Visual Studio

Para usar o componente Tab Control em uma aplicação C++ siga os seguintes passos:

  1. Crie um programa MFC Dialog Based para C++.
  2. Adicione no dialogo um componente Tab Control.
  3. Adicione 3 componentes Edit Control e 3 componentes Static Text.
  4. Mude os nomes dos componentes Static Text para: IDC_rotulo1, IDC_rotulo2, IDC_rotulo3.
  5. Crie uma variável para o componente Tab Control chamada: m_abas.
  6. Crie uma variável para cada Edit Control chamada: m_numero1, m_numero2 e m_total.
  7. Crie um evento TCN_SELCHANGE para o Tab Control.
  8. Seu dialogo deve conter os componentes nomeados como na figura abaixo:

    tabcontrol-comp

    Primeiro Passo – Design

  9. Sobreponha os componentes alinhados  um e cima do outro como mostra a imagem a seguir:

    tabcontrol

    Segundo Passo – Design

  10. Complete o seu código gerado automaticamente com os trechos marcados do código abaixo.
  11. Compile e rode o programa.

Efeito da Aplicação

A sobre posição dos componentes do dialogo combinado com evento de mudança do Tab Control nos dará uma aplicação com o seguinte efeito:

tabcontrol-programa1

Tab Control – Aba 1

tabcontrol-programa2

Tab Control – Aba – 2

tabcontrol-programa3

Tab Control – Aba 3

 

 

 

 

 

 

 

 

 

 

Exemplo:

Neste exemplo criamos um painel tabulado com 3 guias onde na primeira e na segunda guia o usuário entrará com um numero inteiro e na terceira guia sobre o evento TCN_SELCHANGE efetuaremos a soma dos números escolhidos.

C++

// Código gerado automaticamente
// tabcontrol-cppDlg.cpp : implementation file
//

#include "stdafx.h"
#include "tabcontrol-cpp.h"
#include "tabcontrol-cppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CtabcontrolcppDlg::CtabcontrolcppDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CtabcontrolcppDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CtabcontrolcppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TAB1, m_abas);
	DDX_Control(pDX, IDC_EDIT2, m_numero2);
	DDX_Control(pDX, IDC_EDIT1, m_numero1);
	DDX_Control(pDX, IDC_EDIT3, m_total);
}

BEGIN_MESSAGE_MAP(CtabcontrolcppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CtabcontrolcppDlg::OnTcnSelchangeTab1)
	
END_MESSAGE_MAP()

BOOL CtabcontrolcppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);		
	SetIcon(m_hIcon, FALSE);	

	// TODO: Add extra initialization here

   // Desenvolvimento Aberto --->>
   // Inicialização do programa

	m_abas.InsertItem(0, _T("Numero 1"));
	m_abas.InsertItem(1, _T("Numero 2"));
	m_abas.InsertItem(2, _T("Total"));

	// Inicializa visualização de componentes
	GetDlgItem(IDC_rotulo1)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_rotulo2)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_rotulo3)->ShowWindow(SW_HIDE);
	
	GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);

	return TRUE;  
}

void CtabcontrolcppDlg::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 CtabcontrolcppDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// Evento de mudança de abas do Tab Control

void CtabcontrolcppDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// Captura evento de mudança
	int mudar = m_abas.GetCurSel();

	// Seleciona aba corrente
	if (mudar == 0)
	{
		// Exibe os itens na tela de acordo com aba selecionada
		GetDlgItem(IDC_rotulo1)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_rotulo2)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_rotulo3)->ShowWindow(SW_HIDE);
		
		GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
		
	}
	
	if (mudar == 1)
	{
		// Exibe os itens na tela de acordo com aba selecionada
		GetDlgItem(IDC_rotulo1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_rotulo2)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_rotulo3)->ShowWindow(SW_HIDE);
		
		GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_EDIT3)->ShowWindow(SW_HIDE);
	}

	if (mudar == 2)
	{
		// Exibe os itens na tela de acordo com aba selecionada
		GetDlgItem(IDC_rotulo1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_rotulo2)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_rotulo3)->ShowWindow(SW_SHOW);
		
		GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_EDIT3)->ShowWindow(SW_SHOW);

		// Declara variaveis
		CString valor1;
		CString valor2;
		CString total;

		// Alimenta variaveis 
		m_numero1.GetWindowTextW(valor1);
		m_numero2.GetWindowTextW(valor2);

		// Efetua calculo
		int soma = _wtoi(valor1) + _wtoi(valor2);
		
		// Converte variavel inteira para Cstring
		total.Format(_T("%d"), soma);
		
		// Exibe valor da variavel na tela
		m_total.SetWindowTextW(total);

	}

	*pResult = 0; 
}
Anúncios

Deixe um comentário

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

Logotipo do WordPress.com

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

Foto do Google+

Você está comentando utilizando sua conta Google+. 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 )

w

Conectando a %s