This article explains how to put various controls like combo box or edit box
on toolbars.
Note: The easiest way to add controls to a toolbar is by using our
Toolbar Editor application.
For example, you want to create a "Find" combo box, which appears on a
toolbar and contains the recently used search strings. The user will be able to
type search strings in the combo box edit control and then either press the
enter key to search through the document, or press the escape key to return the
focus to the main frame. The document is displayed in a CEditView-derived
view.
The following steps are the "setup" work that deals with the creation of the
combo box button and handling of its commands:
-
Open the application resources, add a new button with the ID_EDIT_FIND
command ID to the desired (IDR_MAINFRAME) toolbar and create a new menu item
with the same ID. Add a new string "Find the text\nFind" to the string table
with ID_EDIT_FIND_COMBO command ID. This ID will be used as the command ID
of the find combo box button.
Note. The ID_EDIT_FIND is the standard
command processed by CEditView, therefore you don't need to implement a
special handler for this command, but you need to implement a handler for
the ID_EDIT_FIND_COMBO command.
-
Derive a class from the CBCGPComboBox class. Let's name it CFindComboBox.
-
In the CFindComboBox class override the PreTranslateMessage virtual member
function. This will allow you to process WM_KEYDOWN message first and take
the appropriate actions. When the user hits the escape key (VK_ESCAPE)
it must return the focus to the main frame window. When the user hits the
enter key (VK_ENTER) it must post the WM_COMMAND message with the
ID_EDIT_FIND_COMBO command ID to the main frame window (the command will be
routed to the view).
- Derive a class from the CBCGPToolbarComboBoxButton
class. Let's name it CFindComboButton.
- Constructor of CBCGPToolbarComboBoxButton
takes three parameters: the button's command ID, index of the button's
image and the combo box style. You should pass the ID_EDIT_FIND_COMBO as the
command ID and you can use CImageHash::GetImageOfCommand
with
ID_EDIT_FIND to obtain the image index.
-
Override the method of CBCGPToolbarComboBoxButton class: CreateCombo. Here
you should create the CFindComboBox object and return a pointer to it.
-
Use IMPLEMENT_SERIAL macro to make the combo button persistent. The
workspace manager automatically loads and saves the button's state from/to
Windows registry.
- Implement the ID_EDIT_FIND_COMBO handler in your view. Use CBCGPToolBar::GetCommandButtons
with the ID_EDIT_FIND_COMBO ID to
retrieve all "Find" combo box buttons. It can be several copies of a combo
box button with the same command ID because of customization.
- Use CBCGPToolBar::IsLastCommandFromButton
to determine whether the "Find" command was sent from our combo box
button. If so, find the text and add the search string to the combo box.
You should perform the following steps to put the find combo box button to the toolbar:
- Implement the BCGM_RESETTOOLBAR
message handler (OnToolbarReset) in the main frame window.
Note. This message is sent by the framework to the main frame window when a
toolbar has been initialized (on the application startup), or a toolbar has
been reset during customization. In either case you need to replace the
standard toolbar button with the "custom" find combo box button (see step
2).
- In the OnToolbarReset handler analyze the toolbar's ID (it is WPARAM of
the BCGM_RESETTOOLBAR message). When you encounter the IDR_MAINFRAME
toolbar just call CBCGPToolBar::ReplaceButton
with ID_EDIT_FIND and a reference to a CFindComboButton object.
Note. You can construct a CFindComboButton object on the stack, because ReplaceButton
copies the button object and maintains the copy.
- If you enable customization, you implement the "customize" handler (OnViewCustomize)
and create CBCGPToolbarCustomize dialog. You must call CBCGPToolbarCustomize::ReplaceButton
with ID_EDIT_FIND and a reference to a CFindComboButton object.
Note. The customization dialog contains the "Commands" page with the
"Commands" list box. The user is able to drag the commands and drop them on
the toolbars. By default, the customization dialog processes the application
menus and builds lists of the standard toolbar buttons for each category. If
you don't replace the standard toolbar button with the CBCGPToolbarButton-derived
button when needed, you will lose the extended functionality provided by
derived objects.
Back to the Developer Area