Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / desktop / MFC

Toolbar Editor for Visual Studio

4.88/5 (68 votes)
31 Oct 2012CPOL9 min read 11   52.4K  
A toolbar editor for Visual Studio. It can modify, add and create buttons, images and all that is needed for a toolbar.
Image 1

Introduction

I usually spend a lot of time to give my projects a nice and user friendly GUI. In my opinion, in all desktop projects, it's "almost" mandatory to give the user something that can speed-up functions that are frequently used. The simpler (and most commonly used) method is to build a toolbar. Visual Studio comes with a toolbar editor but, really, I hate it; it's still limited to 16 colors, it can't load external images, and every time you want to add a new button, it is a pain. For all these reasons, I wrote my own toolbar editor for the Visual Studio IDE.

Installation

Simply run the setup, and follow the on-screen instructions (nothing more than the usual: next, next, yes, yes, next, finish). The setup utility of Toolbar Editor (TE) will also create two subdirectories: temp and imgLib. You can put all icons / images that you frequently use to build your toolbars in the imgLib directory: they will be displayed and previewed in TE so you can easily drop them in the toolbar on which you are currently working on. The default location of the two folder is:
[USERAPPDATA]\tbeditor 
(that in a standard Windows 7 installation is something like: C:\Users\username\AppData\Roaming\tbeditor)
In any case the location of these folders can be easly  customized by the dedicated option in the options dialogbox. 
To manage correctly the toolbar buttons ID, you should also specify where to found the afxres.h file. Toolbar Editor, starting from the 1.6 version, will try to found it by itself but, in the case it fails, you should select it manually. Please see the "Limitation of the toolbar editor" section for more information about this topic. 

How it Works

You can start to edit toolbars in a very few steps:<o:p>

  • Open the resource file (.rc) of the project that you want to edit (or create a new toolbar)<o:p>
  • Select the resource ID from the combo box. <o:p>
  • Click on "Scan" button to get the preview of the currently loaded toolbar. <o:p>
  • Edit the toolbar<o:p> 
  • Merge the modification to the resource file using the “SAVE TOOLBAR” button<o:p> 

 Image 2

Now you can add new buttons, move around the existing ones, and so on. Both the toolbar and the listbox used for preview supports drag & drop, so you can easily move buttons using your mouse. On the right side of the dialog window, there is a listbox that you can use as a library; it reads all supported types of images from a folder (remember that,if you want, you can change it in the Options Dialog) so you can take them and drop on the toolbar (you can also drop new images from the Explorer window). If the image loaded is too big (or too small), you can use the Resize function from the main menu.

When your toolbar is ready, you can click on the "SAVE TOOLBAR" button to merge it with your project: all needed IDs will be created and added to the resource.h file. If you don't want to modify your project files, you can disable this feature, and the new files will only be created in the temp folder of the editor. By default, the bitmap generated has a 4 bit color depth (16 colors) to maintain the preview active in the Visual Studio editor also, but it's possible to create grayed, true color, and "hot" bitmaps.

Image 3

The bitmaps will be created in the ./res folder of the currently open project. By default, their names are the same as the toolbar's bitmap, with the _TC, _HT, and _GR suffix, but you can change both the destination folder and the name. You can add these bitmaps to your project, and then use them with some true color toolbar class like Dany Cantin's CTrueColorToolbar.

Let's say that YOUR_BITMAP_TC, YOUR_BITMAP_HT, and YOUR_BITMAP_GR are the IDs of these bitmaps, then you can use them in your OnCreate like:

C++
m_ToolBar.LoadTrueColorToolBar(
        16,
        YOUR_BITMAP_TC,
        YOUR_BITMAP_HT, 
        YOUR_BITMAP_GR);

You should always create the true color bitmap because when you will open the toolbar again for editing, it will be used to create the imagelist instead of the 16 color version. Note that this will work only if the true color bitmap is saved using the default name bitmap_name_TC.bmp.

Finally, if you need only the imagelist, you can save it using the Save button in the bitmap section. This won't update .rc or resource.h in your project.

Creating New Toolbars

Even if you are creating a new toolbar, you need a resource file to put it in. For this reason, remember to open the right resource file before starting to work on the new toolbar. After you select "New" on the "File" menu (or you click on the "New" button in the main TE toolbar), the Toolbar Editor will ask for essential info about the toolbar: ID, size, and type (Visual C++ 20XX or Visual C++ 6).

Image 4

The toolbar ID can also be a new one (not previously defined in your resource.h) but be careful: TE won't check if what you typed is a valid ID name, so avoid spaces, special chars, and so on...). After this point, you can work as previously described and, when you are ready, merge the toolbar with the "Generate" button, or copy the toolbar code to the clipboard using the menu entry Tools->Toolbar->Copy to clipboard.

Points of Interest 

Well, first of all, I hope that this tool is really useful for someone else other than me. You can also find a custom implementation of a drag and drop enabled toolbar (it works without the Shift button pressed).

Image 5

Limitations of the Toolbar Editor

There are some considerations about IDs. My editor reads the toolbar structure from the .rc file, and the IDs defined in your project in the resource.h file: it doesn't know anything about any ID defined in other files. So be careful when you edit IDs in the Toolbar editor: if you use an ID already defined somewhere else than resource.h, it can be a problem during compilation.
As a backup solution consider that TbEditor can read IDs defined in other files just adding them in the file list available in the option dialog box. 

Image 6

Just a note: The setup package doesn't come with afxres.h because I don't know if that file is copyrighted by Microsoft and/or if it's redistributable. A function to automatically found this file in your system is available and used by TBEditor but please consider that is not 100% accurate.
To put in your .rc file the new toolbars, TE uses as marker, this text: // Toolbar. If TE can't find the marker in your file, the merging of new toolbars will fail (note that this is a problem only for new toolbars).

Guidelines to Compile Toolbar Editor

Toolbar editor need Davide Pizzolato's CxImage class to compile.
This class is used to build, change resolution, color depth, etc. of bitmaps.
The tbeditor solution it's configured to look for CxImage in the same directory where you put the tbeditor folder. In other words, your directory structure should be something similar to:

main folder 
| 
|-- tbeditor source directory 
|-- CxImage 
|-- jpeg 
|-- j2k 
|-- jbig 
|-- jasper 
|-- tiff 
|-- png 
|-- zlib

where j2k, jpeg, jbig, etc. are all folders that came in the same archive of CxImage.
The latest sources version can always be found on the sourceforge repository

Credits 

My work was inspired by Tomkat'ss [^] great tool (Super ImageList and ToolBar generator [^]) that helped me a lot in the imagelist creation before I developed my own tool. I wish to also thank:

History

  • 1.0 - (2005/08/02)
    • First public release
  • 1.1 - (2005/08/03)
    • Fixed some compatibility issues with VC6
  • 1.2 - (2005/08/05)
    • Now it's possible to parse more files with IDs
    • Linked statically to avoid dependency problems
    • Changed true color bitmap generation checkbox to true as default
    • Now, if available, a true color bitmap is used to create the imagelist when a toolbar is opened
    • Disabled "error diffusion" in 16 color bitmap creation
  • 1.3 - (2005/09/12)
    • Added "new" toolbar feature
    • Added hot imagelist creation
    • Added some accelerators
    • Added MRU list
    • Improved drag and drop (now you can use it to move buttons also, and replace only the image by holding the CTRL key)
    • Fixed bug when two buttons have the same ID
  • 1.3b - (2005/10/27)
    • Added check for update routine
    • Fixed bug caused by MRU implementation (crash on startup)
    • Fixed bug with 16 colors bitmap (ugly view in preview)
  • 1.3c - (2005/11/06)
    • Some internal modification on code to prepare the new release
    • Fixed bug on "check for updates routine"
  • 1.3d - (2006/07/04)
    • Some internal modification on code to prepare the new release (again)
    • Better error handling during parsing
    • Minor bug-fix
  • 1.41 - (2008/01/05) **SHIPON**
    • New dialog Layout to handle toolbars up to 48x48px
    • Better icon handling: now before use they are all ported to true color
    • Added support for png images/icons
    • Fixed bug on reopening an existing toolbar without a true color bitmap
    • Fixed bug on first toolbar display: listcontrol without icon preview
    • Minor bug fixes
  • 1.42 - (2009/03/31) **SHIPON**
    • New function to select transparent color
    • Fixed bug that cause wrong background color selection
    • Fixed crash if wrong toolbar id is selected for parsing
  • 1.50 - (2011/07/09) **P.WIP**
    • Program default data directory moved to [USERAPPDATA] windows default folder. This is to avoid administrative user rights requirement in Vista/Windows 7.
    • Added a more detailed manual to the installation package
    • Moved to shared MFC linking to reduce EXE file dimension
    • Fixed bug on the new function to select the background color
    • Fixed bug on first toolbar display: listcontrol without icon preview
    • Minor bug fixes   
  • 1.60 - (2012/10/19). ***** FIREWORKS ****
    • Improvements
    • Imagelist editing
    • Rotate image: now the rotate image function is enabled
    • Resize image now use a better resizing algorithm
    • Export image to library function
    • Some improvements in the option dialog: “autodetect” feature of afxres.h file (works with visual studio 2005 up to 2010)
    • the background color is now prevented to be changed by the optimization of the palette when a bitmap < 24 bit is saved (16 color bitmap for example)
    • Better toolbar layout and document handling
    • Support for UNICODE files
    • Some UI improvements
    • BugFix
    • Fixed a bug during saving of gray scale bitmaps (bitmap file wrongly reported as 4bit depth)
    • Fixed some bad behaviors of menu
    • Minor bug fixes

Additional License Note

This program is free and provided "as is" without any expressed or implied warranty. Use at your own risk!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)