Introduction
This article shows how to add a floating/docking toolbar to a dialog.
In MSDN, there is a sample (dlgcbr32) in which is presented a way to add a fixed toolbar to a dialog. I have extended that example and created a CDialog
derived class that contains a toolbar which can be either fixed, floating or hidden. The floating toolbar effect is obtained by dynamically creating a modeless dialog box which contains a fixed toolbar.
Using the code
To use the code, you must do the following steps:
- Include ToolbarDialog.h and ToolbarDialog.cpp in your project.
- Derive your dialog from
CToolbarDialog
: #include "ToolbarDialog.h"
class CTDDlg : public CToolbarDialog
Also make sure that you pass at least the ID of the toolbar resource you want to use to the CToolbarDialog
constructor. This constructor has four parameters: the first two are the dialog ID and parent (just like CDialog
), the third is the ID of the toolbar resource and the fourth is the initial state of the toolbar. Possible values are:
TS_HIDDEN
TS_FLOATING
TS_LEFT
TS_TOP
TS_RIGHT
TS_BOTTOM
Here is an example:
CTDDlg::CTDDlg(CWnd* pParent )
:CToolbarDialog(CTDDlg::IDD, pParent,IDR_TOOLBAR1,TS_HIDDEN)
- In your class, declare and implement the function:
virtual LONG ToolbarButtonCommand(UINT uButtonID);
This function receives as parameter the ID of the toolbar button that was pressed. By implementing this function, you can add handlers to the toolbar buttons.
Example:
LONG CTDDlg::ToolbarButtonCommand(UINT uButtonID)
{
CString msg;
msg.Format("Button with ID %d was pressed in toolbar",uButtonID);
AfxMessageBox(msg);
return 0;
}
- If you want to set the state of the toolbar dynamically, just call
PositionToolbar(DWORD dwPosition)
. The values the parameter can have are the ones described earlier.
For example, to show the toolbar floating, just add the following function call to your code:
PositionToolbar(TS_FLOATING);
- To enable/disable the toolbar buttons, just add the
UpdateCommandUI
handlers to your dialog and edit the methods as you would, in every Frame/View application.
For example:
ON_UPDATE_COMMAND_UI_RANGE(ID_BUTTON32771,ID_BUTTON32775,OnUpdateBtn)
void CTDDlg::OnUpdateBtn(CCmdUI* pCmd)
{
if(pCmd->m_nID == ID_BUTTON32771)
pCmd->Enable(FALSE);
}
- If you want to have tooltips for the toolbar buttons, follow the steps described in Randy More's article.
You now have a dialog that support floating toolbars.
I have tested this class only on Windows 2000, but I think it will also work on Win9x and WinXP.
Revision History
Version 1.0.0 - 2004 April 7
Version 1.0.1 - 2004 April 8
- FIXED BUG: when toolbar is attached to the right or the left, no dragging possible by clicking on the handle (thanks to ReorX for informing me about this bug).
- FIXED BUG: when the floating toolbar is docked, the parent dialog does not receives the focus.
Version 1.0.2 - 2004 April 9
- ADDED: VC6 compatibility
- ADDED: Tooltips support (thanks to Randy More for his article about adding tooltips to toolbars in dialogs)
- FIXED BUG:
UPDATE_COMMAND_UI
does not work (thanks to =[ Abin ]= for informing me about this bug)
Acknowledgments
- Thanks to Cristian Teodorescu for giving me the idea of using a dynamic dialog for the floating toolbar.
- Thanks to Microsoft Corporation for their Dlgcbr32 sample
Usage
You are free to use this software in any personal or freeware application. If you use this software in any shareware or commercial application, you MUST get my permission first. If you modify it or extend it, please to consider posting new code here for everyone to share. This software is provided "as is" with no expressed or implied warranty. I accept no liability for any damage or loss of business that this software may cause.