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.
- Coloque um componente Static Text e um componente Edit Control no dialogo, use a imagem abaixo para referencia:
- Mude as propriedades para o EditControl para Border = False e Read Only = True.
- Crie uma variável para o Edit Control chamada m_texto.
- Crie um menu usando Resources, veja a imagem abaixo como referencia:
- No Class Wizard adicione a mensagem WM_CONTEXTMENU, use a figura abaixo como referencia:
- 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); } }