Поделиться через


Обработка уведомления BCN_DROPDOWN с помощью кнопки разделения

В этом разделе описывается один из возможных способов реагирования на уведомление BCN_DROPDOWN в процедуре диалога.

Приложение C++ извлекает координаты клиента кнопки из заголовка уведомления и преобразует их в координаты экрана. Затем он создает всплывающее меню и отображает его в нижней части кнопки. Чтобы сохранить пример простым, сочетания клавиш не реализуются для меню.

Это важно знать

Технологии

Необходимые компоненты

  • C/C++
  • Программирование пользовательского интерфейса Windows

Instructions

Шаг 1. Дождитесь уведомления BCN_DROPDOWN .

case BCN_DROPDOWN:
{
    NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam;
    if (pDropDown->hdr.hwndFrom = GetDlgItem(hDlg, IDC_SPLIT))
    {

Шаг 2. Получение координат экрана кнопки.

Используйте функцию ClientToScreen, чтобы преобразовать координаты окна нижнего левого края кнопки в координаты экрана.

POINT pt;
pt.x = pDropDown->rcButton.left;
pt.y = pDropDown->rcButton.bottom;
ClientToScreen(pDropDown->hdr.hwndFrom, &pt);

Шаг 3. Создание меню и добавление элементов.

Используйте функцию CreatePopupMenu для создания меню. Используйте функцию AddMenu для добавления элементов в меню. IDC_MENUCOMMAND1 и IDC_MENUCOMMAND2 — это константы, определенные приложением для команд меню.

HMENU hSplitMenu = CreatePopupMenu();
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, L"Menu item 1");
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, L"Menu item 2");

Шаг 4. Отображение меню.

Функция TrackPopupMenu отображает контекстное меню в указанном расположении и отслеживает выбор элементов в меню.

TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hDlg, NULL);

Полный пример

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

код уведомлений BCN_DROPDOWN

Сведения о кнопках

Справочник по элементу управления button

Использование кнопок

Кнопка