Click here to Skip to main content
Click here to Skip to main content

Adding a drop arrow to a toolbar button

, 15 Dec 1999
Rate this:
Please Sign up or sign in to vote.
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

    <!-- Article Starts -->

    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

    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:


    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;
    	// load and display popup menu
    	CMenu menu;
    	CMenu* pPopup = menu.GetSubMenu(0);
    	CRect rc;
    	pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc);
    		rc.left, rc.bottom, this, &rc);

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

    	afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);


    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


    About the Author

    Kirk Stowell
    CEO Codejock Software
    United States United States
    No Biography provided

    Comments and Discussions

    QuestionDropdown arrow on the bottom of the button PinmemberBruno Scopigno28-Mar-12 6:04 
    QuestionImplementing windows explorer 'views' type of menu PinmemberSharanyaMahi5-Dec-11 21:20 
    Generaldropdown toolbar instead of menu Pinmembermimosa22-Jun-10 12:21 
    QuestionHow do I add menu item function and update function for multiple and dynamic menu items Pinmemberakira3227-Oct-08 0:17 
    GeneralI used the vs2008 to compile the demo source code Pinmemberakira3226-Oct-08 17:03 
    AnswerRe: I used the vs2008 to compile the demo source code Pinmemberakira3226-Oct-08 18:21 
    GeneralBUG: CToolBar, drop-down, XP theme, and Internet Explorer PinmemberDamir Valiulin3-May-06 20:47 
    There's some weird bug with CToolbar when XP theme is applied to an application. I've ran into this bug when I was updating one application to use XP styles. It took me a while to realize what was going on and then some more time trying to track down
    1. Add xp manifest file to the same folder as the demo executable.
    2. Run demo
    3. Now, open Internet Explorer and notice how toolbar buttons got larger and cut off at the bottom. Here's a screenshot:
    Some more investigation revealed that it only happened with XP themes applied and only for toolbars with dropdown. But why??? Debuggin this took hours. Spy++ was hanging my system to a crawl and only hard reboot helped. I did found though that IE was sending WM_SETTINGCHANGE to my application and after that the buttons would get corrupt. Calling SetButtonSizes at any point after IE would corrupt the buttons didn't work.
    I was deep in CToolBar code trying this and that and was geting very frustrated by this. And then it dawned on me: if it was the dropdown style that had a problem, then what if we temporarily get rid of it and then restore it when it was safe?!
    So the solution I tried was to derive from CToolBar (which was already done in my case), listen for WM_SETTINGCHANGE, then remove dropdown style and add then add it again:
    void CMyToolBar::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
    DWORD dwExStyle = SendMessage(TB_GETEXTENDEDSTYLE);
    SendMessage(TB_SETEXTENDEDSTYLE, 0, 0);
    CToolBar::OnSettingChange(uFlags, lpszSection);

    It's not a perfect solution because a button with dropdown shifts one pixel, but it's much better then the large and tuncated buttons.
    Hope this helps someone.
    P.S. It seems like this bug was fixed in MFC for VS.NET . But if you are still on VC++6, then you'll need this fix
    GeneralMoving Arrow to Left of button PinmemberHamid Reza Mohammadi2-Dec-05 6:12 
    Questionboth arrows and not? Pinsussnoaa28-Jul-05 15:04 
    Generalreplacing button icons Pinmemberprrem24-Feb-05 3:52 
    GeneralDrop Down Button in Internet Explorer Standard Toolbar PinmemberAtif Goheer10-Jan-04 10:26 
    GeneralRe: Drop Down Button in Internet Explorer Standard Toolbar PinmemberBill SerGio, The Infomercial King4-Aug-04 5:29 
    GeneralRe: Drop Down Button in Internet Explorer Standard Toolbar PinmemberAlexey Petuschak10-Sep-05 5:18 
    GeneralCannot click arrow Pinmemberpinguin75126-Jul-03 21:01 
    GeneralRe: Cannot click arrow PinmemberTux9-Feb-04 16:26 
    GeneralRe: Cannot click arrow Pinmemberrlaley18-Jan-05 23:34 
    GeneralRe: Cannot click arrow PinsussRummey13-Mar-05 8:04 
    GeneralRe: Cannot click arrow PinmemberKirk Stowell14-Mar-05 5:21 
    GeneralRe: Cannot click arrow PinmemberRummey14-Mar-05 6:35 
    GeneralRe: Cannot click arrow PinmemberKirk Stowell14-Mar-05 11:21 
    GeneralRe: Cannot click arrow PinmemberRummey14-Mar-05 11:55 
    GeneralRe: Cannot click arrow PinmemberKirk Stowell15-Mar-05 5:29 
    GeneralRe: Cannot click arrow PinmemberRummey15-Mar-05 5:53 
    GeneralRe: Cannot click arrow PinmemberKirk Stowell15-Mar-05 6:06 
    GeneralRe: Cannot click arrow PinmemberCodeHead2-Sep-05 9:50 
    AnswerRe: Cannot click arrow PinmemberKirk Stowell2-Sep-05 11:49 
    GeneralRe: Cannot click arrow PinmemberCodeHead6-Sep-05 3:52 
    QuestionHow can I do it in a docking toolbar? PinmemberPaulaPaziani25-Jul-03 7:42 
    QuestionHow to do it in C#? PinmemberCarl Mercier23-Feb-03 12:18 
    GeneralGood Job PinmemberOld Timer8-Jan-03 3:57 
    GeneralVC++.NET Problem PinsussAnonymous12-Aug-02 14:28 
    GeneralRe: VC++.NET Problem PinmemberKirk Stowell13-Aug-02 5:44 
    GeneralRe: VC++.NET Problem Pinmemberhaoshenghan1-May-04 1:05 
    GeneralRe: VC++.NET Problem PinmemberBausch24-May-06 0:17 
    GeneralRe: VC++.NET Problem PinmemberAni4-Jul-06 19:51 
    GeneralRe: VC++.NET Problem Pinmemberkarthikeyan nithiyanandavelu1-Jan-07 20:49 
    GeneralRe: VC++.NET Problem Pinmemberdangero19-Jun-08 18:04 
    GeneralAbsolutely brilliant PinmemberDanPetitt9-Aug-02 11:08 
    GeneralRedo/Undo Dropdown Window PinmemberAnonymous20-Jun-02 6:13 
    GeneralA very little addition PinmemberMorozov Alexey19-Feb-02 14:56 
    GeneralText Menus Pinmemberswinefeaster28-Oct-01 13:29 
    GeneralDoing this in a CDialog window PinsussJeremy Davis20-Mar-00 6:36 
    GeneralTrouble with doing this in a CDialog PinsussJeremy Davis21-Feb-00 4:29 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars PinsussMartin Speiser21-Jan-00 4:55 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars PinsussMartin Speiser21-Jan-00 4:55 
    GeneralBug in VC6 MFC with dropdown arrows in toolbars PinsussMartin Speiser21-Jan-00 4:55 

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

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

    | Advertise | Privacy | Terms of Use | Mobile
    Web04 | 2.8.141223.1 | Last Updated 16 Dec 1999
    Article Copyright 1999 by Kirk Stowell
    Everything else Copyright © CodeProject, 1999-2014
    Layout: fixed | fluid