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

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 )

Conectando a %s