如何通过拆分按钮处理 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;
}
相关主题