Windows Forms Toolstrip Course

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Windows Forms Toolstrip Course as PDF for free.

More details

  • Words: 18,107
  • Pages: 92
Windows Forms ToolStrip  Abstract  This 6 hour course is intended for Microsoft Support Engineers who support and develop  Windows Forms applications for Windows® Visual Studio® .NET 2005 and the Microsoft .NET  Framework 2.0.  Topics highlight capabilities of ToolStrip and its associated classes; describe  how to use them to create Windows forms applications that have a Windows XP, Office, Internet  Explorer, or custom appearance and behavior.  The training also includes hands­on labs and  how­to samples. 

Objective  At the end of this course, you will be able to describe the highlights of Toolstrip capabilities and  use them to develop applications that have a Windows XP, Office, Internet Explorer, or custom  appearance and behavior in Visual Studio 2005. 

Outline · · · · · · ·

Class hierarchies Feature highlights ToolStrip Layout ToolStripContainer Settings Using ToolStrip in MDI applications Rendering or Painting 

Overview  Creating advanced toolbar functionality with a consistent and professional appearance and  behavior is one of the top requested features from Windows Forms developers of all skill levels.  To meet such requests, the Windows Forms product group has added the ToolStrip and  associated classes in Framework 2.0.  What is ToolStrip?  The ToolStrip family of controls provides and common interface for producing user interface  elements for Windows Forms. The ToolStrip, MenuStrip, ContextMenuStrip, StatusStrip, and  ToolStripDropDown controls replace the previous toolbar, main menu, context menu, and status  bar controls respectively, although those controls are retained for backward compatibility.  In addition to replacing these controls, ToolStrip and its associated controls provide a common  rendering model, extensibility options, parallel UI across containers and supporting utility  functions and usage controls.  Why use ToolStrip?



ToolStrip and its associated classes provide many advantages over the old ToolBar, MainMenu,  StatusBar and ContextMenu that were shipped in the previous versions of .NET Framework.  It provides  •  Overflow support  •  Custom layout support  •  Support controls right in menus and toolbars  •  Consistent object model  •  Simpler to mix/match items  •  Enhanced design time experience 

ToolStrip runtime features incorporate a careful blend of agility and utility. You can easily create  application elements with a professional look and feel, or use your imagination to create that one­  of­a­kind application.  Highlights of ToolStrip capabilities: · ToolStrip and derived classes replace the existing ToolBar, MainMenu, StatusBar and  ContextMenu classes.  In addition, they provide functionality beyond these controls in the  previous versions.



· · · · · · · ·

ToolStrip control hosted items include ToolStripTextBox, ToolStripComboBox,  ToolStripProgressBar ToolStrips can generically host controls via ToolStripControlHostItem Shareable, customizable renderers across all ToolStrips Consistent API across all of ToolStrips with appropriate pattern specializations. Freely positionable ToolStrips with rafting containers Automatic Overflow menu support Automatic end user customization retention via config Opacity, transparency, animated gif and region support 

ToolStrip designer has taken the success of the main menu editor to new heights. It offers in­  place editing of text along with limitless automatic nesting of submenus.  Highlights of ToolStrip designer capabilities: · · · · · · · ·

Easily create complex, dynamic shell components interactively Drag and drop to rearrange items Copy/paste between levels or across forms Drag, position and drop ToolStrips, MenuStrips, StatusStrips to form sides in new rafting  containers In­place editing within the automatic Overflow Morph item types to more complex types One­click convert a ToolStripButton to a ToolStripDropDownButton while retaining common  properties Customized, ultra­quick access to common properties on the smart panel 

ToolStrip Classes at a Glance  Technology  Toolbar, Status, and Menu  containers 

ToolStrip Items 

Classes  ToolStrip  MenuStrip  ContextMenuStrip  StatusStrip  ToolStripDropDown  ToolStripOverflow  ToolStripDropDownMenu  ContextMenuStrip  ToolStripButton  ToolStripSeparator  ToolStripLabel  ToolStripStatusLabel  ToolStripControlHost  ToolStripComboBox  ToolStripTextBox  ToolStripProgressBar  ToolStripDropDownItem  ToolStripSplitButton  ToolStripMenuItem  ToolStripDropDownButton  ToolStripOverflowButton

3

Location 

ToolStripContainer 

Presentation and Rendering 

ToolStripManager  ToolStripRenderer  ToolStripProfessionalRenderer  ToolStripSystemRenderer  ToolStripRenderMode 

Terminologies 

Partial Trust  The limitations of ToolStrips under partial trust are designed primarily to prevent spoofing attacks.  Spoofing attacks consist of some fake dialog or familiar window that lures the user into entering  personal information. The two elements are a full fidelity window AND key entry. ToolStrip,  because of the flexibility in rendering, protects only the key entry half of this attack. We do this via  a combination of protections:  In ToolStripDropDowns, we require UIPermission.AllWindowsPermission to display  ControlHostItems. This applies to both intrinsic (ToolStripTextBox, ToolStripComboBox,



ToolStripProgressBar) and user created. Rather than throw, we simply do not display these items  where the requirement is not met.  We disallow AutoClose == false and ignore the cancelable closing event param. This makes it  impossible to enter more than one keystroke and not cause dropdown dismissal. Like above, we  would not throw, but simply ignore the value.  We restrict keystroke handling events. Many keyboard related events will not be raised if in partial  trust contexts less than UIPermission.AllWindowsPermission.  Mnemonics are not processed when UIPermission.AllWindowsPermission is not granted. This is  done to prevent a keystroke sniffing attack where a ContextMenuStrip that contains an item for  each letter could be reshown again and again. Each time it was dismissed one more letter would  be captured. 

Usage  Toolstrips have three main usage patterns that impact how they are laid out, keyboard interaction  and end­user behavior.  Joined in a ToolStripPanel  This means that the ToolStrip is typically repositionable within the ToolStripPanel and across  ToolStripPanels. The dock property is ignored, and the size of the ToolStrip if not Stretch grows  with more items. It usually does not participate in Tab order.  Docked  The ToolStrip is docked to one side of a container, is in a fixed position and size expanding over  the entire edge to which it is docked.  It usually does not participate in Tab order.  Absolutely Positioned  This mode is using the ToolStrip just like a control. It is placed via the location property, has a  fixed size and typically participates in the Tab order.  Keyboarding  Mnemonics  Combined with or following the ALT key, mnemonics are one way to activate a ToolStripItem via  keyboard. ToolStrip supports both explicit and implicit mnemonics. Explicit mnemonics are  defined inline with the ampersand (&) character preceding the letter. Implicit mnemonics are  determined by an algorithm within ToolStrips that attempts to find a matching item based on order  of characters in the Text property.  Shortcuts  Shortcuts used by MenuStrips are different from ShortcutKeys used in MainMenu. One is a pre­  combined list of key combinations. MenuStrips simply use combinations of the Keys  enumerations (not order specific) to define the shortcut. In addition a provision is made to display  a shortcut key via text (e.g. Delete vs. Del) via the ShortcutDisplayString.



Navigation  Pressing the Alt key activates the MenuStrip pointed to by Form.MainMenuStrip. From there,  pressing CTRL+TAB navigates between ToolStrips within ToolStripPanels. TAB and arrow keys  are used to navigate between items in a ToolStrip. The ToolStrip classes use a special nearest  item arrow handling algorithm in the Overflow to handle cross row navigation. Spacebar clicks  ToolStripButton, ToolStripDropDownButton, ToolStripSplitButton.  Focus/Validation  For the most part, when activated by the menu key (ALT), the MenuStrip/ToolStrip will try not to  take focus away from the control that is currently focus.  If there is a control hosted within the  MenuStrip or a dropdown of the MenuStrip, the Control will gain focus when tabbed to.  In general,  the GotFocus/LostFocus/Enter/Leave events on MenuStrip may not fire when keyboard activated.  In such cases, the MenuStrip.MenuActivate, MenuStrip.MenuDeactivate events can be used  instead.  By default ToolStrip.CausesValidation is False.  Validation can be performed by manually calling  Validate() on the Form.  How can I tab out of a ToolStrip? It just starts over from the first item again and again.  In this case, the ToolStrip will accept the first tab to tab in ­ and the arrow keys will do wrapping  selection.  The second tab will tab you to the next control. Commonly used when not contained  within a ToolStripPanel:  toolStrip.TabStop = true; 

Class Hierarchies  This section describes the class hierarchies of the ToolStrip and its associated classes. 

ToolStrip class  This shows the inheritance hierarchy of the ToolStip class:  System.Object  System.MarshalByRefObject  System.ComponentModel.Component  System.Windows.Forms.Control  System.Windows.Forms.ScrollableControl  System.Windows.Forms.ToolStrip  System.Windows.Forms.BindingNavigator  System.Windows.Forms.MenuStrip  System.Windows.Forms.StatusStrip  System.Windows.Forms.ToolStripDropDown  System.Windows.Forms.ToolStripOverflow  System.Windows.Forms.ToolStripDropDownMenu  System.Windows.Forms.ContextMenuStrip



ToolStrip  (Replacement for ToolBar) 

MenuStrip 

StatusStrip 

(Replacement for  MainMenu) 

(Replacement for  StatusBar) 

ToolStripDropDown 

ToolStripDropDownMenu 

BindingNavigator 

ToolStripOverflow

ContextMenuStrip  (Replacement for  ContextMenu) 

Note:  Although ToolStrip, MenuStrip, StatusStrip and ContextMenuStrip controls replace the ToolBar,  MainMenu, StatusBar and ContextMenu controls of previous versions, ToolBar, MainMenu,  StatusBar and ContextMenu are retained for both backward compatibility and future use if you  choose.  By default, they will not show up in the ToolBox.  The users will need to manually add  them to the ToolBox or use them programmatically.  We will not discuss the BindingNavigator class since it has been covered in the “Windows Forms  DataGridView and DataBinding in .NET Framework 2.0” course.  This course will focus on the  MenuStrip, StatusStrip and ToolStripDropDown classes in the ToolStrip family. 

ToolStripItem class  A ToolStripItem is an abstract class that derives from System.ComponentModel.Component and  it is the base class for all the items that go into a ToolStrip.  There are several different kinds of ToolStripItems such as a button, combo box, text box, or label  that can be contained in a ToolStrip control or a ToolStripDropDown control.  While the ToolStrip 



class manages the painting and keyboard and mouse input (including drag­and­drop input) for  these elements, the ToolStripItem class manages events and layout.  ToolStripItem is not a control.  This is for performance reasons.  It is a lightweight solution to get  around the window handle limitation on some OS (e.g, there's a limit of 16,364 window handles  on Windows 95/98/Me). Therefore, items derived from ToolStripItem do not have handles.  The following shows the inheritance hierarchy of the ToolStripItem class.  System.Object  System.MarshalByRefObject  System.ComponentModel.Component  System.Windows.Forms.ToolStripItem  System.Windows.Forms.ToolStripButton  System.Windows.Forms.ToolStripLabel  System.Windows.Forms.ToolStripStatusLabel  System.Windows.Forms.ToolStripSeparator  System.Windows.Forms.ToolStripControlHost  System.Windows.Forms.ToolStripTextBox  System.Windows.Forms.ToolStripComboBox  System.Windows.Forms.ToolStripProgressBar  System.Windows.Forms.ToolStripDropDownItem  System.Windows.Forms.ToolStripMenuItem  System.Windows.Forms.ToolStripSplitButton  System.Windows.Forms.ToolStripDropDownButton  System.Windows.Forms.ToolStripOverflowButton 

The following chart describes elements that derive from the ToolStripItem class.  These elements  do not have window handles and they can be hosted in a ToolStrip or ToolStripDropDown.



ToolStripItem  (Abstract class) 

ToolStripButton 

ToolStripLabel 

ToolStripControlHost 

ToolStripDropDownItem  (Abstract class) 

ToolStripSeparator 

ToolStripStatusLabel

ToolStripTextBoxt 

ToolStripMenuItem 

ToolStripComboBox 

ToolStripSplitButton 

ToolStripDropDownButton 

ToolStripProgressBar 

ToolStripOverflowButton 

ToolStripManager class  This class inherits from System.Object and it cannot be inherited.  You can use it to join ToolStrip  controls within a specified ToolStripContainer and merge ToolStrip controls with each other.  You can use it to control the arrangement, painting, and display style of ToolStrip. The  overloaded Merge method combines ToolStrip controls with each other, and the overloaded  RevertMerge method undoes a merge operation.  You can use it together with the ToolStripRenderer class to gain even more control and  customizability over painting and layout style.  You can also use it together with the ToolStripControlHost class to host any other Windows  Forms control in a ToolStrip, 



Feature highlights  This section highlights some of the important features in ToolStrip and its associated classes. 

ToolStrip class  This section contains information relevant to ToolStrip as a base class and ToolStrip as a control.  ToolStrip is not only replacement for ToolBar, but also the base class for MenuStrip, StatusStrip  and ContextMenuStrip. By default it uses the SplitStackLayout which supports two virtual stacks  of items. The enables support of overflow and alignment within the ToolStrip. 

The following table lists some of the important members of the ToolStrip class.  Property Names 

Description 

AllowItemReorder 

Setting this value to True allows the items on the ToolStrip to be  reordered at run time while the Alt key is pressed.  By default, the value is set to False.  When you set it to True, the  user can hold down the ALT key and the left mouse button to drag a  ToolStripItem to a different location on the ToolStrip at run time. 

AllowMerge 

Setting this value to true (default) allows multiple MenuStrip,  ToolStripDropDownMenu, ToolStripMenuItem, and other types to  be combined.  You can use this property to enable MDI children to  combine their respective menus in the MDI parent. 

CanOverflow 

Indicates whether items in the ToolStrip can overflow. Overflow  means that when you shrink the window, there will be a dropdown  arrow at the end of the ToolStrip which you can click to display the  items that do not fit on the ToolStrip any more.  When this property

10 

is set to false, the dropdown arrow does not show up to display the  items that no longer fit on the ToolStrip.  A ToolStripItem is not  displayed if it is clipped.  CanOverflow set to true: 

CanOverflow set to false: 

DefaultDropDownDirection  Indicates the default direction in which a ToolStripDropDown control  is displayed relative to the ToolStrip.  This property can only be set  at run time.  For example, when you set it to  ToolStripDropDownDirection.AboveLeft, you get the following look  at run time: 

GripDisplayStyle 

Read only property.  Indicates whether ToolStrip grip or move  handle is horizontal or vertical. 

GripMargin 

Use this property to manipulate the space around the ToolStrip  move handle. Because System.Windows.Forms.Padding can take  individual values for Top, Bottom, Left, and Right, you can adjust  the space around the move handle as desired. The margin can  even be off the edge of the ToolStrip. 

GripRectangle 

Gets the boundaries of the ToolStrip move handle.  You can use  this property to get boundaries for painting, hit testing, and so on. 

GripStyle 

Controls the visibility of the ToolStrip grip or move handle. 

ImageScaling 

This is the size that will be used to scale into as determined by the

11 

Item’s ImageScaling and the container’s AutoSize setting.  LayoutStyle 

Specifies the layout orientation of ToolStrip.  For example, you get  the following look when the LayoutStyle is set to Table. 

OverflowButton 

Gets the ToolStripItem that is the overflow button for a ToolStrip  with overflow enabled. 

Renderer 

Gets or sets a ToolStripRenderer used to customize the look and  feel of a ToolStrip. 

RenderMode 

Controls the painting styles to be applied to the ToolStrip.  When it  is set to System, it provides the look and feel of IE; when it is set to  Professional, it provides the look and feel of Office.  When it is set  to ManagerRenderMode, then the painting style is determined by  how the ToolStripManager renders.  Using System render mode: 

Using Professional render mode: 

ShowItemToolsTips 

Indicates whether ToolTips are to be displayed on ToolStrip items.  The default value is set to True.  Set it to False if you do not want  ToolTips to display. 

Stretch 

Gets or sets a value indicating whether the ToolStrip stretches from  end to end in the ToolStripContainer.  When a ToolStrip is contained within a ToolStripPanel (so that it can  be moved by the user of the application), it can either fill an entire  row of the ToolStripPanel or size to the ToolStrip’s contents.  The  ToolStrip.Stretch property controls this behavior: · Stretch = True, the ToolStrip fills the entire row; · Stetch = False, the ToolStrip sizes as normal;

12 

TextDirection 

Specifics the direction to draw text on a ToolStrip.  For example,  when you set it to Vertical90, you get the following look: 

Method Names 

Description 

OnLayoutCompleted 

Raises the LayoutCompleted event. 

OnLayoutStyleChanged 

Raises the LayoutStyleChanged event.  You can override this  method or handle the LayoutStyleChanged event to customize the  ToolStrip’s appearance when the layout style changes.  For example, you can make the ToolStrip items to have vertical text  when you dock it to the side of the Form by handling the  LayoutStyleChanged event: 

OnPaintGrip 

Raises the PaintGrip event. 

OnRendererChanged 

Raises the RendererChanged event.  You can override this method  or handle the RendererChanged event to provide more control over  the painting style of the ToolStrip when you change the ToolStrip’s  Renderer property. 

Event Names 

Description 

LayoutCompleted 

Occurs when the layout of the ToolStrip is complete. 

LayoutStyleChanged 

Occurs when the value of the LayoutStyle property changes.  See  OnLayoutStyleChanged. 

PaintGrip 

Occurs when the ToolStrip move handle is painted. 

RendererChanged 

Occurs when the value of the Renderer property changes. 

MenuStrip class

13 

MenuStrip is the ToolStrip family of control’s replacement for MainMenu.  It also handles the  majority of key handling in the menu activation case and has special logic around  Form.MainMenuStrip.  The MenuStrip control supports the multiple­document interface (MDI) and menu merging, tool  tips, and overflow. You can enhance the usability and readability of your menus by adding access  keys, shortcut keys, check marks, images, and separator bars.  The MenuStrip control replaces and adds functionality to the MainMenu control; however, the  MainMenu control is retained for backward compatibility and future use if you choose. 

The following table lists some of the important members of the MenuStrip class.  Property Names 

Description 

AllowItemReorder 

Setting this value to true allows the items on the MenuStrip to be  reordered at run time while the Alt key is pressed. 

AllowMerge 

Setting this value to true (default) allows multiple menu items to be  merged. 

CanOverflow 

Indicates whether the MenuStrip supports overflow functionality. 

LayoutStyle 

Specifies the layout orientation of MenuStrip.  For example, you get the following look when the LayoutStyle is set to  VerticalStackWithOverflow:

14 

MdiWindowListItem 

Gets or sets the ToolStripMenuItem that is used to display a list of  MDI child forms. 

RenderMode 

Controls the painting styles to be applied to the MenuStrip.  When it is set to System, it provides the look and feel of IE;  When it is set to Professional, it provides the look and feel of Office.  When it is set to ManagerRenderMode, then the painting style is  determined by how the ToolStripManager renders.  Using System render mode: 

Using Professional render mode: 

ShowItemToolsTips 

The default value of this property for MenuStrip is False. 

Stretch 

Specifics whether the MenuStrip stretches from end to end in the  rafting container. 

TextDirection 

Specifics the direction to draw text on a MenuStrip.  For example,  when you set it to Vertical270, you get the following look:

15 

StatusStrip class  A StatusStrip control displays information about an object being viewed on a Form, the object's  components, or contextual information that relates to that object's operation within your  application.  Typically, a StatusStrip control consists of ToolStripStatusLabel objects, each of which displays  text, an icon, or both. The StatusStrip can also contain ToolStripDropDownButton,  ToolStripSplitButton, and ToolStripProgressBar controls.  The default StatusStrip has no panels. To add panels to a StatusStrip, use the  ToolStripItemCollection.AddRange(System.Windows.Forms.ToolStripItem[]) method.  Although StatusStrip replaces and extends the StatusBar control of previous versions, StatusBar  is retained for both backward compatibility and future use if you choose. 

The following table lists some of the important members of the StatusStrip class.  Property Names 

Description 

CanOverflow 

Indicates whether the StatusStrip supports overflow functionality. 

LayoutStyle 

Specifies the layout orientation of StatusStrip.  For example, you get  the following look when the LayoutStyle is set to Table: 

RenderMode 

Controls the painting styles to be applied to the StatusStrip.  When it  is set to System, it provides the look and feel of IE; when it is set to  Professional, it provides the look and feel of Office.  When it is set to  ManagerRenderMode, then the painting style is determined by how  the ToolStripManager renders.

16 

ShowItemToolTips 

The default value of this property for StatusStrip is False. 

Stretch 

Specifics whether the StatusStrip stretches from end to end in the  rafting container. 

Layout of the StatusStrip  One note about layout in the StatusStrip is that certain properties on the LayoutSettings object  will be overwritten in the case of laying out ToolStripStatusLabels with Spring = True. 

Grip and SizingGrip  There are two different grips on StatusStrip:  1.  Grip:  This is the element of the StatusStrip which provides the user a drag starting point to  reposition the StatusStrip between ToolStripPanels. It is rendered vertically at the start of the  StatusStrip.  2.  SizingGrip: SizingGrip is the element that provides a way to resize the form in whch the  StatusStrip is docked. It is rendered as diagonal shadowed lines at the bottom end of the  StatusStrip. 

How can I get an item aligned to the right on the StatusStrip?  By default, the StatusStrip is not set to LayoutStyle.StackWithOverfow, therefore the  item.Alignment property is ignored.  To align a progress bar to the right, use a ToolStripStatusLabel by setting its Spring property to  True, then adding a ToolStripProgressBar to it.  The ToolStripStatusLabel’s Text property can be  set to “” to remove the text.

17 

ToolStripDropDown class  ToolStripDropDown 

ToolStripDropDownMenu 

ToolStripOverflow

ContextMenuStrip 

A ToolStripDropDown represents a control that allows the user to select a single item from a list  that is displayed when the user clicks a ToolStripDropDownButton or a  ToolStripDropDownSplitButton.  For instance, you can use the ToolStripDropDown to display  drop­down lists of options, such as a color picker.  Although ToolStripDropDownMenu and ToolStripDropDown replace and add functionality to the  Menu control of previous versions, Menu is retained for both backward compatibility and future  use if you choose. 

18 

The following table lists some of the important properties of the ToolStripDropDown class.  Property Names 

Description 

AutoClose 

Indicates whether the ToolStripDropDown control should  automatically close when it has lost activation. 

CanOverflow 

Indicates whether the items in a ToolStripDropDown can be sent to an  overflow menu. 

OwnerItem 

OwnerItem is used to access the item which sourced the dropdown.  This is analogous to ContextMenuStrip.SourceControl, but instead of  returning Control it returns ToolStripItem.  Note: The concept of container ownership and parenting is more  complex in ToolStrips than in a typical Windows Forms container  control. That is necessary to support dynamic scenarios such as  overflow, sharing drop downs across multiple ToolStrip items and to  support spawning ContextMenuStrips from controls. 

TopLevel 

Gets or sets a value indicating whether the ToolStripDropDown is a  top­level control. 

Flow from parent to auto created dropdowns  For the implementation of faux­ambient properties we make a distinction in how the dropdown for  a ToolStripDropDownItem is created. We automatically flow Font, ImageScalingSize and  Renderer to the auto­created dropdown. In the case of explicitly created dropdowns, you must set  these properties yourself.  Explicit creation of ToolStripDropDown  This refers to instancing a ToolStripDropDown, ToolStripDropDownMenu or ContextMenuStrip,  populating it, and then assigning to a ToolStripDropDownItem’s DropDown property;  Implicit (automatic) creation of ToolStripDropDown  This refers to populating a ToolStripDropDownItem’s DropDownItems collection. When that item  is activated, the dropdown is created by using the item from the OwnerItem’s DropDownItems  collection;  Sample  Run the following sample.  It shows the font flows into the veggies menu dropdown, but not fruit.  // explicit  ContextMenuStrip cms = new ContextMenuStrip();  cms.Items.Add("Apples");  cms.Items.Add("Bananas");  cms.Items.Add("Cherries");  ToolStripMenuItem fruitMenuItem = new ToolStripMenuItem("Fruit");  fruitMenuItem.DropDown = cms;  // implicit (automatic)  ToolStripMenuItem veggiesMenuItem = new ToolStripMenuItem("Veggies");

19 

veggiesMenuItem.DropDownItems.Add("Asparagus");  veggiesMenuItem.DropDownItems.Add("Bok Choy");  veggiesMenuItem.DropDownItems.Add("Cauliflower");  // menustrip  MenuStrip ms = new MenuStrip();  // set Font to show property flow  ms.Font = new Font("Trebuchet MS", 14, FontStyle.Bold);  ms.Items.Add(fruitMenuItem);  ms.Items.Add(veggiesMenuItem);  this.Controls.Add(ms); 

ToolStripOverflow class  This class inherits from ToolStripDropDown class and manages the overflow behavior of a  ToolStrip.  The following table lists some of the important properties.  Property Names 

Description 

Items 

Gets all of the items on the ToolStrip, whether they are currently being  displayed or not. 

LayoutSettings 

Controls layout scheme characteristics. 

LayoutStyle 

Indicates how the ToolStrip lays out the items collection. 

OwnerItem 

Controls the ToolStripItem that is the owner of this ToolStripOverflow. 

ToolStripDropDownMenu class  ToolStripDropDownMenu inherits from ToolStripDropDown, and is the base class for  ContextMenuStrip.  Although ToolStripDropDownMenu and ToolStripDropDown replace and add  functionality to the Menu control of previous versions, Menu is retained for both backward  compatibility and future use if you choose.  The properties of this class that you will probably use directly are the ShowCheckMargin and  ShowImageMargin properties, which determine whether the shortcut menu will be able to display  a check mark, an image, or both.  The following table includes some of the important properties.  Property Names 

Description 

ShowCheckMargin 

Indicates whether space for a check mark is shown on the left edge of  the ToolStripMenuItem. 

ShowImageMargin 

Indicates whether space for an image is shown on the left edge of the  ToolStripMenuItem. 

For example, you will have a menu looking like the following using these two properties:

20 

ContextMenuStrip class  The ContextMenuStrip class inherits from ToolStripDropDownMenu class.  It represents shortcut  menus that are displayed when the user clicks the right mouse button over a control or area of  the form. Shortcut menus are typically used to combine different menu items from a MenuStrip of  a form that are useful for the user given the context of the application.  Typically, a shortcut menu is displayed when a user clicks the right mouse button over a control  or the form itself.  Many visible controls, as well as the Form itself, have a  Control.ContextMenuStrip property that binds the ContextMenuStrip class to the control that  displays the shortcut menu.  More than one control can use a ContextMenuStrip.  For example, the following code snippet sets the Form’s ContextMenuStrip and a button’s  ContextMenuStrip properties to the same ContextMenuStrip called fruitContextMenuStrip, and it  also writes a ToolStripDropDownButton’s DropDown to the fruitContextMenuStrip. 

//Assign the ContextMenuStrip to the form's ContextMenuStrip //property.  this.ContextMenuStrip = fruitContextMenuStrip;  //Add a button to the form and assign its ContextMenuStrip.  Button b = new Button();  b.Location = new System.Drawing.Point(60, 160);  this.Controls.Add(b);  b.ContextMenuStrip = fruitContextMenuStrip;  // new ToolStrip  ToolStrip ts = new ToolStrip();  ToolStripDropDownButton fruitToolStripDropDownButton = new  ToolStripDropDownButton("Fruit", null, null, "Fruit");  ts.Items.Add(fruitToolStripDropDownButton);  ts.Dock = DockStyle.Top;  // wire up DropDownItem DropDown  fruitToolStripDropDownButton.DropDown = fruitContextMenuStrip; 

Like its base class ToolStripDropDownMenu, you can use ShowCheckMargin and  ShowImageMargin properties to determine whether the shortcut menu will be able to display a  check mark, an image, or both.  Although ContextMenuStrip replaces and adds functionality to the ContextMenu control of  previous versions, ContextMenu is retained for both backward compatibility and future use if so  desired.

21 

The following table lists some of the important properties:  Property Names 

Description 

ShowCheckMargin 

Indicates whether space for a check mark is shown on the left edge of  the ToolStripMenuItem. 

ShowImageMargin 

Indicates whether space for an image is shown on the left edge of the  ToolStripMenuItem. 

SourceControl 

Identical in function to the old ContextMenu’s SourceControl. It is  used to determine which control sourced the ContextMenuStrip when  multiple controls share the same ContextMenuStrip.  Note: The concept of container ownership and parenting is more  complex in ToolStrips than in a typical Windows Forms container  control. That is necessary to support dynamic scenarios such as  overflow, sharing drop downs across multiple ToolStrip items and to  support spawning ContextMenuStrips from controls. 

How do I prevent a dropdown from closing?  There are two ways: · Set AutoClose = False; · Handle the Closing event and set e.Cancel = True;  If you want to prevent the dropdown from being closed when a specific item is clicked ­ sync the  Opening event, hold onto that item, and when the Closing event comes (and the e.CloseReason  is ItemClicked), cancel the event.  How can I control closing so that clicking on one item is required?  This sample covers dynamically adding items, showing the dropdown and how to implement a  close item that is required to dismiss the dropdown.  public partial class Form1 : Form  {  ContextMenuStrip MyContextMenuStrip = new ContextMenuStrip();  bool CloseClicked = false;  public Form1()  {  InitializeComponent();  // add close item, name it  MyContextMenuStrip.Items.Add("Close");  // add separator  MyContextMenuStrip.Items.Add("­");  // handle MouseDown to no reshow context menu strip  this.MouseDown += new MouseEventHandler(Form1_MouseDown);  // we will add items here  MyContextMenuStrip.Opening += new CancelEventHandler(cms_Opening);  // we will control closing here

22 

MyContextMenuStrip.Closing += new  ToolStripDropDownClosingEventHandler(cms_Closing);  // we will stash a flag on what item is clicked here  MyContextMenuStrip.ItemClicked += new  ToolStripItemClickedEventHandler(cms_ItemClicked);  }  void cms_ItemClicked(object sender, ToolStripItemClickedEventArgs e)  {  if (e.ClickedItem.Text == "Close")  {  CloseClicked = true;  }  }  void cms_Opening(object sender, CancelEventArgs e)  {  // The opening event is automatically cancelled if there are no items to  display.  // To dynamically populate a dropdown in the Opening event, make sure to set  // e.Cancel = false. In this case, we always have an item.  //  // Add a timestamped item  MyContextMenuStrip.Items.Add(DateTime.Now.ToString());  // reset flag  CloseClicked = false;  }  void cms_Closing(object sender, ToolStripDropDownClosingEventArgs e)  {  e.Cancel = true;  // only close if the close item is chosen  if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked &&  CloseClicked)  {  e.Cancel = false;  }  }  private void Form1_MouseDown(object sender, MouseEventArgs e)  {  // show on right click  if (e.Button == MouseButtons.Right)  {  // only if not already showing  if (!MyContextMenuStrip.Visible)  {  // coordinates relative to form  MyContextMenuStrip.Show(this, e.Location);  }  }  }  }

23 

How do I use the ImageMargin and CheckMargin properties?  class Form5 : Form  {  // check/image/checkmargin/imagemargin combinectrics  public Form5()  {  // size form to show three wide menuitems  this.Width = 500;  this.Text = "ToolStripContextMenuStrip: Image and Check Margins";  // new MenuStrip  MenuStrip ms = new MenuStrip();  ToolStripMenuItem bothMargins = new ToolStripMenuItem("BothMargins");  ToolStripMenuItem imageMarginOnly = new ToolStripMenuItem("ImageMargin");  ToolStripMenuItem checkMarginOnly = new ToolStripMenuItem("CheckMargin");  ToolStripMenuItem noMargins = new ToolStripMenuItem("NoMargins");  // wire DropDowns, customize  // both  bothMargins.DropDown = CreateCheckImageContextMenuStrip();  ((ContextMenuStrip)bothMargins.DropDown).ShowImageMargin = true;  ((ContextMenuStrip)bothMargins.DropDown).ShowCheckMargin = true;  // Image only  imageMarginOnly.DropDown = CreateCheckImageContextMenuStrip();  ((ContextMenuStrip)imageMarginOnly.DropDown).ShowImageMargin = true;  ((ContextMenuStrip)imageMarginOnly.DropDown).ShowCheckMargin = false;  // Check only  checkMarginOnly.DropDown = CreateCheckImageContextMenuStrip();  ((ContextMenuStrip)checkMarginOnly.DropDown).ShowImageMargin = false;  ((ContextMenuStrip)checkMarginOnly.DropDown).ShowCheckMargin = true;  // None  noMargins.DropDown = CreateCheckImageContextMenuStrip();  ((ContextMenuStrip)noMargins.DropDown).ShowImageMargin = false;  ((ContextMenuStrip)noMargins.DropDown).ShowCheckMargin = false;  // add items to menustrip  ms.Items.Add(bothMargins);  ms.Items.Add(imageMarginOnly);  ms.Items.Add(checkMarginOnly);  ms.Items.Add(noMargins);  // dock to top  ms.Dock = DockStyle.Top;  // add menustrip to the controls collection last ­ Z order!  this.Controls.Add(ms);  }  internal Bitmap CreateSampleBitmap()  {  // smiley face  Bitmap sampleBitmap = new Bitmap(32, 32);  Graphics g = Graphics.FromImage(sampleBitmap);  using (Pen p = new Pen(ProfessionalColors.ButtonPressedBorder))  {  p.Width = 4;

24 

Point[] curvePoints = new Point[]{  new Point(4,14),  new Point(16,24),  new Point(28,14)};  // mouth  g.DrawCurve(p, curvePoints);  // eyes  g.DrawEllipse(p, new Rectangle(new Point(7, 4), new Size(3, 3)));  g.DrawEllipse(p, new Rectangle(new Point(22, 4), new Size(3, 3)));  }  return sampleBitmap;  }  internal ContextMenuStrip CreateCheckImageContextMenuStrip()  {  // new ContextMenuStrip  ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip();  ToolStripMenuItem yesCheckYesImage = new ToolStripMenuItem("Check, Image");  yesCheckYesImage.Checked = true;  yesCheckYesImage.Image = CreateSampleBitmap();  ToolStripMenuItem noCheckYesImage = new ToolStripMenuItem("No Check,  Image");  noCheckYesImage.Checked = false;  noCheckYesImage.Image = CreateSampleBitmap();  ToolStripMenuItem yesCheckNoImage = new ToolStripMenuItem("Check, No  Image");  yesCheckNoImage.Checked = true;  ToolStripMenuItem noCheckNoImage = new ToolStripMenuItem("No Check, No  Image");  noCheckNoImage.Checked = false;  // add items to context menu strip  checkImageContextMenuStrip.Items.Add(yesCheckYesImage);  checkImageContextMenuStrip.Items.Add(noCheckYesImage);  checkImageContextMenuStrip.Items.Add(yesCheckNoImage);  checkImageContextMenuStrip.Items.Add(noCheckNoImage);  return checkImageContextMenuStrip;  }  } 

How can I make a user resizable dropdown?  You need to handle WM_NCHITTEST. 

ToolStripItem class  ToolStripItem is the abstract base class for all the items that go into a ToolStrip. The functionality  here is quite extensive. Notable is core eventing, Text, Image, sizing, TextImageRelation,  DisplayStyle, Alignment, Owner.

25 

The following table shows the elements that derive from the ToolStripItem class and which  therefore can be hosted in a ToolStrip or ToolStripDropDown. 

Group 

Element 

Description 

Simple elements 

ToolStripButton 

A toolbar button that supports images  and text. 

ToolStripLabel 

A text label typically used in a status  bar or ToolStrip as a comment or title. 

└ToolStripStatusLabel  A panel in a StatusStrip control. 

ToolStripControlHost 

ToolStripSeparator 

A non­selectable space or space with a  horizontal or vertical bar that visually  groups elements. 

ToolStripComboBox 

The user can select text from the  dropdown to fill the text box or enter  text into the text box. 

ToolStripTextBox 

Enables the user to enter text. 

ToolStripProgressBar 

A Wndows progress bar control  contained in a StatusStrip. 

ToolStripDropDownItem  ToolStripDropDownButton 

A button that supports drop­down  functionality. 

└ToolStripOverflowButton  Hosts a ToolStripDropDown that  displays items that overflow the  ToolStrip.  ToolStripSplitButton 

A combination of a regular button and a  drop­down button. 

ToolStripMenuItem 

A selectable option displayed on a  menu or context menu.

26 

27

The following table lists some important members of the ToolStripItem class:  Property Names 

Description 

AutoSize 

Controls whether the item is automatically sized.  By default,  it is set to True.  To manually set the size of a ToolStripItem,  you need to set this property to False and set its Size  property to desired size. 

Available 

Indicates whether the ToolStripItem should be placed on a  ToolStrip.  See “Available vs. Visible” for further details. 

DisplayStyle 

Controls whether text and images are displayed on a  ToolStripItem.  The value can be set to Image,  ImageAndText, None, and Text.  The default is ImageAndText. 

Image 

Specifies the image that is displayed on a ToolStripItem.  Images in ToolStrips are supported via direct property set or  via ImageList support (runtime only).  It also supports animated images and .ICO files.  The  ToolStripItem class supports the ImageAnimator class.  When  you assign an animated GIF to the Image property, it will  automatically render the animation. 

ImageAlign 

The alignment of the image on a ToolStripItem.  The value  can be set to any combination of top, middle, and bottom with  left, center, and right.  The default is MiddleLeft.  For example, here is a ToolStripSplitButton with its  ImageAlign set to TopLeft and TextAlign set to BottomRight: 

ImageIndex 

The index value of the image that is displayed on the item. 

ImageKey 

The key accessor for the image in the ImageList that is  displayed on a ToolStripItem. 

ImageScaling 

This controls whether the image associated with this item is  scaled into the size prescribed (either by the  ToolStrip.ImageScalingSize or as determined by AutoSize).  Note: See the ToolStripItem.ImageScaling table for details. 

ImageTransparentColor 

The color to treat as transparent in a ToolStripItem image. 

Margin 

Specifies the space between the item and adjacent items  items in this order: Left, Top, Right, and Bottom;  You can insert the desired values (in pixels) into the Margin

28 

property of the associated control.  See “What are padding  and margin?” for more details about margin. 

MergeAction 

How child menus are merged with parent menus.  This will be  discussed in further details later in the training. 

MergeIndex 

The position of a merged item within the current ToolStrip. 

Overflow 

Determines whether the item is attached to the ToolStrip or  ToolStripOverflowButton or can float between the two. · AsNeeded : a ToolStripItem drifts between the main  ToolStrip and the overflow ToolStrip as required if  space is not available on the main ToolStrip; · Always: a ToolStripItem is permanently shown in the  overflow ToolStrip; · Never : a ToolStripItem is never a candidate for the  overflow ToolStrip. If the ToolStripItem cannot fit on  the main ToolStrip, it will not be shown. 

Owner 

The owner of the item.  This returns the ToolStrip whose  Items collection contains this ToolStripItem. This is the best  way to reference ImageList or other properties in the top level  ToolStrip without writing special case code to handle  overflow.  Note: The concept of container ownership and parenting is  more complex in ToolStrips than in a typical Windows Forms  container control. That is necessary to support dynamic  scenarios such as overflow, sharing drop downs across  multiple ToolStrip items and to support spawning  ContextMenuStrips from controls. 

Padding 

Specifies the internal spacing (in pixels) between the item's  contents and its edges; See “What are padding and margin?”  for more details about padding. 

Parent 

The parent container of the item.  The parent ToolStrip can be  distinct from the owner ToolStrip, because the item can fall

29 

into another window such as an Overflow. In this case, the  Overflow is the parent, but the original ToolStrip is the owner.  The parent ToolStrip fires paint events and so on, while the  owner ToolStrip contains shared data such as image lists.  Typically, the Parent property is set by the layout manager on  the ToolStrip.  Placement 

Specifies where a ToolStripItem is to be layed out: · Main: on the main ToolStrip. · None: not to be layed out on the screen; · Overflow: on the Overflow ToolStrip; 

Pressed 

Indicates whether the state of the item is pressed. 

RightToLeftAutoMirrorImages 

Mirrors automatically the ToolStripItem image when the  RightToLeft property is set to Yes. 

Selected 

Indicates whether the item is selected. 

TextImageRelation 

Controls the position of ToolStripItem text and image relative  to each other.  The value can be set to ImageAboveText,  ImageBeforeText, Overlay, TextAboveImage, and  TextBeforeImage.  The default is ImageBeforeText.  For example, the New button has its TextImageRelation set to  ImageAboveText. 

TextAlign 

The alignment of the text on a ToolStripItem.  The value can  be set t o any combination of top, middle, and bottom with  left, center, and right.  The default is MiddleCenter.  For example, here is a ToolStripSplitButton with its  ImageAlign set to TopLeft and TextAlign set to BottomRight: 

Visible 

Indicates whether the item is displayed.  See “Available vs.  Visible” for further details. 

Method Name 

Description 

GetCurrentParent 

Rather than expose r/w Parent, the ToolStripItem class  provides a read only accessor to the property via this method.  Parent differs from Owner in that it will return the current  ToolStrip in which the item is displayed within which may be

30 

the Overflow.  Note: The concept of container ownership and parenting is  more complex in ToolStrips than in a typical Windows Forms  container control. That is necessary to support dynamic  scenarios such as overflow, sharing drop downs across  multiple ToolStrip items and to support spawning  ContextMenuStrips from controls. 

ToolStripItem.ImageScaling  ToolStrip  AutoSize 

ToolStripItem.ImageScalingMode  SizeToFit 

TRUE 

Scales to ToolStrip.ImageScalingSize 

(Default) No Image Scaling.  ToolStrip sizes to largest of largest  item or minimum size 

FALSE 

Scales to area remaining in ToolStrip 

No Image Scaling;  No ToolStrip Sizing; 

None 

What are padding and margin?  Padding is the interior space to add, Margin is the exterior space between controls. When a  control is a container of items, padding represents the space from the edge of the container.

31 

Available vs. Visible  In ToolStrips, Visible always returns the true state of the item and its container. That means if you  check the visible property of the ToolStripMenuItem before it is ever shown – it will be visible false.  Available is what you’d want to use in that case which means it will try to lay that item out. This is  regardless of whether it’ll end up in the overflow or Placement = none.  If you are using DataBinding, Available is better to bind to than the Visible property, as the Visible  property also returns the state of its container.  In the case of a ToolStripDropDown, an item is  usually going to be Visible = False, but Available = True.  How can I get one image out of many to not be scaled?  Use ToolStripItem.ImageScaling = ToolStrimItemImageScaling.None  How can I tell when the mouse is over a ToolStripItem such as a ToolStripButton?  Use the Selected property for items in which "CanSelect" is true. Otherwise you'll have to sync  MouseEnter, MouseLeave events. You can check for Selected in your custom Renderer as well.

32 

ToolStripButton class  This class inherits from ToolStripItem class.  It is the button item for ToolStrips. You can use it to  create a toolbar button that supports both text and images.  Use the ImageAlign and TextAlign  properties to get or set the positioning of ToolStripButton images and text.  Although ToolStripButton replaces and extends the ToolBarButton control of previous versions,  ToolBarButton is retained for both backward compatibility and future use.  The following table describes some of the important properties.  Property Names 

Description 

AutoToolTip 

Indicates whether default or custom ToolTip text is displayed on the  ToolStripButton.  By default, the value is set to True, and a  ToolStripButton uses its Text property for the ToolTip text.  To display  custom text via the ToolTipText property, you need to set the  AutoToolTip property to False.  AutoToolTip is set to true for these classes only  •  ToolStripButton  •  ToolStripDropDownButton  •  ToolStripSplitButton 

CanSelect 

Whether the ToolStripButton can be selected. 

Checked 

Whether the ToolStripButton is pressed in or not.  For example, the  following pictures show that the New button has its Checked property  set to True, and CheckState set to Checked when the ToolStrip is  rendered with Professional and System rendering mode, respectively: 

CheckOnClick 

Whether the ToolStripButton should automatically appear pressed in  and not pressed in when clicked. 

CheckState 

The state of the ToolStripButton: pressed, not pressed or an  intermediate state. 

How do I create toggle buttons in ToolStrip controls?  A toggle button is a button that appears pressed when a user clicks on it and retains pressed  appearance until the user clicks on it again.  The following code snippet shows how to implement  one.  [VB]

33 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles MyBase.Load  NewToolStripButton.CheckOnClick = True  AddHandler NewToolStripButton.CheckedChanged, AddressOf  NewToolStripButton_CheckedChanged  End Sub  Private Sub NewToolStripButton_CheckedChanged(ByVal sender As Object, ByVal e  As System.EventArgs) Handles NewToolStripButton.CheckedChanged  End Sub 

[C#]  private void Form1_Load(object sender, EventArgs e)  {  newToolStripButton.CheckOnClick = true;  newToolStripButton.CheckedChanged += new  EventHandler(newToolStripButton_CheckedChanged);  }  private void newToolStripButton_CheckedChanged(object sender, EventArgs  e)  {  } 

ToolStripLabel class  ToolStripLabel provides label functionality in ToolStrip.  This class inherits from ToolStripItem class and provides label functionality in ToolStrip.  It  represents a non­selectable ToolStripItem that renders text and images and can also display  hyperlinks.  Often overlooked, the ToolStripLabel is a very powerful item. It can be thought of as a  ToolStripButton which doesn’t get focus by default and doesn’t render depressed and highlighted.  Using the TextAlign and ImageAlign properties, you can use ToolStripLabel to create a label that  can render text and images.  It also has many properties that enable it to display one or more  hyperlinks, and other properties that modify the appearance and behavior of hyperlinks.  The following table lists some of the important properties.  Property Names 

Description 

ActiveLinkColor 

Gets or sets the color used to display an active link. 

IsLink 

Whether the ToolStripLabel is a hyperlink.  When you set this to true,  the entire text in the ToolStripLabel will be treated as a hyperlink.  If  you want to have mixed mode of linked and standard text, you can  use a ToolStripControlHost. 

LinkBehavior 

Represents the behavior of a link.  You can set it to one of the  following values: SystemDefault, AlwaysUnderline, HoverUnderline,  NeverUnderline. 

LinkColor 

The color used when displaying a normal link.

34 

LinkVisited 

Whether a link should be displayed as though it were visited. 

VisitedLinkColor 

The color used when displaying a link that that has been previously  visited. 

How do I get a mnemonic for a ToolStripComboBox, ToolStripTextBox or similar?  ToolStripLabel supports mnemonic forwarding – simply precede your ToolStripControlHostItem  with a ToolStripLabel with a mnemonic defined and you will get focus to the  ToolStripControlHostItem when ALT+mnemonic is pressed.  Do ToolStrips support a link control?  Yes, ToolStripLabel has an IsLink property that will render it in a link style. LinkColor, LinkVisited  and LinkBehavior are exposed. 

ToolStripStatusLabel class  This class inherits from ToolStripLabel class, and represents an individual panel in a StatusStrip  control.  A ToolStripStatusLabel can contain text or an icon that reflects the status of an application. Use  the ToolStripItemCollection class to find, add, or remove ToolStripStatusLabel objects.  Although ToolStripStatusLabel replaces and adds functionality to the StatusBarPanel control of  previous versions, StatusBarPanel is retained for both backward compatibility and future use if  you choose  The following table describes the important properties:  Property Names 

Description 

BorderSides 

Indicates which sides of the ToolStripStatusLabel show borders. 

BorderStyle 

The border style of the ToolStripStatusLabel.  Note: There is no built­in accomodation to render adjacent  ToolStripStatusLabel’s borders as one. 

Spring 

A value indicating whether the ToolStripStatusLabel automatically fills  the available space on the StatusStrip as the form is resized.  See the  paragraph below on this property for further details. 

Using the Spring property  Spring is supported only in StatusStrip and only with StatusStripLabels. It utilizes the underlying  Table layout with a column style set to percentage to achieve the effect of the Spring panel filling  the remaining space. Multiple ToolStripPanels set to Spring are sized equally, sharing the  remaining space equally.  For example,

35 

class Form4 : Form  {  ToolStripStatusLabel middleLabel;  public Form4()  {  // new StatusStrip  StatusStrip ss = new StatusStrip();  // add left label  ss.Items.Add("Left");  // handle middle label separately  middleLabel = new ToolStripStatusLabel("Middle (Spring)");  middleLabel.Click += new EventHandler(middleLabel_Click);  ss.Items.Add(middleLabel);  // add right label  ss.Items.Add("Right");  // Add the statusStrip to the controls collection  this.Controls.Add(ss);  }  void middleLabel_Click(object sender, EventArgs e)  {  if (middleLabel.Spring)  {  middleLabel.Spring = false;  middleLabel.Text = "Middle (Spring ­ False)";  }  else  {  middleLabel.Spring = true;  middleLabel.Text = "Middle (Spring ­ True)";  }  }  } 

ToolStripSeparator class  This class inherits from ToolStripItem class.  It represents a line used to group related items of a  ToolStrip or the drop­down items of a MenuStrip or ContextMenuStrip or other  ToolStripDropDown control.  The ToolStripSeparator is automatically spaced and oriented  horizontally or vertically to accord with its container.  What’s an easier way to enter a separator than creating a new one or picking from the  dropdown?  Simply enter a hyphen or dash (“­“) in either the designer template node or via the Add method on  ToolStripItemCollection. This will automatically create a separator.  Does ToolStrips automatically eliminate duplicate or trailing separators from layout?  No, but the following code will do it for you:

36 

void DropDown_Layout(object sender, LayoutEventArgs e)  {  StripSeparators(((ToolStrip)sender).Items);  }  public void StripSeparators(ToolStripItemCollection tsItems)  {  // ItemCollections should neither begin with, end with or contain adjacent  separators.  bool itemDisplayed = false;  ToolStripItem lastSeparator = null;  foreach (ToolStripItem tsItem in tsItems)  {  if (tsItem.Available)  {  if (tsItem is ToolStripSeparator)  {  // hide all separators  tsItem.Visible = false;  // only set in a separator that has a chance to be shown later  // if no items have been displayed, no chance  if (itemDisplayed) lastSeparator = tsItem;  }  else if (lastSeparator != null)  {  // show it when valid  lastSeparator.Visible = true;  }  else  {  itemDisplayed = true;  }  }  }  } 

ToolStripControlHost class  This class inherits from ToolStripItem class and is the base class for ToolStripTextBox,  ToolStripComboBox, ToolStripProgressBar.  You can use this class to host your customized controls or any other Windows Forms control.  It  is designed to enable hosting of arbitrary Windows Forms controls in two ways: · Directly using the ToolStripControlHost and pass a control into its constructor; · Extending ToolStripControlHost itself;  It is easier to wrap the control by extending ToolStripControlHost and implementing properties  and methods that expose frequently used properties and methods of the control. You can also  expose events for the control at the ToolStripControlHost level.  toolStrip1.Items.Add(new ToolStripControlHost(new TrackBar()));

37 

The follow table lists some of the important properties:  Property Names 

Description 

CauseValidation 

Whether the hosted control causes and raises validation events on  other controls when the hosted control receives focus. 

Control 

Gets the Control that this ToolStripControlHost is hosting. 

ControlAlign 

The alignment of the control on the form. 

How do I show a user control in a dropdown?  private void button1_Click(object sender, EventArgs e)  {  ToolStripDropDown toolStripDropDown = new ToolStripDropDown();  // Create some user control  UserControl1 uc = new UserControl1();  uc.Margin = Padding.Empty;  toolStripDropDown.SuspendLayout();  // create the control host to host the user control  //make sure it has no margin  ToolStripControlHost host = new ToolStripControlHost(uc);  host.Margin = Padding.Empty;  // add the control host to the toolstripdropdown  toolStripDropDown.Items.Add(host);  // set the padding of the toolstripdropdown to be empty  toolStripDropDown.Padding = Padding.Empty;  // show no borders  toolStripDropDown.Renderer = new BorderlessRenderer();  toolStripDropDown.ResumeLayout();  toolStripDropDown.Show(this.button1, 10, 10);  }  private class BorderlessRenderer : ToolStripProfessionalRenderer  {  protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)  {  // do nothing  }  } 

How do I wrap a Windows Forms control in ToolStripControlHost?  Here are the 6 steps to host a Windows Forms control in a ToolStripControlHost by derivation.  A  MonthCalendar control is used as an example.  1.  Derive a class that inherits from ToolStripControlHost.  [C#]  public class ToolStripMonthCalendar : ToolStripControlHost

38 

[VB]  Public Class ToolStripMonthCalendar  Inherits ToolStripControlHost 

2.  Implement a default constructor that calls the base class constructor passing in the desired  control.  [C#]  public ToolStripMonthCalendar() : base(new MonthCalendar()) { } 

[VB]  Public Sub New()  MyBase.New(New MonthCalendar())  End Sub 

3.  Declare a property of the same type as the wrapped control and return Control as the correct  type of control in the property's accessor.  [C#]  public MonthCalendar MonthCalendarControl  {  get  {  return Control as MonthCalendar;  }  }

[VB]  Public ReadOnly Property MonthCalendarControl() As MonthCalendar  Get  Return CType(Control, MonthCalendar)  End Get  End Property 

4.  Expose other frequently used properties and methods of the wrapped control with properties  and methods in the extended class.  [C#]  // Expose the MonthCalendar.FirstDayOfWeek as a property.  public Day FirstDayOfWeek  {  get  {  return MonthCalendarControl.FirstDayOfWeek;  }  set { value = MonthCalendarControl.FirstDayOfWeek; }  }

[VB]  Public Property FirstDayOfWeek() As Day  Get  Return MonthCalendarControl.FirstDayOfWeek  End Get  Set(ByVal value As Day)  value = MonthCalendarControl.FirstDayOfWeek  End Set  End Property 

5.  Optionally, override the OnSubscribeControlEvents, and OnUnsubscribeControlEvents  methods and add the control events you want to expose.  [C#]  // Subscribe and unsubscribe the control events you wish to expose.  protected override void OnSubscribeControlEvents(Control c)

39 

{  // Call the base so the base events are connected.  base.OnSubscribeControlEvents(c);  // Cast the control to a MonthCalendar control.  MonthCalendar monthCalendarControl = (MonthCalendar)c;  // Add the event.  monthCalendarControl.DateChanged +=  new DateRangeEventHandler(OnDateChanged);  }  protected override void OnUnsubscribeControlEvents(Control c)  {  // Call the base method so the basic events are unsubscribed.  base.OnUnsubscribeControlEvents(c);  // Cast the control to a MonthCalendar control.  MonthCalendar monthCalendarControl = (MonthCalendar)c;  // Remove the event.  monthCalendarControl.DateChanged ­=  new DateRangeEventHandler(OnDateChanged);  } 

[VB]  Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control)  ' Call the base so the base events are connected.  MyBase.OnSubscribeControlEvents(c)  ' Cast the control to a MonthCalendar control.  Dim monthCalendarControl As MonthCalendar = _  CType(c, MonthCalendar)  ' Add the event.  AddHandler monthCalendarControl.DateChanged, _  AddressOf HandleDateChanged  End Sub  Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)  ' Call the base method so the basic events are unsubscribed.  MyBase.OnUnsubscribeControlEvents(c)  ' Cast the control to a MonthCalendar control.  Dim monthCalendarControl As MonthCalendar = _  CType(c, MonthCalendar)  ' Remove the event.  RemoveHandler monthCalendarControl.DateChanged, _  AddressOf HandleDateChanged  End Sub 

6.  Provide the necessary wrapping for the events you want to expose.  [C#]  // Declare the DateChanged event.  public event DateRangeEventHandler DateChanged;  // Raise the DateChanged event.  private void OnDateChanged(object sender, DateRangeEventArgs e)  {

40 

if (DateChanged != null)  {  DateChanged(this, e);  }  } 

[VB]  ' Declare the DateChanged event.  Public Event DateChanged As DateRangeEventHandler  ' Raise the DateChanged event.  Private Sub HandleDateChanged(ByVal sender As Object, _  ByVal e As DateRangeEventArgs)  RaiseEvent DateChanged(Me, e)  End Sub 

ToolStripTextBox class  This class inherits from ToolStripControlHost.  It represents a text box in a ToolStrip that allows  the user to enter text.  This control has additional functionality that is not found in the standard  Windows text box control, including multi­line editing features such as AcceptsTab and  AcceptsReturn.  You can limit the amount of text entered into a ToolStripTextBox control by setting the MaxLength  property to a specific number of characters. Use the CharacterCasing property to allow the user  to type only uppercase, only lowercase, or a combination of uppercase and lowercase characters  into the ToolStripTextBox control.  To restrict text from being entered in a ToolStripTextBox control, you can create an event handler  for the KeyDown event in order to validate each character entered in the control. You can also  restrict all entry of data in a ToolStripTextBox control by setting the ReadOnly property to true.  The following table lists some of the important properties.  Property Names 

Description 

AcceptsReturn 

Indicates whether pressing ENTER in a multi­line TextBox control  creates a new line of text in the control or activates the default  button for the form. 

AcceptsTab 

Indicates whether pressing the TAB key in a multi­line text box  control types a TAB character in the control instead of moving the  focus to the next control in the tab order. 

AutoCompleteCustomSource  A custom string collection to use when the AutoCompleteSource  property is set to CustomSource enumeration.  AutoCompleteSource 

An option that controls how automatic completion works for the  ToolStripTextBox. 

CharacterCasing 

Indicates whether the ToolStripTextBox control modifies the case  of characters as they are typed.

41 

HideSelection 

Indicates whether the selected text in the text box control remains  highlighted when the control loses focus. 

Lines 

The lines of text in a ToolStripTextBox control. 

MaxLength 

The maximum number of characters the user can type or paste  into the text box control. 

Modified 

Indicates that the ToolStripTextBox control has been modified by  the user since the control was created or its contents were last  set. 

ReadOnly 

Indicates whether text in the ToolStripTextBox is read­only. 

SelectedText 

Indicates the currently selected text in the control. 

SelectionLength 

The number of characters selected in theToolStripTextBox. 

SelectionStart 

The starting point of text selected in theToolStripTextBox. 

ShortCutsEnabled 

Indicates whether the defined shortcuts are enabled. 

TextBox 

Gets the hosted TextBox control. 

TextBoxTextAlign 

Indicates how text is aligned in a TextBox control. 

TextLength 

Gets the length of text in the control. 

ToolStripComboBox class  This class inherits from ToolStripControlHost.  It displays an editing field combined with a ListBox,  allowing the user to select from the list or to enter new text.  By default, a ToolStripComboBox displays an edit field with a hidden drop­down list. The  DropDownStyle property determines the style of combo box to display. There is three drop­down  styles: · Simple: the list always displays; · DropDownList: the text portion is not editable and you must select an arrow to view the  drop­down list box; · DropDown (default): where the text portion is editable and the user must press the arrow  key to view the list;  To add objects to the list at run time, assign an array of object references with the AddRange  method. The list then displays the default string value for each object. You can add individual  objects with the Add method.  In addition to display and selection functionality, the ToolStripComboBox also provides features  that enable you to efficiently add items to the ToolStripComboBox and to find text within the items  of the list: · The BeginUpdate and EndUpdate methods enable you to add a large number of items to  the ToolStripComboBox without the control being repainted each time an item is added to  the list.

42 

· ·

The FindString and FindStringExact methods enable you to search for an item in the list  that contains a specific search string. Use the SelectedIndex property to get or set the current item in the drop­down list, and  use the SelectedItem property to get or set a reference to the current item in the drop­  down list. 

The following table lists some of the important properties:  Property Names 

Description 

AutoCompleteCustomSource  The custom string collection to use when the  AutoCompleteSource property is set to CustomSource  enumeration.  AutoCompleteMode 

Indicates the text completion behavior of the ToolStripComboBox. 

AutoCompleteSource 

The source of complete strings used for automatic completion. 

ComboBox 

Gets a ComboBox in which the user can enter text, along with a  list from which the user can select. 

DropDownHeight 

Controls the height (in pixels) of the drop­down portion box of a  ToolStripComboBox. 

DropDownStyle 

Specifies the style of the ToolStripComboBox. 

DropDownWidth 

Controls the width(in pixels) of the of the drop­down portion of a  ToolStripComboBox. 

DroppedDown 

Indicates whether the ToolStripComboBox currently displays its  drop­down portion. 

FlatStyle 

Controls the appearance of the ToolStripComboBox: Flat, PopUp,  Standard, or System. 

IntegralHeight 

Indicates whether the ToolStripComboBox should resize to avoid  showing partial items. 

MaxDropDownItems 

The maximum number of items to be shown in the drop­down  portion of the ToolStripComboBox. 

MaxLength 

The maximum number of characters allowed in the editable  portion of a combo box. 

SelectedIndex 

The index specifying the currently selected item. 

SelectedItem 

Currently selected item in the ToolStripComboBox. 

SelectedText 

The text that is selected in the editable portion of a  ToolStripComboBox. 

SelectionLength 

The number of characters selected in the editable portion of the  ToolStripComboBox. 

SelectionStart 

The starting index of text selected in the ToolStripComboBox. 

Sorted 

Indicates whether the items in the ToolStripComboBox are sorted.

43

ToolStripProgressBar class  This class inherits from ToolStripControlHost. It represents a Windows progress bar control  contained in a StatusStrip.  It visually indicates the progress of a lengthy operation (e.g, copying  files or printing documents) by displaying a bar that fills in from left to right with the system  highlight color as an operation progresses.  It can only be oriented horizontally.  The Maximum and Minimum properties define the range of values to represent the progress of a  task. The Minimum property is typically set to a value of zero, and the Maximum property is  typically set to a value indicating the completion of a task. For example, to display the progress  properly when copying a group of files, the Maximum property could be set to the total number of  files to be copied.  The Value property represents the progress that the application has made toward completing the  operation. Because the bar displayed in the control is a collection of blocks, the value displayed  by the ToolStripProgressBar only approximates the Value property's current value. Based on the  size of the ToolStripProgressBar, the Value property determines when to display the next block.  There are a number of ways to modify the value displayed by the ToolStripProgressBar other  than changing the Value property directly. You can use the Step property to specify a specific  value to increment the Value property by, and then call the PerformStep method to increment the  value. To vary the increment value, you can use the Increment method and specify a value by  which to increment the Value property.  ToolStripProgressBar replaces the older ProgressBar control, which is nevertheless retained for  backward compatibility.  The following table lists some of the important members.  Property Names 

Description 

Maximum 

Controls the upper bound of the range that is defined for this  ToolStripProgressBar. 

Minimum 

Controls the lower bound of the range that is defined for this  ToolStripProgressBar. 

Step 

The amount by which to increment the current value of the  ToolStripProgressBar when the PerformStep method is called. 

Style 

The style of the ToolStripProgressBar. 

Value 

The current value of the ToolStripProgressBar. 

Method Names 

Description 

Increment 

Advances the current position of the progress bar by the specified  amount. 

PerformStep 

Advances the current position of the progress bar by the amount  of the Step property.

44 

ToolStripDropDownItem class  This class inherits from ToolStripItem.  It is the abstract base class for ToolStripDropDownButton,  ToolStripMenuItem, and ToolStripSplitButton controls.  It provides basic functionality for controls  that display a ToolStripDropDown when these controls are clicked.  The following table lists some of the important properties.  Property Names 

Description 

DropDown 

The ToolStripDropDown that will be displayed when this  ToolStripDropDownItem is clicked. 

DropDownDirection 

Indicates the direction in which the ToolStripDropDownItem  emerges from its parent container.  These four values should be used with the Show() method. They  are positioned absolutely and may overlap existing dropdowns. · AboveLeft · AboveRight · BelowLeft · BelowRight  These three values are for use with Menus and will be  automatically positioned to not layer over previous menus: · Default: used with either, default, respects RightToLeft · Left: used with ToolStripDropDownMenu or  ContextMenuStrip.  It forces left rather than respecting  RightToLeft. · Right: used with ToolStripDropDownMenu or  ContextMenuStrip.  It forces right rather than respecting  RightToLeft. 

DropDownItems 

The collection of items in the ToolStripDropDown that is  associated with this ToolStripDropDownItem. 

HasDropDownItems 

Indicates whether the ToolStripDropDownItem has  ToolStripDropDown controls associated with it. 

IsOnDropDown 

Indicates whether the container of the current Control is a  ToolStripDropDown. 

IsOnOverflow 

Indicates whether the Placement property is set to Overflow. 

Pressed 

Indicates whether the ToolStripDropDownItem is in the pressed  state. 

DropDownItemClicked, DropDownItem  You can populate a dropdown via two different methods:  1.  Populating the DropDownItems collection;  2.  Assigning a created ContextMenuStrip to the ToolStripDropDownItem’s DropDown  property;

45 

Another notable feature of ToolStripDropDownItem is the DropDownItemClicked event. This  allows you a convenient way to not have to sync each item in a ToolStripDropDown’s click event.  And you don’t have to search into the collection either, we just hand you back the item that was  clicked on. The following sample shows these concepts.  // populate the DropDownItems Collection  ToolStripMenuItem veggiesMenuItem = new ToolStripMenuItem("Veggies");  veggiesMenuItem.DropDownItems.Add("Asparagus");  veggiesMenuItem.DropDownItems.Add("Bok Choy");  veggiesMenuItem.DropDownItems.Add("Cauliflower");  // Hook up the handler  veggiesMenuItem.DropDownItemClicked += new  ToolStripItemClickedEventHandler(myDropDownItemClicked);  // assign a dropdown  ContextMenuStrip cms = new ContextMenuStrip();  cms.Items.Add("Apples");  cms.Items.Add("Bananas");  cms.Items.Add("Cherries");  ToolStripMenuItem fruitMenuItem = new ToolStripMenuItem("Fruit");  fruitMenuItem.DropDown = cms;  // Hook up the handler  fruitMenuItem.DropDownItemClicked += new  ToolStripItemClickedEventHandler(myDropDownItemClicked);  // menustrip  MenuStrip ms = new MenuStrip();  ms.Items.Add(fruitMenuItem);  ms.Items.Add(veggiesMenuItem);  this.Controls.Add(ms); 

ToolStripMenuItem class  This class inherits from ToolStripDropDownItem.  It represents a selectable option displayed on a  MenuStrip or ContextMenuStrip.  In order for a ToolStripMenuItem to be displayed, you must add  it to a MenuStrip or ContextMenuStrip.  The ToolStripMenuItem class provides properties that enable you to configure the appearance  and functionality of a menu item. · Use the Checked property to display a check mark next to a menu item.  This feature is  to identify a menu item that is selected in a list of mutually exclusive menu items.  For  example, if you have a set of menu items for setting the color of text in a TextBox control,  use the Checked property to identify which color is currently selected. · Use the ShortcutKeys property to define a keyboard combination that can be pressed to  select the menu item.  Although ToolStripMenuItem replaces and adds functionality to the MenuItem control of previous  versions, MenuItem is retained for both backward compatibility and future use if you choose.  For example, the following figure shows that the Colors menu contains five ToolStripMenuItem,  where the first one has its Checked property set to True, ShortCutKeys property set to Ctrl+R,  ShortCutKeyDisplayString set to Ctrl+R, and  ShowShortCurKeys set to True:

46 

The following table lists some of the important properties:  Property Names 

Description 

Checked 

Indicates whether the ToolStripMenuItem is checked. 

CheckOnClick 

Indicates whether the ToolStripMenuItem should automatically  appear checked and unchecked when clicked. 

CheckState 

Indicates whether a ToolStripMenuItem is in the checked,  unchecked, or indeterminate state. 

IsMdiWindowListEntry 

Indicates whether the ToolStripMenuItem appears on a multiple  document interface (MDI) window list.  It is a ReadOnly property. 

ShortcutKeyDisplayString 

Controls the shortcut key text. 

ShortcutKeys 

Controls the shortcut keys associated with the  ToolStripMenuItem. 

ShowShortcutKeys 

Indicates whether the shortcut keys that are associated with the  ToolStripMenuItem are displayed next to the ToolStripMenuItem. 

How do I clone a ToolStripMenuItem?  By default, ToolStripMenuItem does not contain an implementation for cloning. Here's the code  for ToolStripMenuItem.Clone.  An alternate solution is to implement IBindableComponent and  data bind your menu item to a command which drives the Text/Image/Enabled/Available  properties.  public class ClonableToolStripMenuItem : ToolStripMenuItem {  public ClonableToolStripMenuItem() {  }  internal ToolStripMenuItem Clone() {  // dirt simple clone ­ just properties, no subitems  ClonableToolStripMenuItem menuItem = new ClonableToolStripMenuItem();  menuItem.Events.AddHandlers(this.Events);  menuItem.AccessibleName = this.AccessibleName;  menuItem.AccessibleRole = this.AccessibleRole;  menuItem.Alignment = this.Alignment;  menuItem.AllowDrop = this.AllowDrop;  menuItem.Anchor = this.Anchor;  menuItem.AutoSize = this.AutoSize;  menuItem.AutoToolTip = this.AutoToolTip;

47 

menuItem.BackColor = this.BackColor;  menuItem.BackgroundImage = this.BackgroundImage;  menuItem.BackgroundImageLayout = this.BackgroundImageLayout;  menuItem.Checked = this.Checked;  menuItem.CheckOnClick = this.CheckOnClick;  menuItem.CheckState = this.CheckState;  menuItem.DisplayStyle = this.DisplayStyle;  menuItem.Dock = this.Dock;  menuItem.DoubleClickEnabled = this.DoubleClickEnabled;  menuItem.Enabled = this.Enabled;  menuItem.Font = this.Font;  menuItem.ForeColor = this.ForeColor;  menuItem.Image = this.Image;  menuItem.ImageAlign = this.ImageAlign;  menuItem.ImageScaling = this.ImageScaling;  menuItem.ImageTransparentColor = this.ImageTransparentColor;  menuItem.Margin = this.Margin;  menuItem.MergeAction = this.MergeAction;  menuItem.MergeIndex = this.MergeIndex;  menuItem.Name = this.Name;  menuItem.Overflow = this.Overflow;  menuItem.Padding = this.Padding;  menuItem.RightToLeft = this.RightToLeft;  menuItem.ShortcutKeys = this.ShortcutKeys;  menuItem.ShowShortcutKeys = this.ShowShortcutKeys;  menuItem.Tag = this.Tag;  menuItem.Text = this.Text;  menuItem.TextAlign = this.TextAlign;  menuItem.TextDirection = this.TextDirection;  menuItem.TextImageRelation = this.TextImageRelation;  menuItem.ToolTipText = this.ToolTipText;  menuItem.Available = this.Available;  if (!AutoSize) {  menuItem.Size = this.Size;  }  return menuItem;  }  } 

ToolStripSplitButton class  This class inherits from ToolStripDropDownItem.  It represents a combination of a standard  button on the left and a drop­down button on the right, or the other way around if the value of  RightToLeft is set to Yes.

48 

The following table lists some of the important properties.  Property Names 

Description 

AutoToolTip 

Indicates whether default or custom ToolTip text is displayed on  the ToolStripSplitButton.  By default, the value is set to True, and  a ToolStripSplitButton uses its Text property for the ToolTip text.  To display custom text via the ToolTipText property, you need to  set the AutoToolTip property to False.  AutoToolTip is set to true by default for these classes only  •  ToolStripButton  •  ToolStripDropDownButton  •  ToolStripSplitButton 

ButtonBounds 

Gets the size and location of the standard button portion of a  ToolStripSplitButton. 

ButtonPressed 

Indicates whether the standard button portion of the  ToolStripSplitButton is in the pressed state. 

ButtonSelected 

Indicates whether the standard button portion of a  ToolStripSplitButton is selected. 

DefaultItem 

Controls the portion of the ToolStripSplitButton that is activated  when the control is first selected.  See the “DefaultItem”  paragraph for details. 

DoubleClickEnabled 

Indicates whether the control can be activated by double­clicking  the mouse. 

DropDownButtonBounds 

Gets the size and location (in screen coordinates) of the drop­

49 

down button portion of a ToolStripSplitButton.  DropDownButtonPressed 

Indicates whether the drop­down portion of the  ToolStripSplitButton is in the pressed state. 

DropDownButtonSelected 

Indicates whether the drop­down button portion of a  ToolStripSplitButton is selected. 

DropDownButtonWidth 

Controls the width (in pixels) of the drop­down button portion of a  ToolStripSplitButton. 

RightToLeft 

Indicates whether items are to be placed from right to left and text  is to be written from right to left.  RightToLeft set to False: 

RightToLeft set to True: 

SplitterBounds 

Gets the boundaries of the separator between the standard and  drop­down button portions of a ToolStripSplitButton. 

DefaultItem  ToolStripSplitButton.DefaultItem is an easy mechanism to synchronize the click event from the  ToolStripSplitButton’s item chosen from the dropdown with the one rendered in the button area.  The following sample assumes you have a click handler associated with each item in the  dropdown and have set a default item as part of initialization.  ToolStripSplitButton veggieButton = new ToolStripSplitButton("Veggies");  veggieButton.DropDownItems.Add("Asparagus");  veggieButton.DropDownItems.Add("Bok Choy");  veggieButton.DropDownItems.Add("Cauliflower");  veggieButton.DisplayStyle = ToolStripItemDisplayStyle.Text;  veggieButton.DropDownItemClicked += new  ToolStripItemClickedEventHandler(veggieButton_DropDownItemClicked);  veggieButton.DefaultItemChanged += new  EventHandler(veggieButton_DefaultItemChanged);  // menustrip

50 

ToolStrip ts = new ToolStrip();  ts.Items.Add(veggieButton);  this.Controls.Add(ts);  }  void veggieButton_DropDownItemClicked(object sender,  ToolStripItemClickedEventArgs e)  {  ((ToolStripSplitButton)sender).DefaultItem = e.ClickedItem;  ((ToolStripSplitButton)sender).Text = e.ClickedItem.Text;  } 

ToolStripDropDownButton class  This class inherits from ToolStripDropDownItem.  It represents a control that when clicked  displays an associated ToolStripDropDown from which the user can select a single item. 

The following table lists some of the important properties. 

Property Names 

Description 

AutoToolTip 

Indicates whether default or custom ToolTip text is displayed on  the ToolStripDropDownButton.  By default, the value is set to  True, and a ToolStripDropDownButton uses its Text property for  the ToolTip text.  To display custom text via the ToolTipText  property, you need to set the AutoToolTip property to False.

51 

AutoToolTip is set to true by default for these classes only  •  ToolStripButton  •  ToolStripDropDownButton  •  ToolStripSplitButton  ShowDropDownArrow 

Indicates whether an arrow is displayed on the  ToolStripDropDownButton, which indicates that further options  are available in a drop­down list. 

ToolStripOverflowButton class  This class inherits from ToolStripDropDownButton.  It hosts a ToolStripDropDown that displays  items that overflow the ToolStrip. 

ToolStripManager class  This class inherits from System.Object.  It is a static class that handles application wide ToolStrip  related tasks such as merging, settings and renderer exposure.  The following table lists some of the important members:  Property Names 

Description 

Renderer 

Controls the default painting styles for the form. 

RenderMode 

Control the default theme for the form. 

VisualStylesEnabled 

Indicates whether a ToolStrip is rendered using XP visual style. 

Method Names 

Description 

FindToolStrip 

Finds the specified ToolStrip or a type derived from ToolStrip. 

IsShortcutDefined 

Indicates whether the specified shortcut key is used by any of the  ToolStrip controls of a form. 

IsValidShortcut 

Indicates whether a defined shortcut key is valid.

52 

LoadSettings 

Loads settings (ToolStrip and ToolStripItem locations) for a Form. 

Merge 

Combines ToolStrip controls. 

RevertMerge 

Undoes a merging of two ToolStrip objects. 

SaveSettings 

Saves settings (ToolStrip and ToolStripItem locations) for the  specified Form. 

Event Names 

Description 

RendererChanged 

Occurs when the value of the Renderer property changes. 

Note: The Renderer and RenderMode properties will be further discussed in the Rendering  section of the training later.  How do I use the ToolStripManager to persist and restore the entire ToolStrip tree?  The ToolStripManager provides the LoadSettings and SaveSettings methods.  They will be  further discussed in the Settings section of this training.  How do I apply a custom ToolStrip Renderer to an Application using ToolStripManager?  You can customize the appearance of your ToolStrip controls individually or for all the ToolStrip  controls in your application.  To customize the appearance for all the ToolStrip controls at the  application level, you need to set the ToolStripManager’s Renderer property to an instance of a  custom renderer class.  Step 1: Create a custom Renderer class:  [VB]  ' This sample type demonstrates a custom renderer. It overrides the  ' OnRenderMenuItemBackground and OnRenderButtonBackground methods  ' to customize the backgrounds of MenuStrip items and ToolStripbuttons.  Class CustomProfessionalRenderer  Inherits ToolStripProfessionalRenderer  Protected Overrides Sub OnRenderMenuItemBackground(ByVal e As  ToolStripItemRenderEventArgs)  ' Add your implementation here  End Sub  Protected Overrides Sub OnRenderButtonBackground(ByVal e As  ToolStripItemRenderEventArgs)  ' Add your implementation here  End Sub  End Class 

[C#]  // This sample type demonstrates a custom renderer. It overrides the  // OnRenderMenuItemBackground and OnRenderButtonBackground methods  // to customize the backgrounds of MenuStrip items and ToolStripbuttons.  class CustomProfessionalRenderer : ToolStripProfessionalRenderer  {  protected override void  OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)  {  // Add your implementation here  }

53 

protected override void  OnRenderButtonBackground(ToolStripItemRenderEventArgs e)  {  // Add your implementation here  }  } 

Step 2: Apply the custom renderer to all ToolStrip components in the entire application.  ' Assign the custom renderer at the application level.  This will  ' affect all ToolStrip components at the application level.  menuStrip1.RenderMode = ToolStripRenderMode.ManagerRenderMode  toolStrip1.RenderMode = ToolStripRenderMode.ManagerRenderMode  ToolStripManager.Renderer = New CustomProfessionalRenderer() 

Note: if you do not want to apply the custom renderer to all ToolStrip components at the  application level, then you do not need to do this through the ToolStripManager.  Instead, you can  apply the custom render to individual ToolStrip objects.  For example:  ' Assign the custom renderer to the MenuStrip control only.  menuStrip1.Renderer = New CustomProfessionalRenderer() 

Or  ' Assign the custom renderer to the ToolStrip control only.  toolStrip1.Renderer = New CustomProfessionalRenderer() 

Layout  By default, the ToolStrip control utilizes a StackWithOverflow layout that supports overflow and  item alignment. Stack refers to how the aside each other at both ends of items are laid out within  the ToolStrip where each item is stacked the ToolStrip.  The ToolStrip class can use one of the following ToolStripLayoutStyle values to specify the  possible alignments with which the items of a ToolStrip can be displayed. · Stack layouts  o  StackWithOverflow  o  HorizontalStackWithOverflow  o  VertocalStackWithOverflow · Non stack layouts  o  Flow  o  Table  The sizing grip will not be displayed unless you also set the LayoutStyle property to one of the  overflow values. If the LayoutStyle property is set to Flow or Table, the sizing grip will not be  displayed, and you lose the overflow feature as well.  Stack layouts  1.  StackWithOverflow: Default for ToolStrip.  This layout style automatically alters its layout  based on the orientation property of the ToolStrip to handle drag to dock scenarios.  2.  VerticalStackWithOverflow: Just like StackWithOverflow except always renders as vertical.

54 

3.  HorizontalStackWithOverflow: Just like StackWithOverflow except always renders  horizontal.  Features notes with Stack Layouts  1.  ToolStripItem.Alignment controls which side of the ToolStrip the item is aligned to.  2.  ToolStripItem.Overflow controls whether an item can overflow to the ToolStripOverflow  dropdown Always, AsNeeded, or Never.  3.  When items do not fit within the ToolStrip, an Overflow button is rendered.  Additional items  appear in the ToolStripOverflow dropdown.  4.  On the LayoutCompleted event, the ToolStripItem.Placement property can be inspected to  see if an item was placed on the Main toolstrip, the Overflow toolstrip, or if it is not currently  showing (usually because the item did not fit on Main and it was set to Overflow.Never).  5.  A ToolStrip can be “movable” if it is placed in a ToolStripPanel and its GripStyle is set to  Visible.  Non­Stack layouts  1.  Flow: Default for ContextMenuStrip, ToolStripDropDownMenu, and ToolStripOverflow, and is  very similar to the FlowLayoutPanel.  For example, the following code snippet creates the  ToolStrip below:  toolStrip1.LayoutStyle = ToolStripLayoutStyle.Flow;  FlowLayoutSettings settings = toolStrip1.LayoutSettings as  FlowLayoutSettings;  settings.FlowDirection = FlowDirection.RightToLeft; 

Features notes with FlowLayouts · All of the properties/methods of the FlowLayoutPanel ­ FlowBreak, WrapContents,  FlowDirection, etc ­ are exposed off the ToolStrip. LayoutSettings object (LayoutSettings  must be casted into a FlowLayoutSettings class). · The ToolStripItem.Dock and ToolStripItem.Anchor properties can be used in code to align the  items within the row. · The ToolStripItem.Alignment property is ignored. · On the LayoutCompleted event, the ToolStripItem.Placement property can be inspected to  see if an item was placed on the Main toolstrip or didn’t fit (None). · The ToolStrip grip is not rendered, thus a ToolStrip with LayoutStyle = Flow in a  ToolStripPanel cannot be moved. · The ToolStrip overflow button is not rendered, ToolStripItem.Overflow is ignored.  2.  Table: Default for StatusStrip, and is very similar to TableLayoutPanel.  For example, the  following code snippet creates the ToolStrip below:  toolStrip1.LayoutStyle = ToolStripLayoutStyle.Table;  TableLayoutSettings settings = toolStrip1.LayoutSettings as  TableLayoutSettings;  settings.ColumnCount = 3;  settings.RowCount = 5;

55 

Features notes with TableLayout · All of the properties/methods of the TableLayoutPanel – RowCount, ColumnCount, RowSpan,  ColumnSpan, RowStyles, ColumnStyles ­ are exposed off the ToolStrip. LayoutSettings  object (LayoutSettings must be casted into a TableLayoutSettings class). · The ToolStripItem.Dock and ToolStripItem.Anchor properties can be used in code to align the  items within the cell. · The ToolStripItem.Alignment property is ignored. · On the LayoutCompleted event, the ToolStripItem.Placement property can be inspected to  see if an item was placed on the Main toolstrip or didn’t fit (None). · The ToolStrip grip is not rendered, thus a ToolStrip with LayoutStyle = Table in a  ToolStripPanel cannot be moved. · The ToolStrip overflow button is not rendered, ToolStripItem.Overflow is ignored.  Note: For StatusStrip, all “Spring” columns are set to 100%, all other columns are set to AutoSize  in an overridable method called OnSpringTableLayoutCore.  The following table describes the layout styles supported by each ToolStrip class including the  default value.  ToolStrip classes 

Supported Layout 

Default Layout 

ToolStrip 

Flow,  HorizontalStackWithOverflow,  StackWithOverflow,  Table,  VerticalStackWithOverflow 

HorizontalStackWithOverflow 

MenuStrip 

Flow,  HorizontalStackWithOverflow,  StackWithOverflow,  Table,  VerticalStackWithOverflow 

HorizontalStackWithOverflow 

StatusStrip 

Flow,  HorizontalStackWithOverflow,  StackWithOverflow,  Table,  VerticalStackWithOverflow 

Table 

ContextMenuStrip 

Flow,  HorizontalStackWithOverflow, 

Flow

56 

StackWithOverflow,  Table,  VerticalStackWithOverflow 

The ToolStrip class also provides three events related to layout:  Event names 

Description 

Layout 

Occurs when the ToolStrip is about to layout its  contents. 

LayoutStyleChanged 

Fires when the value of the LayoutStyle property  changes.  You can handle this event to adjust the  display of the ToolStrip controls accordingly.  For example, you can use the following code snippet  to change the text direction on a MenuStrip depending  on its Orientation in its LayoutStyleChanged event  handler:  if (menuStrip1.Orientation ==  Orientation.Vertical)  {  menuStrip1.TextDirection =  ToolStripTextDirection.Vertical270;  }  else  {  menuStrip1.TextDirection =  ToolStripTextDirection.Horizontal;  } 

LayoutCompleted 

Occurs after layout and placement of items on the  ToolStrip completes. 

Dock  ToolStrips have three main usage patterns:  1.  Joined in ToolStripPanel;  2.  Docked within a parent container;  3.  Absolutely positioned;  ToolStrips follow the same rules as other Windows Forms controls with regards to docking,  except when they are joined into a ToolStripPanel. See ToolStripPanelError! Reference source  not found. for additional information.  Overflow

57 

To be precise, overflow is a feature of the ToolStrip’s default LayoutStyle (StackWithOverflow),  not of the ToolStrip control itself. You determine what overflow action is preferred via the  Overflow property (Always, Never, AsNeeded). To determine dynamically where each item was  laid out, sync the LayoutCompleted event check item Placement (Main, Overflow, None).  Property changes here will cause another layout; be wary of recursive code here. An item will not  be partially laid out if it would result in a truncation – it will not be laid out and Placement will be  none. 

How do I change layout characteristics not directly exposed in ToolStrip?  You can access the LayoutSettings object offered at the ToolStrip level and cast to the  appropriate type and access the properties there. The following is an example of changing the  flow direction of a ToolStrip.  toolStrip1.LayoutStyle = ToolStripLayoutStyle.Flow;  ((FlowLayoutSettings)toolStrip1.LayoutSettings).FlowDirection =  FlowDirection.BottomUp; 

How can I do dynamic text rotation as my ToolStrip changes orientation?  You can sync the LayoutStyleChanged event on the ToolStrip. This sample rotates the text to  Vertical90 on vertical layouts. For best results, start with a ToolStrip with standard items and  make sure all ToolStripButton display styles are set to ImageAndText.  private void toolStrip1_LayoutStyleChanged(object sender, EventArgs e)  {  if (toolStrip1.LayoutStyle ==  ToolStripLayoutStyle.VerticalStackWithOverflow)  {  toolStrip1.TextDirection = ToolStripTextDirection.Vertical90;  foreach (ToolStripItem tsi in toolStrip1.Items)  {  if (tsi is ToolStripButton)  {  tsi.TextImageRelation = TextImageRelation.ImageAboveText;  }  }  }  else  {  toolStrip1.TextDirection = ToolStripTextDirection.Horizontal;  foreach (ToolStripItem tsi in toolStrip1.Items)  {  if (tsi is ToolStripButton)  {  tsi.TextImageRelation = TextImageRelation.ImageBeforeText;  }  }  }  } 

How do I implement a dynamic overflow?

58 

The following sample demonstrates basic overflow. Run the form and resize to the see the output  after layout.  ToolStrip t = new ToolStrip();  t.LayoutCompleted += new EventHandler(t_LayoutCompleted);  ToolStripButton tsb1 = new ToolStripButton("1 ­ Left ­ Never   ");  tsb1.Overflow = ToolStripItemOverflow.Never;  ToolStripButton tsb2 = new ToolStripButton("2 ­ Right­ AsNeeded");  tsb2.Alignment = ToolStripItemAlignment.Right;  ToolStripButton tsb3 = new ToolStripButton("3 ­ Left ­ AsNeeded");  ToolStripButton tsb4 = new ToolStripButton("4 ­ Right­ AsNeeded");  tsb4.Alignment = ToolStripItemAlignment.Right;  ToolStripButton tsb5 = new ToolStripButton("5 ­ Left ­ Always  ");  tsb5.Overflow = ToolStripItemOverflow.Always;  t.Items.AddRange(new ToolStripItem[] {tsb1, tsb2, tsb3, tsb4, tsb5});  this.Controls.Add(t); 

void t_LayoutCompleted(object sender, EventArgs e)  {  foreach (ToolStripItem item in ((ToolStrip)(sender)).Items)  {  System.Diagnostics.Debug.WriteLine(item.ToString() + " Placement: " +  item.Placement.ToString());  } 

}  How do I implement a custom DropDown where overflow items are handled manually?  The default overflow dropdown is available programmatically.  But to customize the layout of the  overflow, you can also simply assign your custom ToolStripDropDownMenu to the dropdown  property. Below is an example of a custom dropdown – and handling overflow items manually.  using System;  using System.Collections.Generic;  using System.ComponentModel;  using System.Data;  using System.Drawing;  using System.Text;  using System.Windows.Forms;  namespace WindowsApplication65  {  public partial class Form1 : Form  {  ContextMenuStrip cms = new ContextMenuStrip();  ToolStrip toolstrip = new ToolStrip();  ToolStripButton placeholder = new ToolStripButton();  ToolStripItem[] originalItemCollection;  public Form1()

59 

{  InitializeComponent();  toolstrip.Layout += new LayoutEventHandler(toolstrip_Layout);  toolstrip.LayoutCompleted += new EventHandler(toolstrip_LayoutCompleted);  // the is a way to fake the overflow has stuff in it, therefore the  button will  // get rendered.  //  placeholder.Overflow = ToolStripItemOverflow.Always;  toolstrip.Items.Add(placeholder);  toolstrip.SuspendLayout();  // add some items.  toolstrip.Items.Add("1");  toolstrip.Items.Add("2");  toolstrip.Items.Add("3");  toolstrip.Items.Add("4");  toolstrip.Items.Add("5");  toolstrip.Items.Add("6");  toolstrip.Items.Add("7");  toolstrip.Items.Add("8");  // we need to snap the items collection before performing a layout  // as the LayoutCompleted will remove items from the items collection.  originalItemCollection = new ToolStripItem[toolstrip.Items.Count];  toolstrip.Items.CopyTo(originalItemCollection, 0);  toolstrip.ResumeLayout(); 

this.Controls.Add(toolstrip);  toolstrip.OverflowButton.DropDown = cms;  }  void toolstrip_Layout(object sender, LayoutEventArgs e)  {  // push all items back into main toolstrip collection  if (originalItemCollection != null)  {  toolstrip.Items.AddRange(originalItemCollection);  }  }  void toolstrip_LayoutCompleted(object sender, EventArgs e)  {  ToolStripItemCollection items = toolstrip.Items;  toolstrip.SuspendLayout();  cms.SuspendLayout();  // turn overflow button off  placeholder.Available = false;  for (int i = items.Count ­ 1; i > ­1; i­­)  {  ToolStripItem item = items[i];  System.Diagnostics.Debug.WriteLine(item.ToString() + " Placement: " +  item.Placement.ToString());  if (item.Placement == ToolStripItemPlacement.Overflow)  {  if (item != placeholder)  {  cms.Items.Insert(0, item);

60 

// turn overflow button on  placeholder.Available = true;  }  }  }  cms.ResumeLayout(false);  toolstrip.ResumeLayout(true);  }  }  } 

ToolStripContainer class  This class provides panels on each side of the form and a central panel that can hold one or more  controls.  It consists of an expandable and collapsible ToolStripPanel on each side of the control,  and a central ToolStripContentPanel. Use a ToolStripPanel to hold one or more ToolStrip,  MenuStrip, or StatusStrip controls. Use the central ToolStripContentPanel to hold other controls.  When you drag a non­ToolStrip Windows Forms control and drop on the ToolStripContainer, it  will be automatically placed on the ToolStripContentPanel.  Sides – ToolStripPanels  The ToolStripPanels on the sides are not removable from the container, but can be hidden via  their respective visible property(Top ­> TopToolStripPanelVisble, etc). Visible false means they  would not participate in the drag to dock scnearions.  // to hide left and right panels  toolStripContainer1.LeftToolStripPanelVisible = false;  toolStripContainer1.RightToolStripPanelVisible = false; 

Center – ContentPanel  The Content panel provides a way to get Renderer support into the body of your form to create a  consistent look. It cannot be hidden. It does supports transparency and backcolor, but it may be  prudent in many scenarios that require this to dock ToolStripPanels to the side instead.  Design Time  ToolStripContainer offers several design time features not found on other controls. Below is a  description of a few of these.  Expandable handles  On each ToolStripPanel we offer a handle to temporarily expand the ToolStripPanel to ease  rearrangement of ToolStrips and enlarge the drop area. These are not rendered at runtime.  Reparent Controls  A designer verb, also shown on the Designer Action panel, is Reparent controls. This takes all  controls on the form and re­parents them to the ToolStripContainer. All ToolStrips are mapped

61 

into the ToolStripPanels and all other controls parented to the form are re­parented to the  ContentPanel.  Below is a mini walk­through on how to add a ToolStripContainer to a form and ToolStrips to the  top panel.  Step 1.  Drag ToolStripContainer  from the ToolBox and drop  it on the form. Notice the  auto­popped smart tag for  you to control the visibility  of the top, bottom, left and  right panels, and the Dock  property of the  ToolStripContainer. 

Step 2.  Dock Fill  ToolStripContainer by  selecting “Dock Fill in  Form” since the default  Dock value is none.  The top panel is expanded  automatically by default.  Note glyph arrow direction  reverses.

62 

Step 3.  Add ToolStrip to the top  panel.  Note glyph arrow  direction reverses back. 

Step 4.  Expand the top panel.  Note glyph arrow direction  reverses again.

63 

Step 5.  Add another ToolStripto  the top panel, and notice  that glyph arrow direction  reverses back. 

The following table lists some of the important properties of the ToolStripContainer class.  Property names 

Description 

BottomToolStripPanel 

Gets the bottom panel of the ToolStripContainer. 

BottomToolStripPanelVisible 

Indicates whether the bottom panel of the  ToolStripContainer is visible. 

ContentPanel 

Gets the center panel of the ToolStripContainer. 

LeftToolStripPanel 

Gets the left panel of the ToolStripContainer. 

LeftToolStripPanelVisible 

Indicates whether the left panel of the  ToolStripContainer is visible. 

RightToolStripPanel 

Gets the right panel of the ToolStripContainer. 

RightToolStripPanelVisible 

Indicates whether the right panel of the  ToolStripContainer is visible. 

TopToolStripPanel 

Gets the top panel of the ToolStripContainer. 

TopToolStripPanelVisible 

Indicates whether the top panel of the  ToolStripContainer is visible. 

There are several classes related to the ToolStripContainer class.  The following section  describes each of them.

64 

ToolStripPanel class  This class represents the four side panels of a ToolStripContainer.  It provides space for other  controls to share horizontal or vertical spaces.  Property names 

Description 

Renderer 

A ToolStripRenderer used to customize the  appearance of a ToolStripPanel. 

RenderMode 

The painting styles to be applied to the ToolStripPanel. 

RowMargin 

Controls the spacing (in pixels) between the  ToolStripPanelRows and the ToolStripPanel. 

Rows 

Gets the ToolStripPanelRows in this ToolStripPanel. 

Feature highlights of the four ToolStrip panels · The TopToolStripPanel, BottomToolStripPanel, LeftToolStripPanel  and  RightToolStripPanel  are exposed as top level properties of the ToolStripContainer; · Default RenderMode is ManagerRenderMode; · TopPanelVisible, BottomPanelVisible, LeftPanelVisible and RightPanelVisible properties  to control the visibility of the top, button left, right ToolStrip panels respectively. · Z­order cannot be configured by user. 

ToolStripPanelRow class  This class represents a row of a ToolStripPanel that can contain controls.  Property names 

Description 

Control 

Gets the controls in the ToolStripPanelRow. 

DisplayRectangle 

The display area of the control. 

LayoutEngine 

Gets an instance of the control's layout engine. 

Orientation 

The layout direction of the ToolStripPanelRow relative  to its containing ToolStripPanel. 

ToolStripPanel 

Gets the ToolStripPanel that contains the  ToolStripPanelRow. 

ToolStripContentPanel class  This class represents the center panel of a ToolStripContainer control.  Property names 

Description 

Renderer 

A ToolStripRenderer used to customize the  appearance of a ToolStripContentPanel.

65 

RenderMode 

The painting styles to be applied to the  ToolStripContentPanel. 

Feature highlights of the Content Panel · Not removable. · Z­order cannot be configured by user. · No context menu additions. · Default RenderMode is set to System.  This means that ContentPanel.BackColor is used  to render the backcolor.  How do I programmatically move ToolStrips within or across ToolStripPanels?  Within a ToolStrip:  Simply set the ToolStrip Location property.  Across ToolStrips:  Either add the ToolStrip to the ToolStripPanel’s Controls collection or use Join(ToolStrip).  NOTE: Join() simulates the drop operation of a ToolStrip and is order dependent. 

Settings  The ToolStripManager class provides the LoadSettings and SaveSettings methods to allow the  user to save or restore the entire ToolStrip tree.  This allows you to enable drag to dock scenarios  in the ToolStripPanel and AllowItemReorder without having to manage restoring or saving that  state.  The following code snippet demonstrates using the LoadSettings and SaveSettings methods to  persist and reset settings.  [C#]  private void Form1_Load(object sender, EventArgs e)  {  //Save the current setting of the form using the "Reset" settings //key  when you first load the form  ToolStripManager.SaveSettings(this, "Reset");  //Load the form's settings  ToolStripManager.LoadSettings(this);  }  private void Form1_FormClosing(object sender, FormClosingEventArgs e)  {  //Save the form's new settings when you close the form.  ToolStripManager.SaveSettings(this);  } 

private void buttonResetSettings_Click(object sender, EventArgs e)  {  //Load the form's original setting that was  //saved using the "Reset" settings key

66 

ToolStripManager.LoadSettings(this, "Reset");  } 

[VB]  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles MyBase.Load  'Save the current setting of the form using the "Reset"  'settings key when you first load the form  ToolStripManager.SaveSettings(Me, "Reset")  'Load the form's settings  ToolStripManager.LoadSettings(Me)  End Sub  Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As  System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing  'Save the form's new settings when you close the form.  ToolStripManager.SaveSettings(Me)  End Sub  Private Sub buttonResetSettings_Click(ByVal sender As System.Object, ByVal  e As System.EventArgs) Handles buttonResetSettings.Click  'Load the form's original setting that was  'saved using the "Reset" settings key  ToolStripManager.LoadSettings(Me, "Reset")  End Sub 

Running the above code snippet, you will get the following results:  1.  Form is loaded with its original settings: 

2.  Drag the ToolStrip to dock to the left side of the form.  Close the form and open it again,  the new settings are persisted:

67 

3.  Click on the Reset Settings button to revert the settings so the original setting is used: 

Using MenuStrip in MDI applications  The MDI related features around MenuStrip are described below. Using a MenuStrip in MDI  requires Form.MainMenuStrip to be set in order to identify the controlling MenuStrip. It will be  used for child window control menu merging when children are maximized. Automatic merging  between child and parent forms is triggered by child activation.  ToolStripContainer is not designed to be used on a MDI parent form.  When you add a  ToolStripContainer to the MDI parent form, it will cover the entire MDI client area and the MDI  child form will not be displayed.  You can add ToolStrip, MenuStrip and StatusStrip to MDI parent window, but they will not be  movable. That means you cannot drag them to dock to a different side of the client area of the  MDI parent form.  In order to implement movable menus on a MDI parent window, you will need  to add individual ToolStripPanel and implement the move yourself.

68 

How do I use ToolStripPanel in MDI applications?  [VB]  ' This code example demonstrates how to use ToolStripPanel  ' controls with a multiple document interface (MDI).  Public Class Form1  Inherits Form  Public Sub New()  ' Make the Form an MDI parent.  Me.IsMdiContainer = True  ' Create ToolStripPanel controls.  Dim tspTop As New ToolStripPanel()  Dim tspBottom As New ToolStripPanel()  Dim tspLeft As New ToolStripPanel()  Dim tspRight As New ToolStripPanel()  ' Dock the ToolStripPanel controls to the edges of the form.  tspTop.Dock = DockStyle.Top  tspBottom.Dock = DockStyle.Bottom  tspLeft.Dock = DockStyle.Left  tspRight.Dock = DockStyle.Right  ' Create ToolStrip controls to move among the  ' ToolStripPanel controls.  ' Create the "Top" ToolStrip control and add  ' to the corresponding ToolStripPanel.  Dim tsTop As New ToolStrip()  tsTop.Items.Add("Top")  tspTop.Join(tsTop)  ' Create the "Bottom" ToolStrip control and add  ' to the corresponding ToolStripPanel.  Dim tsBottom As New ToolStrip()  tsBottom.Items.Add("Bottom")  tspBottom.Join(tsBottom)  ' Create the "Right" ToolStrip control and add  ' to the corresponding ToolStripPanel.  Dim tsRight As New ToolStrip()  tsRight.Items.Add("Right")  tspRight.Join(tsRight)  ' Create the "Left" ToolStrip control and add  ' to the corresponding ToolStripPanel.  Dim tsLeft As New ToolStrip()  tsLeft.Items.Add("Left")  tspLeft.Join(tsLeft)  ' Create a MenuStrip control with a new window.  Dim ms As New MenuStrip()  Dim windowMenu As New ToolStripMenuItem("Window")  Dim windowNewMenu As New ToolStripMenuItem("New", Nothing, New  EventHandler(AddressOf windowNewMenu_Click))  windowMenu.DropDownItems.Add(windowNewMenu)  CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowImageMargin =  False  CType(windowMenu.DropDown, ToolStripDropDownMenu).ShowCheckMargin =  True  ' Assign the ToolStripMenuItem that displays  ' the list of child forms.  ms.MdiWindowListItem = windowMenu

69 

' Add the window ToolStripMenuItem to the MenuStrip.  ms.Items.Add(windowMenu)  ' Dock the MenuStrip to the top of the form.  ms.Dock = DockStyle.Top  ' The Form.MainMenuStrip property determines the merge target.  Me.MainMenuStrip = ms  ' Add the ToolStripPanels to the form in reverse order.  Me.Controls.Add(tspRight)  Me.Controls.Add(tspLeft)  Me.Controls.Add(tspBottom)  Me.Controls.Add(tspTop)  ' Add the MenuStrip last.  ' This is important for correct placement in the z­order.  Me.Controls.Add(ms)  End Sub  ' This event handler is invoked when  ' the "New" ToolStripMenuItem is clicked.  ' It creates a new Form and sets its MdiParent  ' property to the main form.  Sub windowNewMenu_Click(ByVal sender As Object, ByVal e As EventArgs)  Dim f As New Form()  f.MdiParent = Me  f.Text = "Form ­ " + Me.MdiChildren.Length.ToString()  f.Show()  End Sub  End Class 

[C#]  // This code example demonstrates how to use ToolStripPanel  // controls with a multiple document interface (MDI).  partial class Form1 : Form  {  public Form1()  {  //Make the Form an MDI parent.  this.IsMdiContainer = true;  //Create ToolStripPanel controls.  ToolStripPanel tspTop = new ToolStripPanel();  ToolStripPanel tspBottom = new ToolStripPanel();  ToolStripPanel tspLeft = new ToolStripPanel();  ToolStripPanel tspRight = new ToolStripPanel();  //Dock the ToolStripPanel controls to the edges of the  //form.  tspTop.Dock = DockStyle.Top;  tspBottom.Dock = DockStyle.Bottom;  tspLeft.Dock = DockStyle.Left;  tspRight.Dock = DockStyle.Right;  //Create ToolStrip controls to move among the  //ToolStripPanel controls.  //Create the "Top" ToolStrip control and add  //to the corresponding ToolStripPanel.  ToolStrip tsTop = new ToolStrip();  tsTop.Items.Add("Top");

70 

tspTop.Join(tsTop);  //Create the "Bottom" ToolStrip control and add  //to the corresponding ToolStripPanel.  ToolStrip tsBottom = new ToolStrip();  tsBottom.Items.Add("Bottom");  tspBottom.Join(tsBottom);  //Create the "Right" ToolStrip control and add  corresponding ToolStripPanel.  ToolStrip tsRight = new ToolStrip();  tsRight.Items.Add("Right");  tspRight.Join(tsRight); 

//to the 

//Create the "Left" ToolStrip control and add  //to the corresponding ToolStripPanel.  ToolStrip tsLeft = new ToolStrip();  tsLeft.Items.Add("Left");  tspLeft.Join(tsLeft);  //Create a MenuStrip control with a new window.  MenuStrip ms = new MenuStrip();  ToolStripMenuItem windowMenu = new ToolStripMenuItem("Window");  ToolStripMenuItem windowNewMenu = new  ToolStripMenuItem("New",  null,  new EventHandler(windowNewMenu_Click));  windowMenu.DropDownItems.Add(windowNewMenu);  ((ToolStripDropDownMenu)(windowMenu.DropDown)).ShowImageMargin = false;  ((ToolStripDropDownMenu)(windowMenu.DropDown)).ShowCheckMargin = true;  //Assign the ToolStripMenuItem that displays  //the list of child forms.  ms.MdiWindowListItem = windowMenu;  //Add the window ToolStripMenuItem to the MenuStrip.  ms.Items.Add(windowMenu);  //Dock the MenuStrip to the top of the form.  ms.Dock = DockStyle.Top;  //The Form.MainMenuStrip property determines the merge //target.  this.MainMenuStrip = ms;  //Add the ToolStripPanels to the form in reverse order.  this.Controls.Add(tspRight);  this.Controls.Add(tspLeft);  this.Controls.Add(tspBottom);  this.Controls.Add(tspTop);  //Add the MenuStrip last.  //This is important for correct placement in the z­order.  this.Controls.Add(ms);  }  //This event handler is invoked when  //the "New" ToolStripMenuItem is clicked.  //It creates a new Form and sets its MdiParent  //property to the main form.  void windowNewMenu_Click(object sender, EventArgs e)  {  Form f = new Form();  f.MdiParent = this;  f.Text = "Form ­ " + this.MdiChildren.Length.ToString();  f.Show();

71 

}  } 

Menu Merging in MDI applications  This section describes how menu merging works in MDI applications.  Automatic merging  Merging in the automatic case is triggered by MDI child activation and deactivation. Upon  activation, the MenuStrip in the child form is merged into the MDIParent’s MainMenuStrip. Later  with subsequent deactivation/activation pairs as a new form becomes active the last form is  unmerged (RevertMerge), then the new form is merged. This behavior can be tweaked via  mergeAction property on each ToolStripItem and through the AllowMerge property on MenuStrip.  Only MenuStrips participate in automatic merging. To merge ToolStrips, StatusStrip etc, you must  merge them manually. 

What is the procedure for automatically merging an MDI child menu into a MDI parent?  The following procedure discusses how to use automatic merging in an MDI application with  MenuStrip.  To implement menu merging in MDI applications, there are two things you need to remember to  do:  1.  Set the MDI parent’s MainMenuStrip property to the MenuStrip on it;  2.  Set the Visible property of the MenuStrip on the MDI child form to False;  Here is a walk­through on implementing menu merging in MDI applications.  Step 1: Create a Windows Forms application.  Form1 is created by default.  Make it a MDI parent  form by changing its IsMDIContainer property to True.  Step 2: Add a MenuStrip (menuStrip1) to Form1.  Set Form1’s MainMenuStrip property to  menuStrip1.  Step 3: Add ToolStripMenuItems to menuStrip1 to look like the following, and leave the menu  items’ MergeAction property as Append by default.

72 

Step 4: Add a new Form called Form2 to the project, and add a MenuStrip called menuStrip2 to  Form2.  Set Form2’s MainMenuStrip property to menuStrip2.  Step 5: Add a File menu item to menuStrip2 to make it look like the following, and leave the  menu items’ MergeAction property as Append by default. 

Step 6: Set menuStrip2’s Visible property to False.  This is important or otherwise the  menuStrip2 will still display on the MDI child form at run time.  Step 7: In the MDI parent form (Form1)’s Load event handler, add the following code:  Form2 mdiChild = new Form2();  mdiChild.MdiParent = this;  mdiChild.Show();

73 

Step 8: Run the application.  You will see the MDI child’s File menu item is appended to the end  of menuStrip1 on the MDI parent form.  This is because the MergeAction property of the menu  items uses the default Append setting. 

To control how the matching menu items are merged, you need to use the MergeAction and  MergeIndex properties.  You can choose one of the following merge actions: 

Member names 

Description 

Append 

Appends the item to the end of the collection, ignoring  match results. 

Insert 

Inserts the item to the target's collection immediately  preceding the matched item. A match of the end of the  list results in the item being appended to the list. If  there is no match or the match is at the beginning of  the list, the item is inserted at the beginning of the  collection. 

MatchOnly 

A match is required, but no action is taken. Use this for  tree creation and successful access to nested layouts. 

Remove 

Removes the matched item. 

Replace 

Replaces the matched item with the source item. The  original item's drop­down items do not become  children of the incoming item. 

Using the steps in the procedure described above, you get different results when you use  different combinations of MergeAction and MergeIndex settings:

74 

Example 1: On the MDI child form,  File menu item: MergeAction = MatchOnly;  Save As menu item: MergeAction = Insert, MergeIndex = 4; 

Example 2: On the MDI child form,  File menu item: MergeAction = Insert, MergeIndex = 1; 

Example 3: On the MDI child form,  File menu item: MergeAction = MatchOnly;  Save As menu item: MergeAction = MatchOnly;

75 

Example 4: On the MDI child form,  File menu item: MergeAction = Replace; 

MDI Window List  The Window list in MDI application displays a list of MDI child forms that are open in the  application. In the screen shot below, the Window list shows two open MDI child forms on the  Windows menu item:

76 

You can use the MenuStrip’s MdiWindowListItem property to control the ToolStripMenuItem that  is used to display a list of MDI child forms.  There are five values you can choose from when you set the MdiWindowListItem property: · editToolStripMenuItem: Use the Edit menu item to display the list of open MDI child  windows.

·

fileToolStripMenuItem: Use the File menu item to display the list of open MDI child  windows.

77 

·

helpToolStripMenuItem: Use the Help menu item to display the list of open MDI child  windows.

·

toolsToolStripMenuItem: Use the Tools  menu item to display the list of open MDI child  windows.

78

·

windowsToolStripMenuItem: Use the Windows menu item to display the list of open MDI  child windows. 

ToolStripMenuItem.IsMdiWindowListEntry property  This property can be used to do post item customization of the MDI window list. This is how you  would identify which items are sourced from an MDI child.

79

ToolStrip Rendering or Painting  There are several ways to achieve custom painting with the ToolStrip API.  As with other  System.Windows.Forms.Controls, the ToolStrip and ToolStripItem both have overridable OnPaint  methods and Paint events.  As with regular painting, the coordinate system is relative to the client  area of the control – i.e. the upper left hand corner is 0,0.  The Paint event/OnPaint methods for  ToolStripItems behave just as regular control paint events.  In addition to the Paint event/OnPaint method, the ToolStrip classes implement a rendering  scheme that is significantly different from other Windows Forms controls to give finer access to  the rendering of the items and container.  This is controlled through the ToolStripRenderer class,  which has overridable methods for painting the background, item background, item image, item  arrow, item text and border of the ToolStrip.  The EventArgs for these methods expose quite a  few properties (e.g. rectangles, colors, text formats) which can be adjusted as necessary.  Rather than custom painting a ToolStrip and the ToolStripItem objects it contains by handling the  Paint event for each item, you can easily apply a particular style or theme to a ToolStrip object  using the ToolStripRenderer class using one of the following methods: · ·

Set ToolStrip.RenderMode property to one of the ToolStripRenderMode values other than  Custom; Set ToolStrip.Renderer property to any class that inherits from the ToolStripRenderer class.  This will automatically set the RenderMode. 

You can apply the same style to multiple ToolStrip objects in the same application, or to individual  ToolStrip objects.  The following section discusses the ToolStripRenderer class. 

ToolStripRenderer class  This class handles the painting functionality for ToolStrip objects.  You can use it to easily apply a  particular style or theme to a ToolStrip object. Rather than custom painting a ToolStrip and the  ToolStripItem objects it contains by overriding their OnPaint methods, you can set the  ToolStrip.Renderer property to an object that inherits from ToolStripRenderer. The painting  specified by the ToolStripRenderer is applied to the ToolStrip, as well as the items it contains.  The ToolStripRenderer class contains the following two stock renderer classes:  1.  ToolStripProfessionalRenderer : provides painting functionality for Office look;  2.  ToolStripSystemRenderer: offers painting functionality for Internet Explorer appearance;  ToolStripRenderer 

ToolStripProfessionalRenderer  (Office) 

ToolStripSystemRenderer  (IE)

80 

The ToolStripRenderer class provides many Draw* methods to provide full control of the  ToolStrip and objects.  You can override the OnRender* methods or handle the corresponding  rendering events to implement a custom ToolStripRenderer.  What order do the ToolStripRenderer events come in?  In general, the renderer paints the ToolStrip and objects in the order of background, item  background, item foreground effects, ToolStrip border.  Specifically, the sequence looks like the  following:  1.  RenderToolStripBackground  2.  RenderImageMargin  3.  RenderItemBackground  4.  RenderItemImage  5.  RenderItemText  6.  RenderArrow  7.  RenderToolStripBorder  The ToolStrip border is painted last, as it's used as the last chance to fix up paint if the items  happen to go edge to edge.  The ToolStripRender class uses GDI+ to handle the painting of all the elements except for item  text.  Measuring and drawing text is done through the new TextRenderer class which is based on  GDI technology. 

How do I implement a custom ToolStripRenderer?  You can customize the appearance of a ToolStrip control by implementing a class that derives  from ToolStripRenderer. This gives you the flexibility to create an appearance that differs from the  appearance provided the ToolStripProfessionalRenderer and ToolStripSystemRenderer classes.  There are two steps involved: Derive a custom class from ToolStripRenderer class and override  the OnRender* methods.  Step 1: Derive a custom class from the ToolStripRenderer, ToolStripProfessionalRenderer or  ToolStripSystemRenderer class:  [VB]  Class CustomProfessionalRenderer  Inherits ToolStripProfessionalRenderer  ' Add your implementation here  End Class 

[C#]  class CustomProfessionalRenderer : ToolStripProfessionalRenderer {  {  // Add your implementation here  } 

Step 2: Override the OnRender* methods to customize the painting.  [VB]  ' This sample type demonstrates a custom renderer. It overrides the  ' OnRenderMenuItemBackground and OnRenderButtonBackground methods  ' to customize the backgrounds of MenuStrip items and ToolStripbuttons.

81 

Class CustomProfessionalRenderer  Inherits ToolStripProfessionalRenderer  Protected Overrides Sub OnRenderMenuItemBackground(ByVal e As  ToolStripItemRenderEventArgs)  ' Add your implementation here  End Sub  Protected Overrides Sub OnRenderButtonBackground(ByVal e As  ToolStripItemRenderEventArgs)  ' Add your implementation here  End Sub  ' Override more OnRender* methods as you like  End Class 

[C#]  // This sample type demonstrates a custom renderer. It overrides the  // OnRenderMenuItemBackground and OnRenderButtonBackground methods  // to customize the backgrounds of MenuStrip items and ToolStripbuttons.  class CustomProfessionalRenderer : ToolStripProfessionalRenderer  {  protected override void  OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)  {  // Add your implementation here  }  protected override void  OnRenderButtonBackground(ToolStripItemRenderEventArgs e)  {  // Add your implementation here  }  // Override more OnRender* methods as you like  } 

Note: for accessibility concerns, use standard system colors and disable extraneous images  while in high contrast mode (SystemInformation.HighContrast is true). 

How do I globally change the painting (Renderer) for all my ToolStrips?  You need to do the following:  1.  Use RenderMode to pick between stock renderers.  2.  Use ToolStrip.Renderer to assign a custom renderer.  3.  Ensure that RenderMode is set to ManagerRenderMode (default)  class Form6 : Form  {  ComboBox targetComboBox = new ComboBox();  public Form6()  {  // alter renderer at top level  // new toolstrip  ToolStrip ts = new ToolStrip();  ts.Name = "ToolStrip";  ts.Items.Add("Apples");

82 

ts.Items.Add("Oranges");  ts.Items.Add("Pears");  // new menustrip, with new window  MenuStrip ms = new MenuStrip();  ms.Name = "MenuStrip";  ms.Dock = DockStyle.Top;  // add top level items  ToolStripMenuItem fileMenuItem = new ToolStripMenuItem("File");  ms.Items.Add(fileMenuItem);  ms.Items.Add("Edit");  ms.Items.Add("View");  ms.Items.Add("Window");  // add subitems to "File"  fileMenuItem.DropDownItems.Add("Open");  fileMenuItem.DropDownItems.Add("Save");  fileMenuItem.DropDownItems.Add("Save As...");  fileMenuItem.DropDownItems.Add("­");  fileMenuItem.DropDownItems.Add("Exit");  // Add button to apply renderers  Button applyButton = new Button();  applyButton.Text = "Apply Custom Renderer";  applyButton.Click += new EventHandler(applyButton_Click);  // Add combobox  targetComboBox.Items.Add("All");  targetComboBox.Items.Add("MenuStrip");  targetComboBox.Items.Add("ToolStrip");  targetComboBox.Items.Add("Reset");  applyButton.Click += new EventHandler(applyButton_Click);  // Add TLP  TableLayoutPanel tlp = new TableLayoutPanel();  tlp.Dock = DockStyle.Fill;  tlp.RowCount = 1;  tlp.ColumnCount = 2;  tlp.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));  tlp.ColumnStyles.Add(new ColumnStyle(SizeType.Percent));  tlp.Controls.Add(applyButton);  tlp.Controls.Add(targetComboBox);  // Add groupbox  GroupBox gb = new GroupBox();  gb.Text = "Apply Renderers";  gb.Dock = DockStyle.Fill;  gb.Controls.Add(tlp);  // Add groupbox to form  this.Controls.Add(gb);  // Add toolstrip to controls collection  this.Controls.Add(ts);  // Add menustrip to controls collection last ­ Z order!  this.Controls.Add(ms);  }  void applyButton_Click(object sender, EventArgs e)  {

83 

ToolStrip ms = ToolStripManager.FindToolStrip("MenuStrip");  ToolStrip ts = ToolStripManager.FindToolStrip("ToolStrip");  switch (targetComboBox.SelectedItem.ToString())  {  case "Reset":  ms.RenderMode = ToolStripRenderMode.ManagerRenderMode;  ts.RenderMode = ToolStripRenderMode.ManagerRenderMode;  // default  ToolStripManager.RenderMode = ToolStripManagerRenderMode.Professional;  break;  case "All":  ms.RenderMode = ToolStripRenderMode.ManagerRenderMode;  ts.RenderMode = ToolStripRenderMode.ManagerRenderMode;  // default  ToolStripManager.Renderer = new CustomProfessionalRenderer();  break;  case "MenuStrip":  ms.Renderer = new CustomProfessionalRenderer();  break;  case "ToolStrip":  ms.Renderer = new CustomProfessionalRenderer();  break;  }  }  void ChangeColors_Click(object sender, EventArgs e)  {  ToolStripManager.Renderer = new CustomProfessionalRenderer();  }  }  class CustomProfessionalRenderer : ToolStripProfessionalRenderer  {  protected override void  OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)  {  if (e.Item.Selected)  {  using (Brush b = new SolidBrush(ProfessionalColors.SeparatorLight))  {  e.Graphics.FillEllipse(b, e.Item.ContentRectangle);  }  }  else  using (Pen p = new Pen(ProfessionalColors.SeparatorLight))  {  e.Graphics.DrawEllipse(p, e.Item.ContentRectangle);  }  }  protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs  e)  {  Rectangle r = Rectangle.Inflate(e.Item.ContentRectangle, ­2, ­2);  if (e.Item.Selected)

84 

{  using (Brush b = new SolidBrush(ProfessionalColors.SeparatorLight))  {  e.Graphics.FillRectangle(b, r);  }  }  else  using (Pen p = new Pen(ProfessionalColors.SeparatorLight))  {  e.Graphics.DrawRectangle(p, r);  }  }  } 

When should I use Paint/OnPaint and when should I override the ToolStripRenderer?  If you want to tweak a few aspects of how an item is painted, overriding the ToolStripRenderer  might be the right idea.  If you are writing a new item and want to control all aspects of the painting, overriding OnPaint  will give you total control.  From the OnPaint, you can use methods from the ToolStripRenderer  by calling Owner.Renderer.DrawItemImage(new ToolStripItemImageRenderEventArgs(e));  Do I need to worry about double buffering?  By default the ToolStrip is double buffered; taking advantage of the OptimizedDoubleBuffer API  offered in Windows Forms 2.0.  How do I turn off the "Office" colors?  For one ToolStrip · · ·

ProfessionalColorTable colorTable = new ProfessionalColorTable(); colorTable.UseSystemColors = true; toolStrip.Renderer = new ToolStripProfessionalRenderer(colorTable); 

For the entire app  ToolStripManager.VisualStylesEnabled = false; 

Can I make the ProfessionalRenderer look like the old office?  Yes.  You need to take the following steps:  1.  Create a class which overrides the ToolStripProfessionalRenderer called  OldProfessionalRenderer;  2.  Pass in a new ProfessionalColorTable with professionalColorTable.UseSystemColors =  false;  3.  In the OldProfessionalRenderer class, override the following methods:

85 

· · ·

OnRenderImageMargin (clear with ControlLight), OnRenderBorder (do nothing), OnRenderToolStripBackground (clear with ControlLight). 

ToolStripProfessionalRenderer class  This class inherits from ToolStripRender class and provides the Microsoft Office look and feel to  your application.  When the operating system uses XP Visual style, using this class applies a  blue­toned, olive green, or silver­toned palette depending on the operating system color scheme  selected by the user.  When the operating system uses the Windows Classic style, then this class  applies the classic look and feel to the application.  This class exposes two properties described in the table below:  Property names 

Description 

ColorTable 

Gets an instance of the ProfessionalColorTable class,  which provides color palette used for Office display  elements. 

RoundedEdges 

Indicates whether edges of controls have a rounded  rather than a square or sharp appearance.  This is  regardless whether the OS uses the Windows Class  style or the XP Visual style.  OS uses XP Visual Style  ToolStrip has square edges when it uses the  professional render and the Renderer’s  RoundedEdges is set to False: 

ToolStrip has square edges when it uses the  professional render and the Renderer’s  RoundedEdges is set to True: 

OS uses Windows Class Visual Style  ToolStrip has square edges when it uses the  professional render and the Renderer’s  RoundedEdges is set to False: 

ToolStrip has square edges when it uses the  professional render and the Renderer’s  RoundedEdges is set to True:

86

How to create a Professionally Styled ToolStrip Control?  You can give your application’s ToolStrip controls a professional appearance and behavior (with  Microsoft Office look and feel) by writing your own class derived from the  ToolStripProfessionalRenderer class.  Step 1: Derive a custom professional renderer class from ToolStripProfessionalRenderer class.  [C#]  internal class CustomProfessionalRenderer : ToolStripProfessionalRenderer  {  //Override the OnRender* methods to implement custom professional  rendering  } 

[VB]  Friend Class CustomProfessionalRenderer  Inherits ToolStripProfessionalRenderer  'Override the OnRender* methods to implement custom professional  'rendering  End Class 

Step 2: Set the Toolstrip’s Renderer to an instance of the new custom professional renderer.  [C#]  CustomProfessionalRenderer cpr = new CustomProfessionalRenderer();  this.toolStrip1.Renderer = cpr; 

[VB]  Dim cpr As CustomProfessionalRenderer = New CustomProfessionalRenderer  Me.ToolStrip1.Renderer = cpr 

How do I change the ProfessionalColorTable?  You need to override ProfessionalColorTable and change only the colors you care about.  Professional Colors Sample1  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles Me.Load  Dim t As MyColorTable = New MyColorTable  ToolStrip1.Renderer = New ToolStripProfessionalRenderer(t)  End Sub 

Class MyColorTable  Inherits ProfessionalColorTable 

Public Overrides ReadOnly Property ButtonPressedGradientBegin() As Color  Get  Return Color.FromArgb(147, 210, 254)  End Get  End Property

87 

Public Overrides ReadOnly Property ButtonPressedGradientMiddle() As  System.Drawing.Color  Get  Return Color.FromArgb(83, 132, 252)  End Get  End Property 

Public Overrides ReadOnly Property ButtonPressedGradientEnd() As  System.Drawing.Color  Get  Return Color.FromArgb(18, 55, 250)  End Get  End Property 

Public Overrides ReadOnly Property ButtonSelectedGradientBegin() As Color  Get  Return Color.FromArgb(204, 227, 255)  End Get  End Property 

Public Overrides ReadOnly Property ButtonSelectedGradientMiddle() As  System.Drawing.Color  Get  Return Color.FromArgb(160, 199, 255)  End Get  End Property 

Public Overrides ReadOnly Property ButtonSelectedGradientEnd() As  System.Drawing.Color  Get  Return Color.FromArgb(116, 171, 255)  End Get  End Property  End Class 

Professional Colors Sample2  Below is an example of custom Professional Colors with built­in ProfessionalRenderer and setting  Renderer at runtime.  class Form2 : Form  {  public Form2()  {  // new toolstrip  ToolStrip ts = new ToolStrip();  ts.Items.Add("Apples");  ts.Items.Add("Oranges");  ts.Items.Add("Pears");  ts.Items.Add("Change Colors", null, new EventHandler(ChangeColors_Click));  // new menustrip, with new window  MenuStrip ms = new MenuStrip();  ms.Dock = DockStyle.Top;

88 

// add top level items  ms.Items.Add("File");  ms.Items.Add("Edit");  ms.Items.Add("View");  ms.Items.Add("Window");  // Add toolstrip to controls collection  this.Controls.Add(ts);  // Add menustrip to controls collection last ­ Z order!  this.Controls.Add(ms);  }  void ChangeColors_Click(object sender, EventArgs e)  {  ToolStripManager.Renderer = new ToolStripProfessionalRenderer(new  CustomProfessionalColors());  }  }  class CustomProfessionalColors : ProfessionalColorTable  {  public override Color ToolStripGradientBegin  { get { return Color.BlueViolet; } }  public override Color ToolStripGradientMiddle  { get { return Color.CadetBlue; } }  public override Color ToolStripGradientEnd  { get { return Color.CornflowerBlue; } }  public override Color MenuStripGradientBegin  { get { return Color.BlueViolet; } }  public override Color MenuStripGradientEnd  { get { return Color.CornflowerBlue; } }  } 

How to I paint the connected Area?  Connected area is that little bit of the dropdown for a menu where the border is discontinuous.  Below is an example of how to access and paint that.  protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)  {  using (Brush b = new SolidBrush(ColorTable.MyBackgroundColor))  {  e.Graphics.FillRectangle(b, e.ConnectedArea);  }  } 

How do I change text color on selection?  Below is an example of changing text color on selection within a custom renderer:  protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)  {  if (e.Item.Selected)  {

89 

e.TextColor = Color.Gold;  }  else  {  e.Item.ForeColor = Color.White;  }  base.OnRenderItemText(e);  } 

How can I get the office look and feel to have straight ends? 

Set RoundedEdges = false. You may also have to override OnRendererToolStripBorder and not  to call the base.  ((ToolStripProfessionalRenderer)ToolStripManager.Renderer).RoundedEdges =  false; 

ToolStripSystemRender class  This class inherits from ToolStripRenderer class and provides the appearance and style of IE. By  default, the ToolStripSystemRenderer applies a palette of SystemColors and visual styles, if  visual styles are enabled for the application.  The following figures show the appearance of the ToolStrip rendered with  ToolStripSystemRenderer on systems with Windows Classic style and XP Visual style:  On OS with Windows Classic style 

On OS with XP Visual style

90 

You can also customize the ToolStripSystemRenderer in the same way used to customize the  ToolStripProfessionalRenderer class.  The two same steps are involved:  Step 1: Derive a custom system renderer class from ToolStripSystemRenderer class.  Step 2: Set the Toolstrip’s Renderer to an instance of the new custom system renderer. 

ToolStrip’s RenderMode property  Besides using the ToolStripRenderer (ToolStripProfessionalRenderer, ToolStripSystemRenderer)  to control the rendering of the ToolStrip controls, you can also use the ToolStrip’s RenderMode  property to control whether the application is painted by the ToolStripProfessionalRenderer, the  ToolStripSystemRenderer, or a customized ToolStripRenderer.  It can be one of the following  values:  Setting 

Description 

Custom 

You cannot explicitly set the ToolStrip.RenderMode to  Custom. However, the ToolStrip.RenderMode returns  Custom when the ToolStrip.Renderer is set to an  extension of the ToolStripRenderer class that is not  ToolStripProfessionalRenderer or  ToolStripSystemRenderer. 

System 

The painting is done using ToolStripSystemRenderer  to provide the IE look and feel; 

Professional 

The painting is done using  ToolStripProfessionalRenderer to provide Office look  and feel; 

MangerRenderMode (default) 

The painting style is determined by  ToolStripManager.RenderMode property or  ToolStripManager.Renderer property;  The ToolStrip  control uses this setting by default. 

ToolStripManager’s RenderMode and Renderer properties  As discussed earlier in the training, the ToolStripManager class can be used together with the  ToolStripRenderer class to gain even more control and customizability over painting of ToolStrip.  ToolStripManager’s RenderMode property  The ToolStripManager’s RenderMode property sets the painting style for multiple ToolStrip  objects on a form that have their ToolStrip.RenderMode property set to  ToolStripRenderMode.ManagerRenderMode.  It can have one of the ToolManagerRenderMode  values:  Setting 

Description 

Custom 

You cannot explicitly set the  ToolStripManager.RenderMode to Custom. However,  the ToolStripManager.RenderMode returns Custom

91 

when the ToolStripManager.Renderer is set to an  extension of the ToolStripRenderer class that is not  ToolStripProfessionalRenderer or  ToolStripSystemRenderer.  System 

The painting is done using ToolStripSystemRenderer  to provide the IE look and feel; 

Professional 

The painting is done using  ToolStripProfessionalRenderer to provide Office look  and feel; 

ToolStripManager.Renderer property  ToolStripManager,Renderer property is used when the RenderMode property of the current  ToolStrip is set to ManagerRenderMode.  You can use this property to apply a custom renderer at  the application level.  For example, you have implemented a custom ToolStripRenderer class named CustomRenderer  and would like to use it to render all ToolStrip controls at the application level. You can simply  assign the ToolStripManager’s Renderer property to an instance of the CustomRenderer class,  and make sure that ToolStrip.RenderMode is set to the default value of ManagerRenderMode:  ToolStripManager.Renderer = New CustomRenderer()

92 

Related Documents