📄 ch12.htm
字号:
<TD ALIGN="LEFT">Creates a button that remains pressed until another button in the group is pressed. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">TBSTYLE_NOPREFIX </TD>
<TD ALIGN="LEFT">The button text will not have an accelerator prefix associated with it. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">TBSTYLE_SEP </TD>
<TD ALIGN="LEFT">Creates a separator, making a small gap between the buttons on either side. </TD>
</TR>
</TABLE>
<H4>Docking the Toolbar</H4>
<P>The last thing that you do in the code that you add to the OnCreate function in
the CMainFrame class is the following:</P>
<P>
<PRE>// Enable docking for the Color Toolbar
m_wndColorBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); // (AppWizard generated line)
// Dock the Color Toolbar
DockControlBar(&m_wndColorBar);
</PRE>
<P>In the first of these lines, you called the EnableDocking toolbar function. This
function enables the toolbar for docking with the frame window. The value passed
to this toolbar function must match the value passed in the following EnableDocking
function that is called for the frame window. The available values for these functions
are listed in Table 12.4. These functions enable the borders of the toolbar, and
the frame window, for docking. If these functions are not called, then you will not
be able to dock the toolbar with the frame window. If a specific side is specified
in these functions for use in docking, and the sides do not match, you will not be
able to dock the toolbar with the frame.</P>
<P>
<H4>TABLE 12.4. TOOLBAR DOCKING SIDES.</H4>
<P>
<TABLE BORDER="1">
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT"><I>Style</I></TD>
<TD ALIGN="LEFT"><I>Description</I></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_ALIGN_TOP </TD>
<TD ALIGN="LEFT">Allows the toolbar to be docked to the top of the view area of the frame window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_ALIGN_BOTTOM </TD>
<TD ALIGN="LEFT">Allows the toolbar to be docked to the bottom of the view area of the frame window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_ALIGN_LEFT </TD>
<TD ALIGN="LEFT">Allows the toolbar to be docked to the left side of the view area of the frame window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_ALIGN_RIGHT </TD>
<TD ALIGN="LEFT">Allows the toolbar to be docked to the right side of the view area of the frame window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_ALIGN_ANY </TD>
<TD ALIGN="LEFT">Allows the toolbar to be docked to any side of the view area of the frame window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">CBRS_FLOAT_MULTI </TD>
<TD ALIGN="LEFT">Allows multiple toolbars to be floated in a single miniframe window. </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">0 </TD>
<TD ALIGN="LEFT">The toolbar will not be able to dock with the frame. </TD>
</TR>
</TABLE>
</P>
<P>The final function that you added was a frame window function, DockControlBar,
which is passed the address of the toolbar variable. This function physically docks
the toolbar to the frame window. Because all of this code appears in the OnCreate
function for the frame window, the toolbar is docked before the user sees either
the window or the toolbar.</P>
<P>Now, after adding all of this code to the OnCreate function of the CMainFrame
class, if you compile and run your application, you'll find a working color toolbar
that you can use to select the drawing color, as shown in Figure 12.3.</P>
<P><A HREF="javascript:popUp('12fig03tif.gif')"><B>FIGURE 12.3.</B></A><B> </B><I>The
color toolbar on the drawing program.</I></P>
<P><I></I>
<H3><A NAME="Heading5"></A>Controlling the Toolbar Visibility</H3>
<P>Now that you have your color toolbar on the frame of your drawing application,
it would be nice to be able to show and hide it just as you can the default toolbar
and status bar through the View menu. This is simple enough functionality to add,
but it doesn't necessarily work the way you might expect it to.</P>
<P>The first thing you need to do is add a menu entry to toggle the visibility of
the color bar. Do this through the Menu Designer, adding a new menu entry on the
View menu. Specify the menu properties as shown in Table 12.5.</P>
<P>
<H4>TABLE 12.5. COLOR BAR MENU PROPERTIES.</H4>
<P>
<TABLE BORDER="1">
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT"><I>Property</I></TD>
<TD ALIGN="LEFT"><I>Setting</I></TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">ID </TD>
<TD ALIGN="LEFT">ID_VIEW_COLORBAR </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">Caption </TD>
<TD ALIGN="LEFT">&Color Bar </TD>
</TR>
<TR ALIGN="LEFT" VALIGN="TOP">
<TD ALIGN="LEFT">Prompt </TD>
<TD ALIGN="LEFT">Show or hide the colorbar\nToggle ColorBar </TD>
</TR>
</TABLE>
<H4>Updating the Menu</H4>
<P>To determine whether the toolbar is visible or hidden, you can get the current
style of the toolbar and mask out for the WS_VISIBLE style flag. If the flag is in
the current toolbar style, then the toolbar is visible. By placing this evaluation
into the SetCheck function in the UPDATE_COMMAND_UI event message handler, you can
check and uncheck the color bar menu entry as needed.</P>
<P>To add this functionality to your drawing program, add an event handler for the
UPDATE_COMMAND_UI event message on the ID_VIEW_COLOR menu. Be sure to add this event-handler
function into the CMainFrame class. (You're still making all of your coding changes
so far in the frame class.) Edit the event-handler function, adding the code in Listing
12.2.</P>
<P>
<H4>LISTING 12.2. THE MODIFIED CMainFrame.OnUpdateViewColorbar FUNCTION.</H4>
<PRE> 1: void CMainFrame::OnUpdateViewColorbar(CCmdUI* pCmdUI)
2: {
3: // TODO: Add your command update UI handler code here
4: ///////////////////////
5: // MY CODE STARTS HERE
6: ///////////////////////
7:
8: // Check the state of the color toolbar
9: pCmdUI->SetCheck(((m_wndColorBar.GetStyle() & WS_VISIBLE) != 0));
10:
</PRE>
<PRE>11: ///////////////////////
</PRE>
<PRE>12: // MY CODE ENDS HERE
13: ///////////////////////
14: }
</PRE>
<H4>Toggling the Toolbar Visibility</H4>
<P>Because the CToolBar class is derived from the CWnd class (via the CControlBar
class), you might think that you could call the ShowWindow function on the toolbar
itself to show and hide the toolbar. Well, you can, but the background for the toolbar
will not be hidden along with the toolbar. All the user would notice is the toolbar
buttons appearing and disappearing. (Of course, this might be the effect you are
after, but your users might not like it.)</P>
<P>Instead, you use a frame window function, ShowControlBar, to show and hide the
toolbar. This function takes three arguments. The first argument is the address for
the toolbar variable. The second argument is a boolean, specifying whether to show
the toolbar. (TRUE shows the toolbar; FALSE hides the toolbar.) Finally, the third
argument specifies whether to delay showing the toolbar. (TRUE delays showing the
toolbar; FALSE shows the toolbar immediately.)</P>
<P>Once a toolbar is toggled on or off, you need to call another frame window function,
RecalcLayout. This function causes the frame to reposition all of the toolbars, status
bars, and anything else that is within the frame area. This is the function that
causes the color toolbar to move up and down if you toggle the default toolbar on
and off.</P>
<P>To add this functionality to your drawing program, add an event handler for the
COMMAND event message on the ID_VIEW_COLOR menu. Be sure to add this event-handler
function into the CMainFrame class. (You're still making all of your coding changes
so far in the frame class.) Edit the event-handler function, adding the code in Listing
12.3.</P>
<P>
<H4>LISTING 12.3. THE MODIFIED CMainFrame.OnViewColorbar FUNCTION.</H4>
<PRE> 1: void CMainFrame::OnViewColorbar()
2: {
3: // TODO: Add your command handler code here
4:
5: ///////////////////////
6: // MY CODE STARTS HERE
7: ///////////////////////
8: BOOL bVisible;
9:
10: // Check the state of the color toolbar
11: bVisible = ((m_wndColorBar.GetStyle() & WS_VISIBLE) != 0);
12:
13: // Toggle the color bar
14: ShowControlBar(&m_wndColorBar, !bVisible, FALSE);
15: // Reshuffle the frame layout
16: RecalcLayout();
17:
18: ///////////////////////
19: // MY CODE ENDS HERE
20: ///////////////////////
21: }
</PRE>
<P>At this point, after compiling and running your application, you should be able
to toggle your color toolbar on and off using the View menu.</P>
<P>
<H2><A NAME="Heading6"></A>Adding a Combo Box to a Toolbar</H2>
<P>It's commonplace now to use applications that have more than just buttons on toolbars.
Look at the Visual C++ Developer Studio, for example. You've got combo boxes that
enable you to navigate through your code by selecting the class, ID, and function
to edit right on the toolbar. So how do you add a combo box to a toolbar? It's not
available in the toolbar designer; all you have there are buttons that you can paint
icons on. You can't add a combo box to any toolbar by using any of the Visual C++
wizards. You have to write a little C++ code to do it.</P>
<P>To learn how to add a combo box to a toolbar, you'll add a combo box to the color
toolbar you just created. The combo box will be used to select the width of the pen
the user will use to draw images. (If you haven't added the support for different
drawing widths from the exercise at the end of Day 10, you might want to go back
and add that now.)</P>
<P>
<H3><A NAME="Heading7"></A>Editing the Project Resources</H3>
<P>To add a combo box to your toolbar, the first thing that you need to do is what
Visual C++ was designed to prevent you from having to do. You need to edit the resource
file yourself. You cannot do this through the Visual C++ Developer Studio. If you
try to open the resource file in the Developer Studio, you will be popped into the
Resource View tab of the workspace pane, editing the resource file through the various
resource editors and designers. No, you'll have to edit this file in another editor,
such as Notepad.</P>
<P>Close Visual C++, the only way to guarantee that you don't write over your changes.
Open Notepad and navigate to your project directory. Open the resource file, which
is named after the project with a .rc filename extension. Once you open this file
in Notepad, scroll down until you find the toolbar definitions. (You can search for
the word "toolbar.") Once you've found the toolbar definitions, go to the
end of the Color toolbar definition and add two separator lines at the bottom of
the toolbar definition.</P>
<P>For instance, to make these changes to your drawing application, you need to navigate
to the Toolbar project directory and then open the Toolbar.rc file. (If you are adding
these toolbars to the MDI drawing application, you need to look for the Day11.rc
file.) Search for the toolbar section, and then add two SEPARATOR lines just before
the end of the IDR_TBCOLOR section, as shown in Listing 12.4. Once you add these
two lines, save the file, exit Notepad, and restart Visual C++, reloading the project.</P>
<P>
<H4>LISTING 12.4. THE MODIFIED PROJECT RESOURCE FILE (Toolbar.rc).</H4>
<PRE> 1: //////////////////////////////////////////////////////////////////////
2: //
3: // Toolbar
4: //
5:
6: IDR_MAINFRAME TOOLBAR DISCARDABLE 16, 15
7: BEGIN
8: BUTTON ID_FILE_NEW
9: BUTTON ID_FILE_OPEN
10: BUTTON ID_FILE_SAVE
11: SEPARATOR
12: BUTTON ID_EDIT_CUT
13: BUTTON ID_EDIT_COPY
14: BUTTON ID_EDIT_PASTE
15: SEPARATOR
16: BUTTON ID_FILE_PRINT
17: BUTTON ID_APP_ABOUT
18: END
19:
20: IDR_TBCOLOR TOOLBAR DISCARDABLE 16, 15
21: BEGIN
22: BUTTON ID_COLOR_BLACK
23: BUTTON ID_COLOR_BLUE
24: BUTTON ID_COLOR_GREEN
25: BUTTON ID_COLOR_CYAN
26: BUTTON ID_COLOR_RED
27: BUTTON ID_COLOR_MAGENTA
28: BUTTON ID_COLOR_YELLOW
29: BUTTON ID_COLOR_WHITE
30: SEPARATOR
31: SEPARATOR
32: END</PRE>
<P>You added these two SEPARATOR lines in the toolbar definition so that the second
separator can act as a place holder for the combo box that you are going to add to
the toolbar. There are two reasons that you had to make this edit by hand and not
use the Visual C++ toolbar designer. The first reason is that the toolbar designer
would not allow you to add more than one separator to the end of the toolbar. The
second reason is that, if you don't add anything else on the end of your toolbar
after the separator, the toolbar designer decides that the separator is a mistake
and removes it for you. In other words, the Visual C++ toolbar designer does not
allow you to add the place holder for the combo box to your toolbar.</P>
<P>Next, you need to add the text strings that you will load into your combo box.
To add these strings, you need to open the string table in the Resource View of the
workspace pane. Here you find all of the strings that you entered as prompts in various
properties dialogs. This table has a number of IDs, the values of those IDs, and
textual strings that are associated with those IDs, as shown in Figure 12.4. You'll
need to add the strings to be placed into your toolbar combo box in the string table;
each line in the drop-down list must have a unique ID and entry in the strings table.</P>
<P><A HREF="javascript:popUp('12fig04tif.gif')"><B>FIGURE 12.4.</B></A><B> </B><I>The
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -