Como lidar com a notificação de BCN_DROPDOWN de um botão Dividir
Este tópico descreve uma maneira possível de responder à notificação de BCN_DROPDOWN em um procedimento de diálogo.
O aplicativo C++ recupera as coordenadas do cliente do botão do cabeçalho de notificação e as converte em coordenadas de tela. Em seguida, ele cria um menu pop-up e o exibe na parte inferior do botão. Para manter o exemplo simples, os atalhos de teclado não são implementados para o menu.
O que você precisa saber
Tecnologias
Pré-requisitos
- C/C++
- Programação da interface do usuário do Windows
Instruções
Passo 1: Aguarde a notificação BCN_DROPDOWN.
case BCN_DROPDOWN:
{
NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam;
if (pDropDown->hdr.hwndFrom = GetDlgItem(hDlg, IDC_SPLIT))
{
Passo 2: Obtenha as coordenadas de tela do botão.
Use a função ClientToScreen para converter as coordenadas da janela da borda inferior esquerda do botão em coordenadas da tela.
POINT pt;
pt.x = pDropDown->rcButton.left;
pt.y = pDropDown->rcButton.bottom;
ClientToScreen(pDropDown->hdr.hwndFrom, &pt);
Passo 3: Crie um menu e adicione itens.
Use a função CreatePopupMenu para criar um menu. Use a função AppendMenu para adicionar itens ao menu. IDC_MENUCOMMAND1 e IDC_MENUCOMMAND2 são constantes definidas pelo aplicativo para comandos de menu.
HMENU hSplitMenu = CreatePopupMenu();
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, L"Menu item 1");
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, L"Menu item 2");
Passo 4: Exiba o menu.
A função TrackPopupMenu exibe um menu de atalho no local especificado e rastreia a seleção de itens no menu.
TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hDlg, NULL);
Exemplo completo
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case BCN_DROPDOWN:
{
NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam;
if (pDropDown->hdr.hwndFrom = GetDlgItem(hDlg, IDC_SPLIT))
{
// Get screen coordinates of the button.
POINT pt;
pt.x = pDropDown->rcButton.left;
pt.y = pDropDown->rcButton.bottom;
ClientToScreen(pDropDown->hdr.hwndFrom, &pt);
// Create a menu and add items.
HMENU hSplitMenu = CreatePopupMenu();
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, L"Menu item 1");
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, L"Menu item 2");
// Display the menu.
TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hDlg, NULL);
return TRUE;
}
break;
}
}
return FALSE;
}
Tópicos relacionados