如何通过拆分按钮处理 BCN_DROPDOWN 通知

本主题介绍在对话过程中响应 BCN_DROPDOWN 通知的一种可能方法。

C++ 应用程序从通知标头中检索按钮的客户端坐标,并将其转换为屏幕坐标。 然后,它会创建一个弹出菜单,并显示在按钮底部。 为简单起见,不会为菜单实现键盘快捷方式。

需要了解的事项

技术

先决条件

  • C/C++
  • Windows 用户界面编程

说明

步骤 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 函数创建菜单。 使用 AppendMenu 函数将项添加到菜单。 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 通知代码

关于按钮

按钮控件参考

使用按钮

按钮