效果圖:
本文將告訴你如何實(shí)現(xiàn),方法其實(shí)很簡(jiǎn)單:
1、新建一個(gè)MFC/SDI工程,一路都取默認(rèn)的設(shè)置。
2、在mainframe.cpp文件中找到 CMainFrame::OnCreate()框架窗口創(chuàng)建函數(shù)。在末尾添加如下代碼行:
DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);
這兩行代碼的作用是讓工具欄具有處理下拉箭頭的能力,接著要用SetButtonStyle()方法在選定的地方添加下拉箭頭按鈕,在例子程序里,下拉箭頭按鈕是加在了文件打開(kāi)菜單上:
DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
dwStyle = TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);
加了上述代碼行之后,編譯一次程序,然后運(yùn)行程序,你就可以看到下拉箭頭了。但此時(shí)還不能操作。
3、接下來(lái)要做的事情是添加下拉箭頭的消息處理代碼以及程序要用的菜單資源?,F(xiàn)在假設(shè)你已經(jīng)創(chuàng)建了菜單資源,且假設(shè)這個(gè)菜單的資源ID是IDR_MENU1。如圖二所示。
在CMainFrame類的消息映射中加入下拉箭頭的TBN_DROPDOWN消息映射: BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
...
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、在MainFrame.h頭文件中加入消息處理函數(shù)的聲明: //{{AFX_MSG(CMainFrame)
...
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
//}}AFX_MSG
5、在MainFrame.cpp文件中加入TBN_DROPDOWN消息處理的實(shí)現(xiàn)代碼: void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
CWnd *pWnd;
UINT nID;
// Switch on button command id''s.
switch (pnmtb->iItem)
{
case ID_FILE_OPEN:
pWnd = &m_wndToolBar;
nID = IDR_MENU1;
break;
default:
return;
}
// load and display popup menu
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);
}
6、前面第三步創(chuàng)建的菜單資源里有三個(gè)菜單命令,“最近打開(kāi)的文件”、“打開(kāi)關(guān)于對(duì)話框”、“VC知識(shí)庫(kù)主頁(yè)”。它們對(duì)應(yīng)的菜單ID為:ID_FILE_MRU_FILE1、ID_APP_ABOUT、ID_VCKBASE_HOME,前兩個(gè)ID都是MFC默認(rèn)的菜單,它們調(diào)用的命令函數(shù)在例子程序中也是MFC自動(dòng)創(chuàng)建和調(diào)用的。ID_VCKBASE_HOME菜單項(xiàng)在例子程序中是通過(guò)ClassView關(guān)聯(lián)到視圖類進(jìn)行處理的,用戶選擇這個(gè)菜單項(xiàng)時(shí)調(diào)用OnGotoVckbaseHomePage():
void CMyView::OnGotoVckbaseHomePage()
{
// TODO: Add your command handler code here
ShellExecute(NULL,"open","http://www.vckbase.com",NULL,NULL,SW_SHOWNORMAL);
}
它打開(kāi)默認(rèn)的瀏覽器并訪問(wèn)VC知識(shí)庫(kù)主頁(yè)。
好了,現(xiàn)在編譯并運(yùn)行程序吧。下面是例子程序運(yùn)行畫面(圖三):
注意本文提供源代碼僅僅只是個(gè)例子程序,在現(xiàn)實(shí)的軟件設(shè)計(jì)和編程行為中,沒(méi)有誰(shuí)會(huì)在“打開(kāi)文件”功能菜單里加入什么“打開(kāi)關(guān)于對(duì)話框”和“VC知識(shí)庫(kù)主頁(yè)”之類的菜單命令。這有悖于Windows程序的UI規(guī)則。