Share via


如何處理分割按鈕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通知程序代碼

關於按鈕

按鈕控制件參考

使用按鈕

按鈕