Visual – MFC – PopUpMenu, OnContextMenu, GetClientRect, ClientToScreen, TrackPopUpMenu, Assert – C++

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

PopUpMenu

Um menu de contexto ou um menu pop-up é um menu em uma interface gráfica do usuário (GUI) que aparece em cima de interação do usuário, como uma operação de clique com o botão direito do mouse. Um menu de contexto oferece um conjunto limitado de opções que estão disponíveis no estado atual, ou contexto, do sistema operacional ou aplicativo. Normalmente, as opções disponíveis são as ações relacionadas com o objeto selecionado.

Os menus de contexto foram introduzidos no ambiente Smalltalk do computador Xerox Alto, onde eram chamados menus pop-up. O sistema operacional NEXTSTEP desenvolveu a ideia, incorporando a funcionalidade em que o botão do meio ou o da direita traziam o menu principal na posição do mouse, eliminando a necessidade de mover o ponteiro por toda a tela. Esse menu principal era vertical e mudava de acordo com o texto da operação do sistema.

OnContextMenu

Evento da mensagem WM_CONTEXTMENU, chamado ao usuário clicar no botão direito do mouse na janela de dialogo.

GetClientRect

Cópia as coordenadas da área de cliente CWnd na estrutura apontada pelo lpRect.

ClientToScreen

Converte as coordenadas do cliente de um determinado ponto ou retângulo na tela em coordenadas de tela.

TrackPopUpMenu

Exibe um menu pop-up flutuante no local especificado e controla a seleção de itens no menu pop-up.

Assert

Avalia um argumento. Se o resultado for 0, a macro imprime uma mensagem de diagnóstico e anula o programa. Se a condição for diferente de zero, o programa não faz nada.

Visual Studio

Neste ponto presumimos que você já sabe como criar componentes e menus no Visual Studio para um projeto MFC Application C++, caso ainda não saiba veja nossos posts anteriores.

  1. Coloque um componente Static Text e um componente Edit Control no dialogo, use a imagem abaixo para referencia:

    popupmenu3

    Design

  2. Mude as propriedades para o EditControl para Border = False e Read Only = True.
  3. Crie uma variável para o Edit Control chamada m_texto.
  4. Crie um menu usando Resources, veja a imagem abaixo como referencia:

    popupmenu2

    Menu

  5. No Class Wizard adicione a mensagem WM_CONTEXTMENU, use a figura abaixo como referencia:

    popupmenu

    Class Wizard

  6. Complete o código gerado automaticamente com os trechos marcados no código abaixo.

Exemplo:

Neste exemplo criamos um menu e usamos a mensagem do Windows que contém o clique do botão direito do mouse e a usamos para exibir o menu de contexto.

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

#include "stdafx.h"
#include "PopUpCpp.h"
#include "PopUpCppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

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

void CPopUpCppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT2, m_texto);
}

BEGIN_MESSAGE_MAP(CPopUpCppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_POPUPMENU_ITEM1, &CPopUpCppDlg::OnPopupmenuItem1)
	ON_COMMAND(ID_POPUPMENU_ITEM2, &CPopUpCppDlg::OnPopupmenuItem2)
	ON_COMMAND(ID_POPUPMENU_ITEM3, &CPopUpCppDlg::OnPopupmenuItem3)
	ON_WM_CONTEXTMENU()
END_MESSAGE_MAP()

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

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

	return TRUE;
}

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

// Desenvolvimento Aberto
// Nosso código começa aqui.

// Eventos dos itens do menu
void CPopUpCppDlg::OnPopupmenuItem1()
{
	m_texto.SetWindowTextW(L"Você escolheu o Item 1");
}

void CPopUpCppDlg::OnPopupmenuItem2()
{
	m_texto.SetWindowTextW(L"Você escolheu o Item 2");
}

void CPopUpCppDlg::OnPopupmenuItem3()
{
	m_texto.SetWindowTextW(L"Você escolheu o Item 3");
}

// Evento da menssagem WM_CONTEXTMENU

void CPopUpCppDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// Declara componentes
	CRect posicao;
	CMenu SubMenu;

	// Captura e transforma posição da tela
	GetClientRect(&posicao);
	ClientToScreen(&posicao);

	// Verifica se a posição esta no contexto escolhido
	if (posicao.PtInRect(point))
	{
		// Carrega o menu
		SubMenu.LoadMenuW(IDR_MENU1);

		// Retira o menu da barra de menus
		CMenu *pMenu = SubMenu.GetSubMenu(0);
		ASSERT(pMenu);

		// Mostra menu
		pMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);

	}
	else
	{
		CWnd::OnContextMenu(pWnd, point);
	} 

}
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