Click here to Skip to main content
15,906,628 members
Articles / Desktop Programming / MFC
Article

Adding a drop arrow to a toolbar button

Rate me:
Please Sign up or sign in to vote.
4.69/5 (20 votes)
15 Dec 1999 663.6K   2.2K   69   46
Demonstrates how to use the new toolbar styles to add dropdown arrows to toolbar buttons
  • Download demo project - 28 Kb
  • Sample Image - toolbar_droparrow.gif

    If you wanted to add a drop menu like the ones seen in internet explorer, it is pretty straight forward. This approach for will work for both Visual C++ 5 and 6, however you may want to read up on the enhancements to the toolbar class for VC 6.0.

    First off, after your toolbar has been created in CMainFrame::OnCreate(), you will need to make a call to the following

    DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
    m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);

    This will enable your toolbar to handle drop arrows. The next thing you will need to do, is to actually add the drop arrow to your desired button. This will be done via the SetButtonStyle() method:

    DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
    dwStyle |= TBSTYLE_DROPDOWN;
    m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);

    Now, you will need to add a message handler for the drop arrow, as well a menu to the application resources. Assuming you already know how to create a menu, ( if not, click on the resource tab, select the resource name ie: MyApp Resources, then right click. Select insert, then select Menu, then press the New button ) and assuming that the resource id for our menu is IDR_MENU1, add the following code to CMainFrame's message map:

    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    	//{{AFX_MSG_MAP(CMainFrame)
    	...
    	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    Add the following method to CMainFrame's .cpp file:

    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);
    }

    Then add the following to CMainFrame's .h file:

    //{{AFX_MSG(CMainFrame)
    ...
    afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
    //}}AFX_MSG
    

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    CEO Codejock Technologies, LLC
    United States United States
    This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.
    This is a Organisation (No members)


    Comments and Discussions

     
    GeneralRe: Cannot click arrow Pin
    CodeHead2-Sep-05 8:50
    CodeHead2-Sep-05 8:50 
    AnswerRe: Cannot click arrow Pin
    Kirk Stowell2-Sep-05 10:49
    Kirk Stowell2-Sep-05 10:49 
    GeneralRe: Cannot click arrow Pin
    CodeHead6-Sep-05 2:52
    CodeHead6-Sep-05 2:52 
    QuestionHow can I do it in a docking toolbar? Pin
    PaulaPaziani25-Jul-03 6:42
    PaulaPaziani25-Jul-03 6:42 
    QuestionHow to do it in C#? Pin
    Carl Mercier23-Feb-03 11:18
    Carl Mercier23-Feb-03 11:18 
    GeneralGood Job Pin
    Old Timer8-Jan-03 2:57
    Old Timer8-Jan-03 2:57 
    GeneralVC++.NET Problem Pin
    Anonymous12-Aug-02 13:28
    Anonymous12-Aug-02 13:28 
    GeneralRe: VC++.NET Problem Pin
    Kirk Stowell13-Aug-02 4:44
    Kirk Stowell13-Aug-02 4:44 
    The problem is the prototype for OnToolbarDropDown is incorrect for .NET, change NMTOOLBAR to NMHDR in CMainFrame for example:

    mainfrm.h:

    afx_msg void OnToolbarDropDown(NMHDR* pNMHDR, LRESULT *pResult);


    mainfrm.cpp:

    void CMainFrame::OnToolbarDropDown(NMHDR* pNMHDR, LRESULT *pResult)
    {
    	NMTOOLBAR* pNMTBar = (NMTOOLBAR*)pNMHDR;
    
    	CWnd *pWnd = NULL;
    	UINT nID = 0;
    
    	// Switch on button command id's.
    	switch (pNMTBar->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, pNMTBar->iItem, (LPARAM)&rc);
    	pWnd->ClientToScreen(&rc);
    	
    	pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
    		rc.left, rc.bottom, this, &rc);
    
    	*pResult = 0;
    }


    Hope this helps...

    Best regards,
    Kirk Stowell

    Looking for great GUI Tools?
    http://www.codejock.com/
    GeneralRe: VC++.NET Problem Pin
    Ventruing1-May-04 0:05
    Ventruing1-May-04 0:05 
    GeneralRe: VC++.NET Problem Pin
    Joerg Bausch23-May-06 23:17
    Joerg Bausch23-May-06 23:17 
    GeneralRe: VC++.NET Problem Pin
    Ani4-Jul-06 18:51
    Ani4-Jul-06 18:51 
    GeneralRe: VC++.NET Problem Pin
    karthikeyan nithiyanandavelu1-Jan-07 19:49
    karthikeyan nithiyanandavelu1-Jan-07 19:49 
    GeneralRe: VC++.NET Problem Pin
    dangero19-Jun-08 17:04
    dangero19-Jun-08 17:04 
    GeneralAbsolutely brilliant Pin
    DanPetitt9-Aug-02 10:08
    DanPetitt9-Aug-02 10:08 
    GeneralRedo/Undo Dropdown Window Pin
    20-Jun-02 5:13
    suss20-Jun-02 5:13 
    GeneralA very little addition Pin
    Morozov Alexey19-Feb-02 13:56
    Morozov Alexey19-Feb-02 13:56 
    GeneralText Menus Pin
    Swinefeaster28-Oct-01 12:29
    Swinefeaster28-Oct-01 12:29 
    GeneralDoing this in a CDialog window Pin
    Jeremy Davis20-Mar-00 5:36
    Jeremy Davis20-Mar-00 5:36 
    GeneralTrouble with doing this in a CDialog Pin
    Jeremy Davis21-Feb-00 3:29
    Jeremy Davis21-Feb-00 3:29 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars Pin
    Martin Speiser21-Jan-00 3:55
    Martin Speiser21-Jan-00 3:55 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars Pin
    Martin Speiser21-Jan-00 3:55
    Martin Speiser21-Jan-00 3:55 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars Pin
    Martin Speiser21-Jan-00 3:55
    Martin Speiser21-Jan-00 3:55 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.