IE 工具列的「後退/前進」按鈕帶下拉箭頭,點擊彈出歷史清單。本文完整教學如何在 MFC 實現此功能:啟用擴充樣式、設定按鈕下拉樣式、處理 TBN_DROPDOWN 通知彈出選單。
// MainFrm.cpp OnCreate 末尾
DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
dwStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);
// MainFrm.h
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
// MainFrm.cpp 訊息對應
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
// 實作
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT* plr) {
CWnd* pWnd; UINT nID;
switch (pnmtb->iItem) {
case ID_FILE_OPEN:
pWnd = &m_wndToolBar; nID = IDR_MENU1; break;
default: return;
}
CMenu menu; menu.LoadMenu(nID);
CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup);
CRect rc;
pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);
pWnd->ClientToScreen(&rc);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
}
IDR_MENU1,包含三項:ID_FILE_MRU_FILE1 (最近檔案)、ID_APP_ABOUT (關於)、ID_VCKBASE_HOME (首頁)ID_VCKBASE_HOME 在視圖類別處理:ShellExecute(NULL, "open", "https://www.vckbase.com", NULL, NULL, SW_SHOWNORMAL);| API/常數 | 用途 |
|---|---|
TBSTYLE_EX_DRAWDDARROWS | 擴充樣式:啟用下拉箭頭繪製 |
TBSTYLE_DROPDOWN | 按鈕樣式:標記該按鈕有下拉功能 |
TBN_DROPDOWN | 通知碼:使用者點擊下拉箭頭時送出 |
TB_GETRECT | 訊息:取得按鈕矩形(用於定位彈出選單) |
TrackPopupMenu | API:在指定螢幕座標顯示彈出選單 |
SetMenu(IDR_MENU, hWnd, TRUE, IDR_TOOLBAR)啟用 TBSTYLE_EX_DRAWDDARROWS + 設定 TBSTYLE_DROPDOWN + 處理 TBN_DROPDOWN 三步驟完整實現下拉箭頭按鈕。技術成熟穩定,符合 Windows UI 規範,適合需求工具列下拉選單功能的專案直接採用。