Arquivo da categoria ‘C/C++’

Visual – MFC – CMenu – Resources – C++

Publicado: 26 de março de 2014 em C/C++

Um menu MFC em C++ pode ser criado de duas maneiras, a primeira é dinamicamente usando código C++ e mensagens do Windows derivando uma classe da CFrameWnd. Note que em MFC C++ um menu não é um componente encontrado na ToolBox e sim um Resource do Windows, então a segunda maneira de criar um menu C++ MFC é usando a janela de Resources.

CMenu

Um encapsulamento de Windows HMENU.

Resources

Este material se aplica a aplicativos de desktop baseados em Win32, visto que o conceito Win32 não é apenas para computadores 32bits e sim à referencia as APIs do Windows como já explicamos em nossos primeiros tópicos C++.

Neste caso o termo Resource pode se referir a Resource files ou seja, uma série de tipos de arquivos, incluindo:

O script recurso de arquivo (rc.), de um programa, um modelo de recurso de arquivo (. RCT), um recurso individual existente como um arquivo independente, como um arquivo de bitmap, ícone ou cursor que é referida a partir de um arquivo de rc ou um arquivo de cabeçalho gerado pelo ambiente de desenvolvimento, por exemplo Resource.h, que é referida a partir de um arquivo de rc.

Use a caixa de diálogo de Resources para adicionar um recursos a um projeto C + + em um aplicativo de desktop.

Visual Studio

  1. Para criar e manipular um menu em C++ siga os seguintes passos:
  2. Crie um Projeto MFC Aplicattion Dialog Based.
  3. Na janela Solution Explorer clique na aba Resource View ou chame a janela diretamente do menu, use a imagem abaixo para referencia.

    menu_resource

    Resources

  4. Insira o CMenu e digite seus itens como na figura acima.
  5. Crie os eventos para os itens do menu use a imagem abaixo como referencia:

    menu_evento

    Eventos

  6. No dialogo principal coloque no meio da janela um Edit Control e mude suas propriedades para sem bordas e apenas leitura, veja a figura abaixo:

    menu_design

    Design Time

  7. Olhe o código abaixo para completar o código gerado automaticamente, você deve obter um programa como este:

    menu_programa

    Programa CMenu

 

Exemplo:

No exemplo abaixo criamos um menu C++ MFC usando Resources, complete seu código com os trechos marcados do código abaixo para rodar o programa.

C++

// Código gerado automaticamente
// CriaMenuCppDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CriaMenuCpp.h"
#include "CriaMenuCppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

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

void CCriaMenuCppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_texto);
}

BEGIN_MESSAGE_MAP(CCriaMenuCppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_MENU1_ITEM1, &CCriaMenuCppDlg::OnMenu1Item1)
	ON_COMMAND(ID_MENU1_ITEM2, &CCriaMenuCppDlg::OnMenu1Item2)
	ON_COMMAND(ID_ITEM3_ITEM1, &CCriaMenuCppDlg::OnItem3Item1)
	ON_COMMAND(ID_MENU1_ITEM4, &CCriaMenuCppDlg::OnMenu1Item4)
	ON_COMMAND(ID_MENU2_ITEM1, &CCriaMenuCppDlg::OnMenu2Item1)
END_MESSAGE_MAP()

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

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

	// Desenvolvimento Aberto
	// Inicializa o menu

	CMenu menu;
	menu.LoadMenuW(IDR_MENU1);
	SetMenu(&menu);

	return TRUE;
}

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

// Desenvolvimento Aberto
// Eventos do Menu

static CString msg = L"Você clicou no: ";

void CCriaMenuCppDlg::OnMenu1Item1()
{
	m_texto.SetWindowTextW(msg + "Menu 1, Item 1");

}

void CCriaMenuCppDlg::OnMenu1Item2()
{
	m_texto.SetWindowTextW(msg + "Menu 1, Item 2");
}

void CCriaMenuCppDlg::OnItem3Item1()
{
	m_texto.SetWindowTextW(msg + "Menu 1 - Sub-Menu 1, Item 1");
}

void CCriaMenuCppDlg::OnMenu1Item4()
{
	m_texto.SetWindowTextW(msg + "Menu 1, Item 4");
}

void CCriaMenuCppDlg::OnMenu2Item1()
{
	m_texto.SetWindowTextW(msg + "Menu 2, Item 1");
}

Visual – MFC – Slider – C++

Publicado: 23 de março de 2014 em C/C++

Slider

Um controle deslizante, também conhecido como Track Bar, é um objeto de interface gráfica (GUI) com o qual o usuário pode definir um valor movendo um indicador, geralmente de uma forma horizontal. Em alguns casos, o usuário também pode clicar em um ponto no controle deslizante para alterar a configuração.

Visual Studio

slider

Para usar o componente Slider siga os seguintes passos:

  1. Crie um novo projeto MFC Dialog Based.
  2. Coloque um componente Static Text e  um componente Edit Control mude sua propriedade Border = False e Read Only = True.
  3. Coloque um componente Slider e mude sua propriedade Auto Ticks = True e Tick Marks = True.
  4. Coloque um componente Button e crie um evento BN_CLICKED.
  5. Crie uma variável para o Edit Control chamada m_valor.
  6. Crie uma variável par o Slider chamada m_slider.
  7. Use o código abaixo para completar o código criado automaticamente.

Exemplo:

Neste exemplo criamos um programa que exibe o valor de um Slider em um controle de edição. Neste exemplo use as partes marcadas do código abaixo para completar seu programa, pois existe código escrito para a inicialização dos componentes dentro dos diálogos criados automaticamente, exemplo: OnInitDialog.

C++


// Código Gerado automaticamente
//

#include "stdafx.h"
#include "Tbarcpp.h"
#include "TbarcppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

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

void CTbarcppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_valor);
	DDX_Control(pDX, IDC_SLIDER1, m_slider);
}

BEGIN_MESSAGE_MAP(CTbarcppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CTbarcppDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

// Desenvolvimento Aberto
// Cria variavel estatica

static CString mostraValor = L"O valor escolhido é: ";

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

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

	// Desenvolvimento Aberto
	// Inicializa componentes

	m_valor.SetWindowTextW(mostraValor);

	m_slider.SetRangeMin(1);
	m_slider.SetRangeMax(50);
	m_slider.SetPos(25);

	return TRUE;
}

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

// Desenvolvimento Aberto
// Nosso código começa aqui.
void CTbarcppDlg::OnBnClickedButton1()
{
	CString valor;
	int posicao = m_slider.GetPos();
	valor.Format(_T("%d") , posicao);
	m_valor.SetWindowTextW(mostraValor + valor);

}

Spin Control

É um controle de rotação, onde os usuários podem clicar em botões de seta para alterar gradualmente o valor dentro de sua caixa de texto numérico . A caixa de rotação refere-se à combinação de uma caixa de texto e seu controle de rotação associado.

O Spin Control é um controle que deve ser associado a um Edit Control através da propriedade AutoBuddy e é necessário  que os controles estejam alinhados e sejam colocados no dialogo na ordem de associação.

OnInitDialog

Este método é chamado em resposta à mensagem WM_INITDIALOG e o utilizamos quando precisamos inicializar componentes.

Uso do Spin Control

  • Geralmente o Spin Control é usado para entrada de dados numéricos.
  • Use Spin Controls quando se sabe exatamente os valores numéricos de escolha.
  • O Spin Control não deve ser usado sozinho ou com outro tipo de controle a não ser um Text Control.

Design

Desenhe um dialogo e insira os componentes na mesma ordem dispostos como imagem abaixo :

spincontrolVisual Studio

  1. Crie um projeto MFC Application Dialog Based chamado SpinControl.
  2. Coloque os componentes no dialogo e use a imagem acima para referencia.
  3. Adicione dois Static Text, dois Text Control, um Spin Control e um Button.
  4. Crie uma variável para o primeiro Edit Control chamada m_edit e para o segundo Edit Control crie uma variável chamada m_textoSpin.
  5. Crie uma variável para o Spin Control chamada m_spin.
  6. No Spin Control modifique suas propriedades: Alignment = Right Align, Auto Buddy = True e Set Buddy Integer = True.
  7. Crie um evento BN_CLICKED para o botão.
  8. Use o código abaixo para completar o código gerado automaticamente.

Exemplo:

Neste exemplo usamos um Spin Control e o associamos a um Text Control e inicializamos o SpinControl no dialogo OnInitDialog, parametrizando um valor mínimo e um valor máximo para o controle.

C#

// Código gerado Automaticamente

#include "stdafx.h"
#include "SpinControl.h"
#include "SpinControlDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

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

void CSpinControlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SPIN1, m_spin);
	DDX_Control(pDX, IDC_EDIT2, m_edit);
	DDX_Control(pDX, IDC_EDIT1, m_textoSpin);
}

BEGIN_MESSAGE_MAP(CSpinControlDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CSpinControlDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

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

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

	//  ****************************
	//  *                          *
	//  *  Desenvolvimento Aberto  *
	//  *  Inicializa Spin Control *
	//  *                          *
	//  ****************************

	m_spin.SetRange(1,10);

	return TRUE;
}

void CSpinControlDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this);

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(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 CSpinControlDlg::OnQueryDragIcon()
{
	return static_cast(m_hIcon);
}

//  ******************************
//  *                            *
//  *  Desenvolvimento Aberto    *
//  *  Nosso código Começa aqui. *
//  *                            *
//  ******************************

void CSpinControlDlg::OnBnClickedButton1()
{
	CString texto;
	m_textoSpin.GetWindowTextW(texto);
	m_edit.SetWindowTextW(texto);
}

ComboBox

Em computação, uma caixa de combinação é um elemento de interface gráfica. Um ComboBox, que permite ao usuário escolher uma das várias opções, pode ter duas formas muito diferentes. A forma padrão é a caixa de combinação não editável, que conta com um botão e uma lista suspensa de valores. A segunda forma, chamada de caixa de combinação editável, possui um campo de texto com um pequeno botão confinando-o. O usuário pode digitar um valor no campo de texto ou clique no botão para exibir uma lista drop-down.

ListBox

Em computação, uma caixa de listagem é um elemento de interface gráfica. Uma ListBox apresenta ao usuário um grupo de itens, exibidos em uma ou mais colunas. As listas podem ter muitos itens, por isso eles são muitas vezes colocados em painéis de rolagem.

OnShowWindow

É o evento que ocorre quando a o dialogo da aplicação é exibido.

Lbn_SelChange

É o evento que ocorre quando um estado de seleção é modificado.

Lbn_DblClk

É o evento que ocorre quando um duplo clique é efetuado no componente.

GetCurSel

Retorna o índice do item selecionado.

SetCurSel

Designa um item para ser selecionado.

Visual Studio

Para criar uma aplicação MFC siga os passos abaixo e use a imagem abaixo como referencia para o design do dialogo:

ComboList

  1. Crie um novo projeto de aplicação MFC C++ do tipo Dialog Based.
  2. Arraste no dialogo um GroupBox e modifique sua altura e largura para que caiba todos os componentes dentro dele, modifique sua propriedade Caption para: “ListBox e ComboBox”.
  3. Arraste um StaticText e mude sua propriedade Caption para: “Rolling Stones:”.
  4. Arraste um EditText e o posicione na frente do StaticText, mude suas propriedades  Border = False, Read Only = True e crie uma variável para ele chamada tmusica.
  5. Arraste um StaticText e mude seu Caption para: “ListBox –  Duplo clique nesta opção”.
  6. Arrate um ListBox e crie uma variável para ele chamada lista.
  7. Arraste um StaticText e mude seu Caption para: “Combobox – Escolha uma opção”.
  8. Arraste um ComboBox e crie uma variável para ele chamada combo.
  9. Crie um evento LBN_SELCHANGE para o componente combo e um outro LBN_DBLCLK para o componente lista.
  10. Complete seu código gerado automaticamente, com o código abaixo.

Exemplo:

Neste exemplo usamos um ComboBox e um ListBox para criar um programa C++ MFC e os eventos de cada um para interligar suas ações.

C++

// Código gerado automaticamente
// MFCApplication1Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "MFCApplication1.h"
#include "MFCApplication1Dlg.h"
#include "afxdialogex.h"
#include "Windowsx.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
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()

// CMFCApplication1Dlg dialog

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

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lista);
	DDX_Control(pDX, IDC_COMBO1, combo);
	DDX_Control(pDX, IDC_EDIT2, tmusica);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SHOWWINDOW()
	ON_CBN_SELCHANGE(IDC_COMBO1, &CMFCApplication1Dlg::OnCbnSelchangeCombo1)
	ON_LBN_DBLCLK(IDC_LIST1, &CMFCApplication1Dlg::OnLbnDblclkList1)
END_MESSAGE_MAP()

// CMFCApplication1Dlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control

}

void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMFCApplication1Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// **************************
// * Desenvolvimento Aberto *
// **************************
//
// Nosso código começa Aqui

// Evento ocorre quando o dialogo é iniciado
void CMFCApplication1Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CDialogEx::OnShowWindow(bShow, nStatus);

	// Declara uma Array de itens
	CString itens[] = { L"Satisfaction", L"Paint it Black", L"Wild Horses", L"Brown Sugar",
		L"Sympathy for the Devil", L"Start Me Up" };

	// Adiciona os itens aos componentes
	for (int i = 0; i < 6; i++)
	{
		lista.AddString(itens[i]);
	}

	for (int i = 0; i < 6; i++)
	{
		combo.AddString(itens[i]);
	}

	// Indica qual item sera selecionado
	lista.SetCurSel(0);
	combo.SetCurSel(0);

}

// Evento ocorre na mudança de estado do item
void CMFCApplication1Dlg::OnCbnSelchangeCombo1()
{
	CString texto;
	combo.GetLBText(combo.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	lista.SetCurSel(combo.GetCurSel());
}

// Evento Ocorre no duplo clique do mouse
void CMFCApplication1Dlg::OnLbnDblclkList1()
{
	CString texto;
	lista.GetText(lista.GetCurSel(), texto);
	tmusica.SetWindowTextW(texto);
	combo.SetCurSel(lista.GetCurSel());
}

Struct – Estrututas – C++ e C#

Publicado: 14 de março de 2014 em C#, C/C++

Na Ciência da computação, uma estrutura de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente.

Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação e algumas são altamente especializadas, destinando-se a algumas tarefas específicas.

Struct

A palavra-chave estrutura define um tipo de estrutura e / ou de uma variável de um tipo de estrutura. Um tipo struct é um tipo de valor que normalmente é usado para encapsular pequenos grupos de variáveis ​​relacionadas, tais como as coordenadas de um retângulo ou as características de um item em um inventário.

É uma declaração que define uma lista de variáveis ​​a serem colocados sob o mesmo nome em um bloco de memória, permitindo que as diferentes variáveis ​​possam ser acessadas através de um único ponteiro.

O struct é uma palavra chave derivada da linguagem C, e não possui seu equivalente em Java, mas possui seu equivalente em ABAP e Python.

Abap : https://desenvolvimentoaberto.wordpress.com/2014/02/20/tipos-complexos-structures-abap/

Em Python um tuplas também pode armazenar diferentes tipos dentro de uma estrutura: https://desenvolvimentoaberto.wordpress.com/2014/02/22/tuples-tuplas-python-linux/

Exemplo:

Neste programa criamos uma estrutura de clientes.

C++

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

struct Cliente
{
	string nome;
	string logradouro;
	string endereco;
	int numero;
	string complemento;
	string bairro;
	string cidade;
	string contato;
	string cargo;
	int cep;
	long RG;
	long cpf;

};

int _tmain(int argc, _TCHAR* argv[])
{
	Cliente dados;

		dados.nome = "Instituto Brasileiro de Geografia e Estatística";
		dados.logradouro = "Avenida";
		dados.endereco = "Beira Mar";
		dados.numero = 436;
		dados.complemento = "13o Andar";
		dados.bairro = "Castelo";
		dados.cep = 20021060;
		dados.cidade = "Rio de Janeiro";
		dados.contato = "Mario de Oliveira Aguiar";
		dados.cargo = "Gerente";
		dados.RG = 999999999;
		dados.cpf = 99999999999;

		cout << "Empresa: " << dados.nome << endl;
		cout << dados.logradouro << " " << dados.endereco << " " <<
			dados.numero << " " << dados.complemento << endl;
		cout << "Cep: " << dados.cep << " " << dados.bairro << " " << dados.cidade << endl;
		cout << endl;
		cout << "Contato: " << dados.contato << " - " << dados.cargo << endl;
		cout << "Rg: " << dados.RG << " - Cpf: " << dados.cpf << endl;

		cout << endl;
		system("pause");

	return 0;
}

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DesenvolvimentoAberto
{
    class Program
    {
         struct Cliente
        {
            public string nome;
            public string logradouro;
            public string endereco;
            public int numero;
            public string complemento;
            public string bairro;
            public string cidade;
            public string contato;
            public string cargo;
            public int cep;
            public long RG;
            public long cpf;
        }
        static void Main(string[] args)
        {
            Cliente dados = new Cliente();

            dados.nome = "Instituto Brasileiro de Geografia e Estatística";
            dados.logradouro = "Avenida";
            dados.endereco = "Beira Mar";
            dados.numero = 436;
            dados.complemento = "13o Andar";
            dados.bairro = "Castelo";
            dados.cep = 20021060;
            dados.cidade = "Rio de Janeiro";
            dados.contato = "Mario de Oliveira Aguiar";
            dados.cargo = "Gerente";
            dados.RG = 999999999;
            dados.cpf = 99999999999;

            Console.WriteLine( "Empresa: " + dados.nome);
            Console.WriteLine( dados.logradouro + " " + dados.endereco + " " +
                dados.numero + " " + dados.complemento);
            Console.WriteLine( "Cep: " + dados.cep + " " + dados.bairro + " " + dados.cidade );
            Console.WriteLine();
            Console.WriteLine( "Contato: " + dados.contato + " - " + dados.cargo);
            Console.WriteLine( "Rg: " + dados.RG + " - Cpf: " + dados.cpf );

            Console.WriteLine( );
            Console.ReadKey();
        }

    }
}

Diferentemente das linguagens baseadas no Microsoft Framework, o MFC utiliza C++ nativo e trabalha direto no conceito do sistema operacional Windows manipulando mensagens diretamente das APIs do Windows, portanto o que é muito simples como  programar em uma linguagem de alto nível, aqui fica um pouco diferente e um pouco mais complicado, é o caso de verificar o simples status de um Checkbox ou um Radiobutton.

RadioButton

Em computação, um botão de opção ou botão de rádio (Radiobutton) é um elemento de interface gráfica (isto é um componente widget) com dois estados: selecionado (ativado) e não-selecionado (desativado), quando o usuário pressiona um botão do mouse ou uma tecla como Espaço. Botões de opção são usados num grupo para apresentar um conjunto limitado de escolhas (duas ou mais) que são mutuamente exclusivas. Deste maneira, quando o usuário seleciona um outro botão no mesmo conjunto, o outro botão já selecionado torna-se automaticamente desativado.

GetCheckedRadioButton

É uma função que retorna um valor equivalente ao Checked (marcado) em linguagens de alto nível, neste caso recupera o ID do botão de opção atualmente verificado no grupo especificado e retorna o ID do botão de opção marcada, ou 0 se nenhum for selecionado.

Visual Studio

Escolha um novo projeto MFC Application, e marque Dialog Based, em Design Time, apague os componentes default e coloque um 3 StaticTexts, 4 Radiobuttons, 3 EditsControl e um botão. Mude as propriedades de um EditControl para Multiline = true, Read Only = true e Vertical Scroll = true. Use a imagem abaixo para referencia do design.

radiobutton_design

Aqui levamos em consideração que você já sabe como usar as variáveis para os componentes e como criar seus respectivos eventos, caso ainda não saiba veja nosso primeiro post MFC. Crie as variáveis como na imagem abaixo:

radiobutton_var

Crie os eventos BN_CLICKED para cada RadioButton e  para o botão. Use o código abaixo para completar o código gerado automaticamente, seu programa deve apresentar o seguinte resultado:

radiobutton_exe

Exemplo:

Neste exemplo criamos um grupo de botões de radio que efetua as 4 operações básicas da matemática, usando o evento de item e a verificação do seu estado.

C++


// RadioBDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RadioB.h"
#include "RadioBDlg.h"
#include "afxdialogex.h"
#include "Windowsx.h"
#include <assert.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
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()

// CRadioBDlg dialog

CRadioBDlg::CRadioBDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CRadioBDlg::IDD, pParent)

{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CRadioBDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, campo1);
	DDX_Control(pDX, IDC_EDIT2, campo2);
	DDX_Control(pDX, IDC_BUTTON1, botao);
	DDX_Control(pDX, IDC_EDIT3, texto);
}

BEGIN_MESSAGE_MAP(CRadioBDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_RADIO1, &CRadioBDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &CRadioBDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_RADIO3, &CRadioBDlg::OnBnClickedRadio3)
ON_BN_CLICKED(IDC_RADIO4, &CRadioBDlg::OnBnClickedRadio4)
ON_BN_CLICKED(IDC_BUTTON1, &CRadioBDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

// CRadioBDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRadioBDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CRadioBDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CRadioBDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/**

  Nosso Código começa Aqui

  **/

// Evento on click do RadioButton - Append menssagem

void CRadioBDlg::OnBnClickedRadio1()
{

		int tam = texto.GetWindowTextLengthW();
		texto.SetSel(tam, tam);
		texto.ReplaceSel(L"Somar:\n");

}

void CRadioBDlg::OnBnClickedRadio2()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Subtrair:\n");
}

void CRadioBDlg::OnBnClickedRadio3()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Multiplicar:\n");
}

void CRadioBDlg::OnBnClickedRadio4()
{

	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Dividir:\n");
}

// Evento On Click do Botão -- Efetua o calculo

void CRadioBDlg::OnBnClickedButton1()
{

	CString valor1;
	CString valor2;
	CString dTOstr;
	double total;

	//Captura valor dos TextControls
	campo1.GetWindowTextW(valor1);
	campo2.GetWindowTextW(valor2);

	// Verifica qual RadioButton esta checado
	int RadioStatus = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);

		switch (RadioStatus)
		{
		case IDC_RADIO1:
			{

				total = _wtof(valor1) + _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" + " + valor2 + L" = " + dTOstr + L"\n");
			}
			break;

			case IDC_RADIO2:
			{

				total = _wtof(valor1) - _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" - " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;

			case IDC_RADIO3:
			{

				total = _wtof(valor1) * _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" * " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;

			case IDC_RADIO4:
			{

				total = _wtof(valor1) / _wtof(valor2);
				dTOstr.Format(_T("%2.f"), total);
				int tam = texto.GetWindowTextLengthW();
				texto.SetSel(tam, tam);
				texto.ReplaceSel(valor1 + L" / " + valor2 + L" = " + dTOstr + L"\n");
			}
				break;
		}

}

No post anterior mostramos como criar um projeto MFC para usar C++ nativo direto das APIs do Windows, portanto não vamos entrar em detalhes agora sobre como criar os eventos e o DoDataExchange dos componentes. Crie um form de acordo com o design da imagem abaixo:

checkbox

Access Keys

Uma tecla de acesso é um caractere sublinhado no texto de um menu, item de menu, ou o rótulo de um controle como um botão. Ele permite o usuário “clicar” em um botão, pressionando a tecla ALT em combinação com a tecla de acesso predefinido. Por exemplo, se um botão executa um procedimento para imprimir um formulário, e, portanto, sua propriedade Text é definido como “Imprimir”, acrescentando um e comercial antes da letra “i” faz com que a letra “i”, seja sublinhada no texto do botão em tempo de execução tempo. O usuário pode executar o comando associado ao botão pressionando ALT + I. Você não pode ter uma chave de acesso para um controle que não pode receber o foco, por exemplo, um controle TabPage.

CheckBox

Representa um CheckBox do Windows

OnBnClicked

Ocorre quando o um botão recebe um click do mouse.

Visual Studio

  1. Abra um projeto MFC Application.
  2. Use a imagem acima para referencia.
  3. Coloque no form 1 componente Static text.
  4. Coloque no form 3 componentes CheckBox.
  5. Para todos os CheckBoxes a propriedade Caption precisa do Access Key &, exemplo: Opção 1 Alt + &X
  6. Coloque no form 1 componente EditControl.
  7. Mude as propriedade do EditControl: Multilines = True, Read Only = True, Vertical Scroll = True.
  8. Crie as variáveis para os CheckBox e para o EditControl.
  9. Crie um evento OnBnClicked para os 3 CheckBoxes.
  10. Use o código abaixo para completar o código gerado automaticamente.

Exemplo:

Neste exemplo mostramos como usar o componente checkbox seus eventos e como usar hotkeys para manipular o checkbox e imprimir o resultado criando um efeito do comando Append dentro de um componente EditControl Multiline.

C++


// CheckboxDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Checkbox.h"
#include "CheckboxDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CCheckboxDlg dialog

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

void CCheckboxDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CHECK1, opc1);
	DDX_Control(pDX, IDC_CHECK2, opc2);
	DDX_Control(pDX, IDC_CHECK3, opc3);
	DDX_Control(pDX, IDC_EDIT1, texto);
}

BEGIN_MESSAGE_MAP(CCheckboxDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_CHECK1, &CCheckboxDlg::OnBnClickedCheck1)
	ON_BN_CLICKED(IDC_CHECK2, &CCheckboxDlg::OnBnClickedCheck2)
	ON_BN_CLICKED(IDC_CHECK3, &CCheckboxDlg::OnBnClickedCheck3)

END_MESSAGE_MAP()

// CCheckboxDlg message handlers

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

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCheckboxDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCheckboxDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/** Nosso codigo começa aqui.

   O codigo abaixo mostra como criar o efeito da palavra chave
   APPEND em C++ em um EditControl Multiline.

   Para criar o efeito capturamos o tamanho do texto atual,
   criamos um ponto de selecão e
   trocamos a selecção pelo novo texto.

   **/

 void CCheckboxDlg::OnBnClickedCheck1()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 1\n");
}

void CCheckboxDlg::OnBnClickedCheck2()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 2\n");
}

void CCheckboxDlg::OnBnClickedCheck3()
{
	int tam = texto.GetWindowTextLengthW();
	texto.SetSel(tam, tam);
	texto.ReplaceSel(L"Você clicou no Checkbox 3\n");
}

Nós já desenvolvemos muitos aplicativos C++ Standard com saída para o console e no post anterior desenvolvemos um aplicativo C++ Visual usando diretamente a API do Windows para criar a GUI, agora vamos utilizar o método predefinido pela Microsoft para programação C++ em Windows, visto que também é possível utilizar o Framework e desenvolver aplicativos C++ usando o CLR. A seguir vamos saber mais sobre estes assuntos e sobre programação C++ para Windows.

.NET Framework

Microsoft .NET  é uma iniciativa da empresa Microsoft, que visa uma plataforma única para desenvolvimento e execução de sistemas e aplicações. Todo e qualquer código gerado para .NET pode ser executado em qualquer dispositivo que possua um framework de tal plataforma. Com ideia semelhante à plataforma Java, o programador deixa de escrever código para um sistema ou dispositivo específico, e passa a escrever para a plataforma .NET.

O .NET Framework é um conceito central no Visual Studio, bem como em todos os outros  produtos de desenvolvimento da Microsoft .NET.  O .NET Framework é composto de dois elementos: o Common Language Runtime (CLR ), em que o aplicativo é executado em um conjunto de bibliotecas chamado bibliotecas de classes do .NET Framework . As bibliotecas de classe Framework .NET fornecem o apoio funcional para o seu código e será necessário durante a execução do CLR , independente da linguagem de programação assim utilizada nos programas escritos em C++ , C#, ou qualquer das outras línguas que suportam o . NET Framework todos usam a mesma biblioteca .NET.

Existem dois tipos fundamentalmente diferentes de aplicativos C ++  que você pode desenvolver com o Microsoft Visual C++. Você pode escrever aplicações que executam nativamente em seu computador. Estas aplicações serão referidas a programas como C++ nativo , você escrever programas C++ nativo na versão do C++ definida pela ISO/IEC (International Standards Organization  e International Electrotechnical Commision ), este é o padrão da linguagem.

Você também pode escrever aplicativos para serem executados sob o controle do CLR em um versão estendida do C++ chamado C++/CLI. Estes programas irão ser encaminhados para programas como CLR , ou programas C++/CLI.

O NET Framework  não é estritamente parte do Visual C++, mas sim um componente do Sistema operacional Windows que torna mais fácil construir aplicações de software e serviços web.

O .NET Framework oferece vantagens substanciais em termos de viabilidade e segurança do código , bem como a capacidade de integrar o seu código C++ com código escrito em mais de 20 outras linguagens de programação que são alvo do .NET Framework. Uma ligeira desvantagem de segmentação do .NET Framework . É que não há uma penalidade de desempenho pequeno em comparação com código nativo, mas você não consegue perceber isso na maioria das circunstâncias ou seja quando você precisa de um desempenho maior é preciso usar código C++ nativo.

CLR

O Common Language Runtime (CLR) é um ambiente padronizado para a execução de programas escritos em uma ampla gama de linguagens de alto nível.

Em C++ o caderno de especificações da CLR está agora incorporada nos Fabricantes European Computer Manufacturers (ECMA) para o Common Language Infrastructure (CLI), o ECMA – 335, e também na norma ISO equivalente, ISO/IEC 23271, de modo que o CLR é uma aplicação do presente padrão.

O CLI é, essencialmente, um caderno de especificações para um ambiente de uma máquina virtual que permite que os aplicativos escrito em diversas linguagens de programação de alto nível sejam executados em sistema de diferente ambientes sem que o código fonte original seja alterado ou replicado. As especificações CLI referem se a uma linguagem intermediária padrão para a máquina virtual com uma linguagem de alto nível onde o código-fonte é compilado. Com o .NET Framework, esta linguagem intermediária é conhecida como Microsoft Intermediate Language (MSIL). Código na linguagem intermediária é finalmente mapeado para código de máquina pelo Just-in-time (JIT) quando você executa um programa. Claro que, o código na linguagem intermediária CLI pode ser executado em qualquer outro ambiente que tenha uma implementação CLI.

C++ no Windows

Você tem duas opções básicas para aplicações do Windows: Você pode escrever código que executa com o CLR, e você também pode escrever código que compila diretamente para código de máquina e, portanto, executa nativamente. Para as janelas com base aplicações que visam a CLR, você usa o Windows Forms como a base para a interface gráfica fornecida pelas bibliotecas do .NET Framework. Usando o Windows Forms permite o desenvolvimento GUI rápido, porque você monta a GUI graficamente a partir de componentes padronizados e têm o código gerado automaticamente.

Para executar nativamente o código, você tem várias maneiras de fazer este trabalho. Uma possibilidade é usar o Microsoft  Fundation Classes (MFC) para a programação da interface gráfica de usuário para a sua aplicação Windows. O MFC encapsula o Application Programming Interface (API) do sistema operacional Windows para a criação e controle da GUI e facilita muito o processo de desenvolvimento do programa.

C++

A API do Windows se originou muito antes da linguagem C++ chegar ao sistema, por isso não tem nenhuma das características orientada a objetos que seria de esperar se fosse escrito hoje, no entanto, você está não é obrigado a usar o MFC. Se você quer um melhor em desempenho, você pode escrever seu código C++ para acessar a API do Windows diretamente.

Conceitos Windows

Um programa do Windows, se é um programa nativo  C++ ou um programa escrito para o CLR, tem uma estrutura diferente daquela do programa típico de console que executa a partir da linha de comando, e é mais complicado. Em um programa de console você pode obter a entrada do teclado e escrever saída de volta para a linha de comando diretamente, ao passo que um programa do Windows pode acessar a entrada e instalações de saída do computador, apenas a título de funções fornecidas pelo ambiente do hospedeiro, não é permitido ter acesso direto aos recursos de hardware. Porque vários programas podem estar ativos de uma só vez no Windows, o Windows determina a aplicação de uma determinada entrada cru, como um clique do mouse ou o acionamento de uma tecla no teclado, é destinado a, e sinalizar o programa em causa. Assim, o sistema operacional Windows tem controle primário de toda comunicação com o usuário.

Windows Messages

Eventos em um aplicativo do Windows são ocorrências como ao usuário clicar com o mouse ou pressionando uma tecla ou se um temporizador atingir zero. O sistema operacional Windows registra cada evento em uma mensagem e coloca a mensagem em uma fila de mensagens para o programa para o qual a mensagem se destina. Assim uma mensagem do Windows é simplesmente um registro dos dados relativos a um evento, e a fila de mensagens para uma aplicação é apenas uma sequência de tais mensagens aguardando para serem processados pela aplicação, por envio de uma mensagem, o Windows pode dizer ao seu programa de que algo precisa ser feito, ou que algum informação tornou-se disponível, ou que um evento como um clique do mouse ocorreu. Se o seu programa está devidamente organizado, ele vai responder de forma adequada à mensagem. Tem muitos tipos diferentes de mensagens e eles podem ocorrer com muita frequência, muitas vezes até por segundo quando o mouse está sendo arrastado, por exemplo.

Um programa do Windows deve conter uma função especificamente para lidar com essas mensagens. a função é muitas vezes chamada WndProc () ou WindowProc (), embora ele não  tenha um nome específico porque o Windows acessa a função através de um ponteiro para uma função que você forneceu.

Você passa uma mensagem de volta para o Windows chamando uma função padrão fornecido pelo Windows chamada DefWindowProc (), o que proporciona o processamento de mensagem padrão.

Windows API

Todas as comunicações entre qualquer aplicativo do Windows e o próprio Windows usam o Windows Application Programming Interface, também conhecido como a API do Windows. Isto consiste em, literalmente, centenas de funções que são fornecidos como padrão com o sistema operacional Windows que fornece os meios pelos quais um aplicativo se comunica com o Windows, e vice-versa. A API do Windows foi desenvolvida nos dias em que C foi a principal língua em uso, muito antes do advento do C++, e, por esta razão, as estruturas, em vez de classes são frequentemente utilizadas para a passagem de alguns tipos de dados entre o Windows e o seu programa aplicativo.

A API do Windows abrange todos os aspectos das comunicações entre o Windows e a sua aplicação. Porque há um número tão grande de funções na API, utilizando-as na mão pode ser uma tarefa muito difícil.

Tipos de Dados Windows

O Windows define um número significativo de tipos de dados que são usados para especificar parâmetro de função, tipos e tipos de retorno na API do Windows. Estes tipos específicos do Windows também se propagam através de funções que são definida em MFC.

MICROSOFT FOUNDATION CLASSES

O Microsoft Foundation Classes (MFC) é um conjunto de classes predefinidas sobre a qual a programação Windows com Visual C++ é construída. Estas classes representam uma abordagem orientada a objeto para programação Windows que encapsula a API do Windows. O MFC não cumpri rigorosamente os princípios de orientação a objeto e de encapsulamento e ocultamento de dados, principalmente porque grande parte do código MFC foi escrito antes de tais princípios serem bem estabelecidos.

O processo de escrever um programa do Windows envolve a criação e uso de objetos MFC ou objetos de classes derivadas do MFC. No principal, você vai derivar suas próprias classes de MFC, com assistência considerável a partir das ferramentas especializadas em Visual C++ que tornam este trabalho muito mais fácil.

Como Criar uma Aplicação MFC

O MFC Application utiliza o método da Microsoft de Design Time, o “Design First, Code Later”, o que significa que você desenvolve o design da tela usando a IDE do Visual Studio, colocando os componentes diretamente da ToolBox no Form e pode manipular as propriedades e eventos dos componentes utilizando a janela Properties. Para nossa aplicação MFC utilize a imagem abaixo como referencia de design.

C++1

Visual Studio

  1. No menu Files escolha New Project.
  2. Na Lista de projetos C++ escolha MFC Application.
  3. Nomeie o projeto para: Concatenador e clique em OK.
  4. No Wizard clique em Next.
  5. Na pagina Application Type escolha: Dialog Based e clique em Finish.
  6. A IDE abre no modo Design Time, que possibilita você arrastar componentes da ToolBox para o Form aberto.
  7. Apague os componentes default do form, que são um Static Text e dois Buttons.
  8. Selecione na ToolBox e coloque no Form os seguintes componentes:
  9. Um componente Static Text.
  10. Três componentes Edit Control.
  11. Um componente Button e mude o seu texto para: Somar.
  12. Monte a disposição na tela de acordo com a figura acima.
  13. Clique com o botao direito do mouse em cima do primeiro componente Edit Control e escolha ADD Variable, no Wizard em variable name coloque o nome: texto1 e clique em Finish.
  14. Clique com o botao direito do mouse em cima do segundo componente Edit Control e escolha ADD Variable, no Wizard em variable name coloque o nome: texto2 e clique em Finish.
  15. Clique com o botao direito do mouse em cima do componente Button e escolha ADD Variable, no Wizard em variable name coloque o nome: botao e clique em Finish.
  16. Clique com o botao direito do mouse em cima do terceiro componente Edit Control e escolha ADD Variable, no Wizard em variable name coloque o nome: resultado e clique em Finish.
  17. Ainda no terceito Edit Control na janela de propriedades, mude Read Only para True.
  18. Clique com o botão direito em cima do componente Button e escolha: Add Event Handler, no Wizard em Message Type selecione BN_CLICKED clique em Add and EDIT.
  19. Neste momento uma nova unidade de codigo fonte é aberta com o evento escolhido, preencha a void do evento igual ao codigo abaixo.

Exemplo:

Neste exemplo criamos um programa visual em C++ utilizando MFC que concatena duas String, como usamos o conceito de “Design First e Code Later” da Microsoft você precisa apenas copiar o conteúdo da ultima void do código, todo o resto é gerado automaticamente.

C++

// Código Gerado automaticamente - MFC - Visual Studio 2013 - Ultimate
// Vá para o final do código
// Nossa implementação se trata apenas da ultima void

// ConcatenadorDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Concatenador.h"
#include "ConcatenadorDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
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()

// CConcatenadorDlg dialog

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

void CConcatenadorDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, texto1);
	DDX_Control(pDX, IDC_EDIT2, texto2);
	DDX_Control(pDX, IDC_BUTTON1, botao);
	DDX_Control(pDX, IDC_EDIT3, resultado);
}

BEGIN_MESSAGE_MAP(CConcatenadorDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CConcatenadorDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

// CConcatenadorDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CConcatenadorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CConcatenadorDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CConcatenadorDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

/*
*********************
** Evento do Botão **
*********************
*/

// Evento do Botão
void CConcatenadorDlg::OnBnClickedButton1()
{
	// TODO: Add your control notification handler code here

	// Copie este codigo

	CString _texto1;
	CString _texto2;
	CString concatena;

	texto1.GetWindowTextW(_texto1);
	texto2.GetWindowTextW(_texto2);

	concatena = _texto1 + _texto2;

	resultado.SetWindowText(concatena);
}

Você pode criar um aplicativo Win32 quando você quer fazer um aplicativo de desktop nativo que tem uma interface de usuário baseada em janelas e pode ser executado em versões do Windows a partir do Windows 95 para o Windows 8.1. Você pode usar qualquer uma das edições do Visual Studio, exceto a versão Express.

Um aplicativo Win32 é o termo convencional para um aplicativo que usa a mensagem de loops para lidar com  as mensagens do Windows diretamente em vez de usar um quadro como o Microsoft Foundation Classes (MFC), o Active Template Library (ATL), ou o .NET Framework..

Conceito Win32

Embora o termo é “Win32“, pode se referir a qualquer aplicativo de 32 bits ou um aplicativo de 64 bits. Um aplicativo Win32 em C ++ pode usar C Runtime (CRT) e Standard Template Library (STL), classes, funções, objetos COM, e qualquer uma das funções públicas do Windows, que coletivamente são conhecidas como a API do Windows.

Usando a API do Windows

Em nosso artigo de introdução ao visual C++ explicamos os conceitos básico da programação para Windows, neste post mostramos como isto é feito na pratica.

Basicamente uma aplicação para Windows onde não se utiliza nenhum método da Microsoft (Framework ou biblioteca de classes), além de suas APIs, podemos afirmar que um programa mínimo para o Windows que pode rodar em qualquer versão do sistema operacional é composto basicamente de duas funções, a primeira WinMain é responsável por criar uma aplicação de janelas e a segunda função chamada WndProc é responsável pelas mensagens do Windows. Existem muitas outras funções mas trabalhar com elas exigem um nível avançado de conhecimento em programação e da arquitetura do sistema operacional, veremos aos poucos os conceitos de arquitetura, tipos de variáveis e  regras básicas para utilizar as APIs do Windows.

 

Visual Studio

Para criar um programa Visual em C++ siga os passos abaixo:

  1. No menu File, clique em New, Project.
  2. Na caixa de dialogo para projetos C++, escolha Win32 Project.
  3. Nomeie o projeto de Hellocpp.
  4. No wizard de boas vindas, clique em Next.
  5. Na janela de parâmetros clique em Empty Project e clique no botão Finish.
  6. No Solution Explorer, clique com o botão direito em cima do nome do seu projeto e escolha: Add, New Item.
  7. Escolha um arquivo .cpp e o nomeie para hello.cpp.

Exemplo:

Neste exemplo criamos uma janela visual em mensagem de loops. Você pode usar o este código como um padrão para criar outros aplicativos baseados em Win32.

C++

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

// Variaveis globais

// Classe da janela principal.
static TCHAR szWindowClass[] = _T("win32app");

// String que aparece na barra de titulos
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

HINSTANCE hInst;

// Declarações de funções incluidas neste modulo:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = NULL;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

	if (!RegisterClassEx(&wcex))
	{
		MessageBox(NULL,
			_T("Call to RegisterClassEx failed!"),
			_T("Win32 Guided Tour"),
			NULL);

		return 1;
	}

	hInst = hInstance; // Guarda a instancia e manipula a variavel local.

	// Parametros para criar a janela
	// szWindowClass: nome da aplicação
	// szTitle: texto da barra de titulos
	// WS_OVERLAPPEDWINDOW: tipo da janela
	// CW_USEDEFAULT, CW_USEDEFAULT: posição inicial (x, y)
	// 500, 300: tamanho inicial (width, length)
	// NULL: parent desta janela
	// NULL: esta aplicação não tem uma barra de menu
	// hInstance: o primeiro parametro da WinMain
	// NULL: não é usado nesta aplicação

	HWND hWnd = CreateWindow(
		szWindowClass,
		szTitle,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT,
		500, 300,
		NULL,
		NULL,
		hInstance,
		NULL
		);

	if (!hWnd)
	{
		MessageBox(NULL,
			_T("Call to CreateWindow failed!"),
			_T("Win32 Guided Tour"),
			NULL);

		return 1;
	}

	// Parametros do ShowWindow :
	// hWnd: valor retornado do CreateWindow
	// nCmdShow: o quarto parametro do WinMain

	ShowWindow(hWnd,
		nCmdShow);
	UpdateWindow(hWnd);

	// Menssagem principal do loop:
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processa menssagem para a janela principal
//
//  WM_PAINT    - pinta a janela principal
//  WM_DESTROY  - posta e cancela menssagem e retorna
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR greeting[] = _T("Hello, World!");

	switch (message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);

		//Aqui sua aplicação é criada.
		// Para esta introdução nos só imprimiremos, "Hello, World!"
		// no canto esquerdo superior da janela.
		TextOut(hdc,
			5, 5,
			greeting, _tcslen(greeting));
		// fim da aplicação de layout.

		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
		break;
	}

	return 0;
}

Iterator

Em português iterador, é um objeto que permite a um programador examinar uma coleção ou container. Vários tipos de iteradores são frequentemente fornecidos através de uma interface de container. Apesar da interface e semântica de um determinado iterador serem fixas, iteradores são frequentemente implementados em termos de estruturas subjacentes a uma implementação de container e são muitas vezes ligados intimamente ao container para permitir a semântica operacional do iterador.

Observe que um iterador percorre e também dá acesso aos elementos de dados em um container, mas não realiza iteração (isto é, não sem alguma liberdade significativa tomada com este conceito ou com uso trivial da terminologia). Um iterador é tem um comportamento semelhante a um cursor de banco de dados. Iteradores datam da linguagem de programação CLU de 1974.

Collection

É uma coleção, às vezes chamada de um recipiente(container), é simplesmente um objeto que agrupa vários elementos em uma única unidade. Coleções são usadas ​​para armazenar, recuperar, manipular e comunicar dados agregados, ou seja uma coleção é um objeto que contém outros objetos, existem outras coleções com diferentes capacidades.

Historicamente, o quadro de coleções têm sido bastante complexo, o que lhes deu uma reputação de ter uma grande curva de aprendizagem. Os exemplos mais conhecidos de frameworks de coleções são o C ++ Standard Template Library (STL). A nomenclatura das APIs e suas sintaxes podem mudar de uma linguagem de programação para outra.

O framework de coleção e as suas APIs:

Collection é a raiz da hierarquia do conjunto. A coleção representa um grupo de objetos conhecidos como seus elementos.

A interface Collection é o mínimo denominador comum que todos os conjuntos implementam e é usado para passar coleções para manipular objetos quando generalidade máxima é desejada. Alguns tipos de coleções permitem elementos duplicados, e outros não.

  • SET – Está diretamente relacionada com a ideia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos.
  • List –  É uma coleção ordenada, pode conter valores duplicados, o controle da posição de cada elemento é acessado pelo seu índice.
  • Queue: é uma lista tipo FIFO (First-In-First-Out), também conhecida como fila.
  • Map: é uma lista de relação de chave-valor entre os elementos. Cada chave pode conter apenas um único valor associado.(um mapa não é uma coleção verdadeira).

Exemplos:

Neste exemplo criamos uma collection do tipo List e a alimentamos com nomes de musicas dos Beatles, usamos o iterator para navegar no dentro dos objetos da coleção como cursores de banco de dados, registro a registro, e os alteramos manualmente, fator que as coleções não permitem por default.

Java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Iterador
 {

 public static void main(String[] args)
 {
      List<String> colecao = new ArrayList<String>();

   // musicas dos Beatles
   colecao.add("Let it be");
   colecao.add("Dont let me down");
   colecao.add("Come togheter");
   colecao.add("Hey Jude");
   colecao.add("Twist and shout");

   // Usa iterator como um cursor de banco de dados
   Iterator<String>  iterador =  colecao.iterator();

   System.out.println("Cinco musicas dos Beatles:\n");

   while (iterador.hasNext())
   {
     Object item = iterador.next();
     System.out.println(item);
   }

   // Usa iterador como o result de um banco de dados.
   ListIterator<String>  iteradorLista = colecao.listIterator();

   // Update - altera lista
   while (iteradorLista.hasNext())
   {
     Object item = iteradorLista.next();
     iteradorLista.set("Beatles: " + item);
   }

   //Lista a coleção

   System.out.println("\nIverte a ordem da coleção:\n");
   while (iteradorLista.hasPrevious())
   {
     Object item = iteradorLista.previous();
     System.out.println(item);
   }
 }
}

C++

#include "stdafx.h"
#include <iostream>
#include <string>
#include <list>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
 {
  list<string> colecao;

  colecao.push_back("Let it be");
  colec}ao.push_back("Dont let me down");
  colecao.push_back("Come togheter");
  colecao.push_back("Hey Jude");
  colecao.push_back("Twist and shout");

  // Usa iterator como um cursor de banco de dados
  list<string>::const_iterator
  inicio(colecao.begin()),
  fim(colecao.end());

  list<string>::iterator altera;

  cout << "Cinco musicas dos Beatles:\n" << endl;
  for (; inicio != fim; ++inicio)
  {
   cout << *inicio << endl;
  }

// Usa iterador como o result de um banco de dados.
  // Update - altera lista
  for (altera = colecao.begin(); altera != colecao.end(); ++altera)
  {
    *altera =  "Beatles: " + *altera;
  }

  //Lista a coleção
  colecao.reverse();

  cout << "\nIverte a ordem da coleção:\n" << endl;

  for (altera = colecao.begin(); altera != colecao.end(); ++altera)
  {
   cout << *altera << endl;
  }
  system("pause");
  return 0;
 }

C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesenvolvimentoAberto
 {
     class Program
     {
         static void Main(string[] args)
         {
             List<String> colecao = new List<String>();

        // musicas dos Beatles
       colecao.Add("Let it be");
       colecao.Add("Dont let me down");
       colecao.Add("Come togheter");
       colecao.Add("Hey Jude");
       colecao.Add("Twist and shout");

       // Usa iterator como um cursor de banco de dados
       Console.WriteLine("Cinco musicas dos Beatles:\n");
       foreach( string item in colecao)
       {
          Console.WriteLine(item);
       }

       // Usa iterador como o result de um banco de dados.
       // Update - altera lista
       int i = 0;
       while (i <= colecao.Count() -1)
       {
          colecao[i] = "Beatles: " + colecao.ElementAt(i);
          i = i + 1;
       }

       //Lista a coleção
       colecao.Reverse();
       Console.WriteLine("\nIverte a ordem da coleção:\n");
       foreach( string item in colecao)
       {
          Console.WriteLine(item);
       }
       Console.ReadKey();
}
    }
 }