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

Código de notificação BCN_DROPDOWN

Sobre os botões

Referência de controle de botão

Usando botões

Botão