如何處理分割按鈕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;
}
相關主題