Click here to Skip to main content
13,797,817 members
Click here to Skip to main content
Add your own
alternative version


38 bookmarked
Posted 27 Apr 2000

WTL Tool Bar Drop-Down Extension

, 26 Jul 2000
Rate this:
Please Sign up or sign in to vote.
An article on extending the tool bar control using the Window Template Library
  • Download demo project - 58 Kb
  • Download source files - 11 Kb
  • Sample Image


    I needed a toolbar with drop down arrows so that I could place some pop-up menus on them. Initially I tried handling the notification messages from within the parent window. This became a huge mess and was just plain ugly looking. So I decided instead to create my own custom toolbar control. The process is quite simple so I'll get right to the code:

    How it works

    1. We needed to retrieve the notification messages from the parent window. Now, we don't just want to go and reflect all of the notification messages since we don't want to have to handle all of them. So we create a contained window, with which we can selectively chose which notification messages were going to handle.

    CContainedWindow m_wndParent;
    CToolBarCtrlExImpl() : 
    	m_wndParent(this, 1), 
    	m_clrMask(RGB(192, 192, 192))
    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
    	// Subclass parent window
    	CWindow wndParent = GetParent();
    	CWindow wndTopLevelParent = wndParent.GetTopLevelParent();

    2. We've now got a copy of the parent window and are receiving all of its messages. Next we need to define in the message map which messages were going to process.

    ALT_MSG_MAP(1) // Parent window messages	

    Notice that were using ALT_MSG_MAP(1). ATL supports multiple message maps, so all messages that belong to the parent window are now been pumped through here. By the way, the parent window still receives all these messages, we're just taking a peek at them and using the ones we need.

    The following code is the current message handlers in the toolbar class:

    LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
    	LPNMTOOLBAR lpnmtb = (LPNMTOOLBAR)pnmh;	
    	// Check if this is from us
    	if (pnmh->hwndFrom != m_hWnd)
    		bHandled = FALSE;
    	_DropDownButton* pb = FindDropDownButton(lpnmtb->iItem);
    	RECT rc;
    	GetRect(pb->uIdButton, &rc);
    	if (pb && pb->uIdMenu)
    		if (DoDropDownMenu(pb->uIdMenu, &rc)) <- See History for comments
    			return TBDDRET_DEFAULT;
    // Do not hot track if application in background
    LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
    	// Check if this is from us
    	if (pnmh->hwndFrom != m_hWnd)
    		bHandled = FALSE;
    		return 0;
    	DWORD dwProcessID;
    	::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);		
    	if ((!m_wndParent.IsWindowEnabled() || ::GetCurrentProcessId() != dwProcessID))
    		return 1;
    		bHandled = FALSE;
    		return 0;


    I just finished adding bitmaps to the menu, so that all menu items that would usually display a bitmap, will.

    How to use

    In MainFrm.h declare a CToolBarCtrlEx and in the OnCreate handler initialize it like the below example.

    class CMainFrame : ...
    	CToolBarCtrlEx m_wndToolBar;
    	LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    		// HWND hWndToolBar = CreateSimpleToolBarCtrl(m_hWnd, IDR_MAINFRAME, FALSE, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
    		HWND hWndToolBar = m_wndToolBar.Create(m_hWnd, rcDefault, NULL, ATL_SIMPLE_TOOLBAR_PANE_STYLE);
    		m_wndToolBar.LoadToolBar(IDR_MAINFRAME); // Load the toolbar
    		m_wndToolBar.LoadMenuImages(IDR_MAINFRAME); // Load all the menu images were going to need
    		m_wndToolBar.AddDropDownButton(ID_FILE_NEW, IDR_MAINFRAME); // Add some drop-down buttons
    		m_wndToolBar.AddDropDownButton(ID_FILE_OPEN, IDR_POPUP_OPEN);
    		m_wndToolBar.AddDropDownButton(ID_EDIT_PASTE, IDR_POPUP_PASTE);	

    Thanks to Paul DiLascia for the code to add drop-down menus to toolbar buttons. (MSJ - 1997)

    That's it!.


    Version 1.1

    • Revised the drop down method and made it a virtual function so that it can be overridden for custom handling.
    • Added bitmaps to the menu items.

    Version 1.0

    • Added drop down menus to the drop-down buttons.


    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

    Ben Burnett
    Team Leader Farmer's Edge
    Canada Canada
    Ben was born in New Zealand and grew up in Mexico; however, he has lived in Canada for most of his adult life. He has traveled to a few places in Canada so far: British Columbia, Saskatchewan, Manitoba, Ontario and Nova Scotia, but has only ever lived in Alberta — all over Alberta. From Lethbridge to Calgary to Fort McMurray: he has seen most of what the province has to offer. He has also left the comfort of his—at the time—home country and gone abroad. In recent history he has been in China, New Zealand, the US, Central America and back to Canada (where he now resides).

    He completed a degree at the University of Lethbridge, in Computer Science; worked for the University of Wisconsin-Madison in the Computer Sciences Department as a Systems Programmer for the Condor Research Project[^]; and is currently completing another degree at the University of Lethbridge, once again, in Computer Science.

    Ben has been known to enjoy reading, watching movies, playing console games, and learning everything he can about computers. And, more importantly, with regards to his character: does not usually speaks about himself in the third person.

    You may also be interested in...


    Comments and Discussions

    Questionhow can i add one bitmap or icon in the dropdown menu item Pin
    Member 219760825-Aug-05 22:23
    memberMember 219760825-Aug-05 22:23 
    QuestionDid you ever free GDI and User's resources ? Pin
    Tutankhamen7717-Oct-03 17:33
    memberTutankhamen7717-Oct-03 17:33 
    Questionin win Xp only with 4bpp displays? Pin
    robspychala5-May-03 2:55
    memberrobspychala5-May-03 2:55 
    AnswerRe: in win Xp only with 4bpp displays? Pin
    robspychala1-Jun-03 14:42
    memberrobspychala1-Jun-03 14:42 
    GeneralDynamically add ticks to dropped down menu Pin
    Angus Comber31-Mar-03 1:58
    memberAngus Comber31-Mar-03 1:58 
    QuestionFine work + ??? Pin
    armo25-Aug-02 5:25
    memberarmo25-Aug-02 5:25 
    GeneralDoesn't compiles under VS.NET with WTL7 Pin
    Magomed Abdurakhmanov22-May-02 23:12
    memberMagomed Abdurakhmanov22-May-02 23:12 
    GeneralRe: Doesn't compiles under VS.NET with WTL7 Pin
    robspychala27-Apr-03 12:58
    memberrobspychala27-Apr-03 12:58 
    GeneralCompile errors (int __thiscall CToolBarCtrlExImpl...) Pin
    12-Oct-01 2:39
    suss12-Oct-01 2:39 
    GeneralRe: Compile errors (int __thiscall CToolBarCtrlExImpl...) Pin
    Ben Burnett14-Oct-01 6:29
    memberBen Burnett14-Oct-01 6:29 
    GeneralRe: Compile errors (int __thiscall CToolBarCtrlExImpl...) Pin
    14-Oct-01 22:40
    suss14-Oct-01 22:40 
    GeneralRe: Compile errors (int __thiscall CToolBarCtrlExImpl...) Pin
    Ben Burnett15-Oct-01 15:24
    memberBen Burnett15-Oct-01 15:24 
    QuestionBug ? Pin
    19-Jul-01 3:22
    suss19-Jul-01 3:22 
    GeneralTBSTYLE_CHECK Pin
    4-Jun-01 1:58
    suss4-Jun-01 1:58 
    GeneralToolbar with text... Pin
    Amit Dey22-May-01 9:56
    memberAmit Dey22-May-01 9:56 
    GeneralRe: Toolbar with text... Pin
    Ben Burnett22-May-01 10:35
    memberBen Burnett22-May-01 10:35 
    GeneralRe: Toolbar with text... Pin
    Amit Dey22-May-01 15:05
    memberAmit Dey22-May-01 15:05 
    GeneralRe: Toolbar with text... Pin
    Ben Burnett22-May-01 17:49
    memberBen Burnett22-May-01 17:49 
    Generalmissing resources Pin
    Mike Junkin3-May-00 11:21
    memberMike Junkin3-May-00 11:21 

    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.

    Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
    Web01 | 2.8.181207.3 | Last Updated 27 Jul 2000
    Article Copyright 2000 by Ben Burnett
    Everything else Copyright © CodeProject, 1999-2018
    Layout: fixed | fluid