Click here to Skip to main content
6,630,586 members and growing! (15,967 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » WTL » General     Intermediate

Toolband (Toolbar for IE) sample using WTL

By Rashid Thadha

create your own toolband for Internet Explorer using WTL
VC6Win2K, ATL, WTL, Dev
Posted:26 Aug 2001
Updated:5 Oct 2002
Views:532,579
Bookmarked:155 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
63 votes for this article.
Popularity: 8.54 Rating: 4.75 out of 5

1

2
3 votes, 11.1%
3
3 votes, 11.1%
4
21 votes, 77.8%
5

Sample Image - toolband10.gif

Credits and Acknowlegements

This module is based on the ATL DeskBand Wizard article that was created by Erik Thompson. My thanks goes to him for producing a great wizard that saves you the nity grity of creating DeskBands.

Please note that this project does not use MFC, for all those MFC die hards that want to use MFC in their Tool Bands I suggest you down load the KKBar sample from microsofts MSDN site.

The KBBar Sample can be downloaded from here

Creating the ToolBand Module

You will need to install the ATL DeskBand Wizard in order to create ToolBands. Please follow the instruction in this article.

The best way to kick start a Tool band project is to use the ATL COM App Wizard. The COM Object needs to be in-proc therefore choose 'DLL' as the Server Type. The rest of the options can be kept in there default state. (Note this project does not use MFC, as the project is based on ATL and WTL)

Once you have a ATL COM Project, You can use the ATL DeskBand Wizard to create the Initial Tool Band.

Adding Support for WTL

You will require the WTL Libraries, these can be downloaded from the microsoft site

See Installation of WTL

The following header files needs to be added to stdafx.h file

atlapp.h
atlwin.h
atlctrls.h
atlmisc.h

Create the ToolBar

You can create your toolbar in the usual way via the resource editor, Once you have your toolbar you need to create the toolbar dynamically. The CBandToolBarCtrl is inherited from CToolBarCtrl and is used to create the toolbar dynamically.

DWORD dStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | 
               CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | 
               TBSTYLE_TOOLTIPS | TBSTYLE_FLAT;
    
HWND hWnd = m_wndToolBar.CreateSimpleToolBarCtrl(hWndChild, IDR_TOOLBAR_TEST, 
                                                 FALSE, dStyle); 

This is done in the RegisterAndCreateWindow function that is called from SetSite method.

Message Reflection

The best way to handle the messages of the toolbar is to let the control handle its own messages via "Message Reflection". The best way to reflect the messages is to create an invisible control that acts as the parent for the toolbar. The invisible control will reflect the toolbar messages back to itself. See CBandToolBarReflectorCtrl class for the invisible control that will be used.

The following code shows the parent child relationship that is used to achieve Message Reflection.

BOOL CToolBandObj::RegisterAndCreateWindow()
{
    RECT rectClientParent;
    ::GetClientRect(m_hWndParent, &rectClientParent);

    // We need to create an Invisible Child Window using the Parent Window, 

    // this will also be used to reflect Command

    // messages from the rebar

    HWND hWndChild = m_wndInvisibleChildWnd.Create(m_hWndParent, 
rectClientParent, NULL, WS_CHILD); // Now we can create the Tool Bar, using the Invisible Child DWORD dStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT; HWND hWnd = m_wndToolBar.CreateSimpleToolBarCtrl(hWndChild,
IDR_TOOLBAR_TEST, FALSE, dStyle); m_wndToolBar.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS); m_wndToolBar.m_ctlBandEdit.m_pBand = this; return ::IsWindow(m_wndToolBar.m_hWnd); }

The following Macros are used to identify the reflected messages from the ordinary messages. e.g WM_COMMAND reflected comes back as OCM_COMMAND.

#define OCM_COMMAND_CODE_HANDLER(code, func) \
if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \
{ \
    bHandled = TRUE; \
    lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
    if(bHandled) \
    return TRUE; \
}

#define OCM_COMMAND_ID_HANDLER(id, func) \
if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \
{ \
    bHandled = TRUE; \
    lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
    if(bHandled) \
    return TRUE; \
}

#define OCM_NOTIFY_CODE_HANDLER(cd, func) \
if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \
{ \
    bHandled = TRUE; \
    lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \
    if(bHandled) \
    return TRUE; \
}

Browser Navigation

In order to Navigate on the browser you need to instantiate the IWebBrowser2 COM Object. This is usually done on the SetSite Method e.g.

IServiceProviderPtr pServiceProvider = pUnkSite;
if (_Module.m_pWebBrowser)
    _Module.m_pWebBrowser = NULL; 

if(FAILED(pServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser, 
                                            (void**)&_Module.m_pWebBrowser)))
return E_FAIL;

Once you have the COM Object Instantiated, you can move to your URL using the navigate method

	
_variant_t varURL = _bstr_t("www.codeproject.com"); 
_variant_t varEmpty;
_Module.m_pWebBrowser->Navigate2(&varURL, &varEmpty, &varEmpty, 
                                    &varEmpty, &varEmpty);

Drag and Drop Edit and ComboBox Control

The CBandEditCtrl class is inherited from a WTL CEdit control that has drag and drop facility. i.e. you can drag text from the browser straight to the CEdit Control.

The CBandComboBoxCtrl class is inherited from a WTL CComboBox control that has drag and drop facility. i.e. you can drag text from the browser straight to the CComboBox Control.

Drag and Drop URL - toolband2.gif

The Edit control in this sample module allows you to drag a URL from Explorer or any other Dragable enabled container. Once you have dropped the URL the toolband will go to that site.

Configurable Toolbar Button Styles

The CBandToolBarCtrl class allows you to have the follwoing button styles on the toolbar

  • Image and Text on the right
  • Image and Text on the bottom
  • Image only

Text on Right - toolband3.gif

No Text - toolband4.gif

Text Under - toolband5.gif

Pop-up Menu Tracking

A pop up menu is used to get to the configuration options

Popup Menu Tracking - toolband6.gif

ToolTips

This has been taken from MSDN to explain why you need to handle the tooltips on the toolbar your self.

Tool tips are automatically displayed for buttons and other controls contained in a parent window derived from CFrameWnd. This is because CFrameWnd has a default handler for the TTN_GETDISPINFO notification, which handles TTN_NEEDTEXT notifications from tool tip controls associated with controls.

However, this default handler is not called when the TTN_NEEDTEXT notification is sent from a tool tip control associated with a control in a window that is not a CFrameWnd, such as a control on a dialog box or a form view. Therefore, it is necessary for you to provide a handler function for the TTN_NEEDTEXT notification message in order to display tool tips for child controls.

This can be easily done in WTL by using the following Message Handler in the overriden ToolBar Control

NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnToolbarNeedText)

The following is the code that loads the tool tips from the resources and sets the tool tip text.

LRESULT CBandToolBarCtrl::OnToolbarNeedText(int /*idCtrl*/, LPNMHDR pnmh, BOOL& 
                                            bHandled)	
{
    CString sToolTip;    
    //-- make sure this 1is not a seperator

    if (idCtrl != 0) 
    {
        if (!sToolTip.LoadString(idCtrl))
        {
            bHandled = FALSE;
            return 0
        }
    }

    LPNMTTDISPINFO pttdi = reinterpret_cast<LPNMTTDISPINFO>
	
    (pnmh);pttdi->lpszText = MAKEINTRESOURCE(idCtrl);
    pttdi->hinst = _Module.GetResourceInstance();
    pttdi->uFlags = TTF_DI_SETITEM;

    //-- message processed

    return 0;
}

Update the Status Bar

You can update the status bar using the browser method put_StatusText, this method can be used typically in the WM_MENUSELECT event

The following is the code that loads up the menu text from the resources and displays it on the browser status bar.

LRESULT CBandToolBarCtrl::OnMenuSelect(UINT /*uMsg*/, 
WPARAM wParam, LPARAM lParam, BOOL& bHandled) { WORD nID = LOWORD(wParam); WORD wFlags = HIWORD(wParam); //-- make sure this is not a seperator CString sStatusBarDesc; if ( !(wFlags & MF_POPUP) ) { if (nID != 0) { if (!sStatusBarDesc.LoadString(nID)) { bHandled = FALSE; return 0; } int nPos = sStatusBarDesc.Find(_T("\n")); if (nPos != -1) { sStatusBarDesc = sStatusBarDesc.Left(nPos+1); _Module.m_pWebBrowser-> put_StatusText(_bstr_t(sStatusBarDesc)); return 0; } } } return 0; }

How to add a Chevron to your toolband

In order to add a chevron to your toolband you need to add the DBIMF_USECHEVRON flags to your GetBandInfo method in the DBIM_MODEFLAGS mask.

 
... if(pdbi->dwMask == DBIM_MODEFLAGS) 
    { 
        //AddChevron

        pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT |    
                               DBIMF_USECHEVRON | DBIMF_BREAK;
    }
...

This basically add the ability to show the chevron, if you want to see it appear on your toolband, then you must make sure the pdbi->ptMinSize.x value is less then your pdbi->ptActual.x value (Again this values can be set in the GetBandInfo method.

In order to handle the events of the button in the chevron menu, you must subclass the rebar control which is hosting your toolbar. The following steps have been used to sublass the rebar control

1. Find the rebar control - This can be achieved by getting the browsers window handle and searching for all its child windows, until you find the rebar control.

2. Once you have found the rebar control you can simply subclass it using an ATL CContainedWindow.

    BOOL CBandToolBarCtrl::SetBandRebar()
    { 
        HWND hWnd(NULL);
        _Module.m_pWebBrowser->
        get_HWND((long*)&hWnd);
	
	if (hWnd == NULL) 
	    return FALSE;

	m_ctlRebar.m_hWnd = FindRebar(hWnd);
	if (m_ctlRebar.m_hWnd == NULL) 
	    return FALSE;

	m_RebarContainer.SubclassWindow(m_ctlRebar);

	return TRUE;
    }

Once you have subclass the window, the events should reach the toolbar class.

Append to the Browser Context Menu

Sample Image - toolband11.gif

I tried to duplicate the google and codeproject toolband right mouse browser context menu searches without any luck, until I looked at the binary resources, I found that you can extend the internet explorer menu by adding the option in the registry. This can easily be achieved by adding an entry in your .rgs file.

HKCU
{
    NoRemove Software
    {
        NoRemove Microsoft
        {
            NoRemove 'Internet Explorer'
            {
                NoRemove MenuExt
                {
                    ForceRemove '&Sample Toolband Serach' = s 
'res://%MODULE%/MENUSEARCH.HTM' { val Contexts = b '10' } } } } } }

Note the value of the registry item (a html script that exist in the resources of the module).

see MENUSERACH.HTM under HTML in the module resource to see what the script is doing

History

  • Version 1 [23 Aug 2001] - Created
  • Version 2 [04 Sep 2001] - Added Tooltip code
  • Version 2.1 [23 Sep 2001] - Parent Child WebBrowser Fix
  • Version 2.2 [13 Jan 2002] - slight rewrite, Fix Internal Compiler Error problems, Unicode compatible, Status Bar sample, Chevron Sample, tooltip changes
  • Version 2.3 [15 Jan 2002] - Bug Fixes, Link Error Fixes, Show how to disable, enable buttons, Right mouse context menu
  • Version 2.4 [29 Jan 2002] - Actual Parent Child Browser Fix, v2.1 fix did not work
  • Version 2.5 [29 Oct 2002] - Bug Fixs, ComboBox Sample added, chevron width calculation

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

About the Author

Rashid Thadha


Member
Was made redundant in early 2003 after 10 years in computer programming, since then started my own business (selling computer books on the net)
www.pricecutbook.co.uk


Occupation: Web Developer
Location: United Kingdom United Kingdom

Other popular WTL articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 533 (Total in Forum: 533) (Refresh)FirstPrevNext
GeneralBuild error PinmemberMember 417110722:23 8 Sep '09  
GeneralYahoo toolbar collapse and expand feature Pinmemberamol sarmalkar7:08 23 Aug '09  
GeneralHow to Add Events on chevron buttons in IE Toolbar Pinmemberam 20091:17 22 Jul '09  
QuestionNeed to add progress bar... Pinmembersunil.n.cs21:16 27 May '09  
Generalcan you help me ?can you give a more detailed process ? Pinmemberzying200820080:56 20 Apr '09  
Questionhow do i make the toolbar band non movable ?? PinmemberAnantheswarG20:20 23 Mar '09  
QuestionClipmarks like overlay bar Pinmembermachnotrix1:54 12 Jan '09  
QuestionHot Key for the IE Band Pinmemberlal00121:15 27 Nov '08  
QuestionCrashes! Pinmemberstarschen23:41 6 Nov '08  
QuestionRefined Testcase Pinmembershahshirish1:08 13 Aug '08  
QuestionTestCase Pinmembershahshirish0:57 13 Aug '08  
GeneralCBandEditCtrl can't receive WM_MOVE message. Pinmemberc0ffee198215:45 27 Jan '08  
GeneralToolbar is not coming in IE7 Pinmemberrindam2:10 9 Aug '07  
GeneralNeed help - web browser navigation fails PinmemberRealTreasure21:36 18 Jul '07  
Generalhow can i add the kbbar toolbar into FireFox [modified] PinmemberinvinJerry23:40 29 May '07  
GeneralRe: how can i add the kbbar toolbar into FireFox Pinmemberjamesmhall7:13 20 Jul '07  
Generalcan't receive the TTN_NEEDTEXT msg under win32 release Minisize Pinmemberhlqokey23:02 29 May '07  
Generalshow/hide toolbar Pinmember10167:20 14 May '07  
GeneralDetect web page change Pinmemberseralav23:35 17 Jan '07  
GeneralRe: Detect web page change Pinmemberelie0027:21 21 Jun '07  
GeneralRe: Detect web page change Pinmemberankurtechno1:05 31 Aug '07  
GeneralRe: Detect web page change PinmemberThe loon5:58 28 Jul '09  
GeneralHow to decide which programe called me? Pinmemberguostong5:34 9 Jan '07  
GeneralError Pinmembermessages22:15 21 Dec '06  
GeneralRe: Error Pinmemberdigitally_urs20:50 24 Dec '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 5 Oct 2002
Editor: Chris Maunder
Copyright 2001 by Rashid Thadha
Everything else Copyright © CodeProject, 1999-2009
Web19 | Advertise on the Code Project