<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Windows Forms Documentation Updates : ToolStrip Control</title><link>http://blogs.msdn.com/winformsue/archive/tags/ToolStrip+Control/default.aspx</link><description>Tags: ToolStrip Control</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to Get a ToolStripItem from a Context Menu Click (Right-Click) with ContextMenuStrip</title><link>http://blogs.msdn.com/winformsue/archive/2006/06/20/640245.aspx</link><pubDate>Tue, 20 Jun 2006 22:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:640245</guid><dc:creator>Jay A. Allen</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/winformsue/comments/640245.aspx</comments><wfw:commentRss>http://blogs.msdn.com/winformsue/commentrss.aspx?PostID=640245</wfw:commentRss><wfw:comment>http://blogs.msdn.com/winformsue/rsscomments.aspx?PostID=640245</wfw:comment><description>I wanted to display a hierarchical menu for my blog feed reader application. No nesting of categories - just a simple, one-level list with one category at the top and a list of feeds under it. I could have used Treeview control, but Treeview requires custom rendering to display variable font sizes. Blech. I opted instead to use a ToolStrip control with category labels flush against the left, and feeds under the categories displayed as margins. (See &lt;a href="http://blogs.msdn.com/photos/jay_a_allen/picture631437.aspx"&gt;the picture from my previous post &lt;/a&gt;for a visual.)&lt;br&gt;&lt;br&gt;I wanted to have a context menu for this "treeview", so that I could add and remove categories and feeds easily. This context menu would need different options - and different actions - depending on what ToolStripItem was underneath the mouse when the user right-clicked. &lt;br&gt;&lt;br&gt;I thought I could obtain the ToolStripItem underneath the mouse by using the OwnerItem property, as outlined in &lt;a href="http://msdn2.microsoft.com/en-US/library/ms229721.aspx"&gt;How to: Handle the ContextMenuStrip Opening Event&lt;/a&gt;. No dice. There's no direct ownership between the context menu and the items on the ToolStrip, so this doesn't fly. In order to obtain the ToolStripItem underneath the mouse during right-click, I had to:&lt;br&gt;&lt;ol&gt;&lt;li&gt;Set a ContextMenuStrip for my ToolStrip;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Handle the Opening event on ContextMenuStrip; and&lt;/li&gt;&lt;li&gt;Obtain the ToolStripItem using the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.windows.forms.toolstrip.getitemat.aspx"&gt;GetItemAt()&lt;/a&gt; method.&lt;/li&gt;&lt;/ol&gt;&lt;font face="Courier New"&gt;&lt;font face="Times New Roman"&gt;Here's the basic code:&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Form1()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; toolStrip1.ContextMenuStrip.Opening += new CancelEventHandler(ContextMenuStrip_Opening);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void ContextMenuStrip_Opening(object sender, CancelEventArgs e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This must be relative to the upper left corner of ToolStrip.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point pt = this.PointToClient(Cursor.Position);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolStripItem item = toolStrip1.GetItemAt(pt);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item == null)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Offer to add a new category only.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NOTE: Change this to adjust the menu to your application.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contextMenuStrip1.Items[1].Visible = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contextMenuStrip1.Items[0].Visible = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This is a category or a feed. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // NOTE: Change this to adjust the menu to your application.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contextMenuStrip1.Items[0].Visible = false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contextMenuStrip1.Items[1].Visible = true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;/font&gt;&lt;br&gt;&lt;b&gt;NOTE&lt;/b&gt;: If you debug, do NOT put your breakpoint on the line that calls PointToClient(), as the call to Cursor.Position will return the coordinates of the mouse in the Visual Studio window. &lt;br&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=640245" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/winformsue/archive/tags/ToolStrip+Control/default.aspx">ToolStrip Control</category></item><item><title>Radio Buttons on a MenuStrip</title><link>http://blogs.msdn.com/winformsue/archive/2006/04/24/ToolStripRadioButtonMenuItem.aspx</link><pubDate>Mon, 24 Apr 2006 14:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:582343</guid><dc:creator>Karl Erickson</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/winformsue/comments/582343.aspx</comments><wfw:commentRss>http://blogs.msdn.com/winformsue/commentrss.aspx?PostID=582343</wfw:commentRss><wfw:comment>http://blogs.msdn.com/winformsue/rsscomments.aspx?PostID=582343</wfw:comment><description>&lt;P&gt;Check boxes on menu items are nice, but sometimes you want to display options that are more complex than true/false. How do you display radio buttons on menus? The following sneak preview explains how. This topic will appear in the next documentation update. &lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;How to: Display Option Buttons in a MenuStrip&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Option buttons, also known as radio buttons, are similar to check boxes except that users can select only one at a time. Although by default the &lt;STRONG&gt;ToolStripMenuItem&lt;/STRONG&gt; class does not provide option-button behavior, the class does provide check-box behavior that you can customize to implement option-button behavior for menu items in a &lt;STRONG&gt;MenuStrip&lt;/STRONG&gt; control. &lt;/P&gt;
&lt;P&gt;When the &lt;STRONG&gt;CheckOnClick&lt;/STRONG&gt; property of a menu item is &lt;STRONG&gt;true&lt;/STRONG&gt;, users can click the item to toggle the display of a check mark. The &lt;STRONG&gt;Checked&lt;/STRONG&gt; property indicates the current state of the item. To implement basic option-button behavior, you must ensure that when an item is selected, you set the &lt;STRONG&gt;Checked&lt;/STRONG&gt; property for the previously selected item to &lt;STRONG&gt;false&lt;/STRONG&gt;. &lt;/P&gt;
&lt;P&gt;The following procedures describe how to implement this and additional functionality in a class that inherits the &lt;STRONG&gt;ToolStripMenuItem&lt;/STRONG&gt; class. The &lt;STRONG&gt;ToolStripRadioButtonMenuItem&lt;/STRONG&gt; class overrides members such as &lt;STRONG&gt;OnCheckedChanged&lt;/STRONG&gt; and &lt;STRONG&gt;OnPaint&lt;/STRONG&gt; to provide the selection behavior and appearance of option buttons. Additionally, this class overrides the &lt;STRONG&gt;Enabled&lt;/STRONG&gt; property so that options on a submenu are disabled unless the parent item is selected. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;To implement option-button selection behavior&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1.&lt;/STRONG&gt; Initialize the &lt;STRONG&gt;CheckOnClick&lt;/STRONG&gt; property to &lt;STRONG&gt;true&lt;/STRONG&gt; to enable item selection. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;' Called by all constructors to initialize CheckOnClick.&lt;BR&gt;Private Sub Initialize()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CheckOnClick = True&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;// Called by all constructors to initialize CheckOnClick.&lt;BR&gt;private void Initialize()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CheckOnClick = true;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;2.&lt;/STRONG&gt; Override the &lt;STRONG&gt;OnCheckedChanged&lt;/STRONG&gt; method to clear the selection of the previously selected item when a new item is selected. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnCheckedChanged(ByVal e As EventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnCheckedChanged(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' If this item is no longer in the checked state, do nothing.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Checked Then Return&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Clear the checked state for all siblings. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each item As ToolStripItem In Parent.Items&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim radioItem As ToolStripRadioButtonMenuItem = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TryCast(item, ToolStripRadioButtonMenuItem)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If radioItem IsNot Nothing AndAlso _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; radioItem IsNot Me AndAlso _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; radioItem.Checked Then&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; radioItem.Checked = False&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Only one item can be selected at a time, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' so there is no need to continue.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;protected override void OnCheckedChanged(EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnCheckedChanged(e);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If this item is no longer in the checked state, do nothing.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!Checked) return;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear the checked state for all siblings. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (ToolStripItem item in Parent.Items)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolStripRadioButtonMenuItem radioItem =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item as ToolStripRadioButtonMenuItem;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (radioItem != null &amp;amp;&amp;amp; radioItem != this &amp;amp;&amp;amp; radioItem.Checked)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; radioItem.Checked = false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Only one item can be selected at a time, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // so there is no need to continue.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;3.&lt;/STRONG&gt; Override the &lt;STRONG&gt;OnClick&lt;/STRONG&gt; method to ensure that clicking an item that has already been selected will not clear the selection. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnClick(ByVal e As EventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' If the item is already in the checked state, do not call &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' the base method, which would toggle the value. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked Then Return&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnClick(e)&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;protected override void OnClick(EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If the item is already in the checked state, do not call &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the base method, which would toggle the value. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked) return;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnClick(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;To modify the appearance of the option-button items&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1.&lt;/STRONG&gt; Override the &lt;STRONG&gt;OnPaint&lt;/STRONG&gt; method to paint over the default check-mark by using the &lt;STRONG&gt;RadioButtonRenderer&lt;/STRONG&gt; class. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;' Let the item paint itself, and then paint the RadioButton&lt;BR&gt;' where the check mark is displayed, covering the check mark&lt;BR&gt;' if it is present.&lt;BR&gt;Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnPaint(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' If the client sets the Image property, the selection behavior&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' remains unchanged, but the RadioButton is not displayed and the&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' selection is indicated only by the selection rectangle. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Image IsNot Nothing Then Return&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Determine the correct state of the RadioButton.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim buttonState As RadioButtonState = _&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonState.UncheckedNormal&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Enabled Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If mouseDownState Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.CheckedPressed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.UncheckedPressed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ElseIf mouseHoverState Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.CheckedHot&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.UncheckedHot&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked Then buttonState = RadioButtonState.CheckedNormal&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.CheckedDisabled&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttonState = RadioButtonState.UncheckedDisabled&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Calculate the position at which to display the RadioButton.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim offset As Int32 = CInt((ContentRectangle.Height - _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonRenderer.GetGlyphSize( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics, buttonState).Height) / 2)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim imageLocation As Point = New Point( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContentRectangle.Location.X + 4, _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContentRectangle.Location.Y + offset)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' If the item is selected and the RadioButton paints with partial&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' transparency, such as when theming is enabled, the check mark&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' shows through the RadioButton image. In this case, paint a &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' non-transparent background first to cover the check mark.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Checked AndAlso RadioButtonRenderer _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .IsBackgroundPartiallyTransparent(buttonState) Then&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim glyphSize As Size = RadioButtonRenderer _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .GetGlyphSize(e.Graphics, buttonState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glyphSize.Height -= 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glyphSize.Width -= 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim backgroundRectangle As _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; New Rectangle(imageLocation, glyphSize)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics.FillEllipse( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SystemBrushes.Control, backgroundRectangle)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonRenderer.DrawRadioButton( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics, imageLocation, buttonState)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;// Let the item paint itself, and then paint the RadioButton&lt;BR&gt;// where the check mark is displayed, covering the check mark&lt;BR&gt;// if it is present.&lt;BR&gt;protected override void OnPaint(PaintEventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnPaint(e);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If the client sets the Image property, the selection behavior&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // remains unchanged, but the RadioButton is not displayed and the&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // selection is indicated only by the selection rectangle. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Image != null) return;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Determine the correct state of the RadioButton.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonState buttonState = RadioButtonState.UncheckedNormal;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Enabled)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (mouseDownState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked) buttonState = RadioButtonState.CheckedPressed;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else buttonState = RadioButtonState.UncheckedPressed;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (mouseHoverState)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked) buttonState = RadioButtonState.CheckedHot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else buttonState = RadioButtonState.UncheckedHot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked) buttonState = RadioButtonState.CheckedNormal;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked) buttonState = RadioButtonState.CheckedDisabled;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else buttonState = RadioButtonState.UncheckedDisabled;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculate the position at which to display the RadioButton.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Int32 offset = (ContentRectangle.Height -&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonRenderer.GetGlyphSize(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics, buttonState).Height) / 2;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point imageLocation = new Point(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContentRectangle.Location.X + 4,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContentRectangle.Location.Y + offset);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // If the item is selected and the RadioButton paints with partial&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // transparency, such as when theming is enabled, the check mark&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // shows through the RadioButton image. In this case, paint a &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // non-transparent background first to cover the check mark.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Checked &amp;amp;&amp;amp; RadioButtonRenderer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .IsBackgroundPartiallyTransparent(buttonState))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Size glyphSize = RadioButtonRenderer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .GetGlyphSize(e.Graphics, buttonState);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glyphSize.Height--;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; glyphSize.Width--;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rectangle backgroundRectangle =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new Rectangle(imageLocation, glyphSize);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics.FillEllipse(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SystemBrushes.Control, backgroundRectangle);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RadioButtonRenderer.DrawRadioButton(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Graphics, imageLocation, buttonState);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;2.&lt;/STRONG&gt; Override the &lt;STRONG&gt;OnMouseEnter&lt;/STRONG&gt;, &lt;STRONG&gt;OnMouseLeave&lt;/STRONG&gt;, &lt;STRONG&gt;OnMouseDown&lt;/STRONG&gt;, and &lt;STRONG&gt;OnMouseUp&lt;/STRONG&gt; methods to track the state of the mouse and ensure that the &lt;STRONG&gt;OnPaint&lt;/STRONG&gt; method paints the correct option-button state. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;Private mouseHoverState As Boolean = False&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseHoverState = True&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Force the item to repaint with the new RadioButton state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnMouseEnter(e)&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseHoverState = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnMouseLeave(e)&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Private mouseDownState As Boolean = False&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseDownState = True&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Force the item to repaint with the new RadioButton state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnMouseDown(e)&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseDownState = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnMouseUp(e)&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;private bool mouseHoverState = false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;protected override void OnMouseEnter(EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseHoverState = true;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Force the item to repaint with the new RadioButton state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnMouseEnter(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;protected override void OnMouseLeave(EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseHoverState = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnMouseLeave(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;private bool mouseDownState = false;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;protected override void OnMouseDown(MouseEventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseDownState = true;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Force the item to repaint with the new RadioButton state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnMouseDown(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;protected override void OnMouseUp(MouseEventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseDownState = false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnMouseUp(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;To disable options on a submenu when the parent item is not selected&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;1.&lt;/STRONG&gt; Override the &lt;STRONG&gt;Enabled&lt;/STRONG&gt; property so that the item is disabled when it has a parent item with both a &lt;STRONG&gt;CheckOnClick&lt;/STRONG&gt; value of &lt;STRONG&gt;true&lt;/STRONG&gt; and a &lt;STRONG&gt;Checked&lt;/STRONG&gt; value of &lt;STRONG&gt;false&lt;/STRONG&gt;. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;' Enable the item only if its parent item is in the checked state &lt;BR&gt;' and its Enabled property has not been explicitly set to false. &lt;BR&gt;Public Overrides Property Enabled() As Boolean&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ownerMenuItem As ToolStripMenuItem = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TryCast(OwnerItem, ToolStripMenuItem)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' Use the base value in design mode to prevent the designer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ' from setting the base value to the calculated value.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not DesignMode AndAlso _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT face="Courier New"&gt;ownerMenuItem IsNot Nothing AndAlso _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownerMenuItem.CheckOnClick Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return MyBase.Enabled AndAlso ownerMenuItem.Checked&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return MyBase.Enabled&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Get&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set(ByVal value As Boolean)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.Enabled = value&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Set&lt;BR&gt;End Property&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;// Enable the item only if its parent item is in the checked state &lt;BR&gt;// and its Enabled property has not been explicitly set to false. &lt;BR&gt;public override bool Enabled&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolStripMenuItem ownerMenuItem =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OwnerItem as ToolStripMenuItem;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Use the base value in design mode to prevent the designer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // from setting the base value to the calculated value.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!DesignMode &amp;amp;&amp;amp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownerMenuItem != null &amp;amp;&amp;amp; ownerMenuItem.CheckOnClick)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return base.Enabled &amp;amp;&amp;amp; ownerMenuItem.Checked;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else return base.Enabled;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.Enabled = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;2.&lt;/STRONG&gt; Override the &lt;STRONG&gt;OnOwnerChanged&lt;/STRONG&gt; method to subscribe to the &lt;STRONG&gt;CheckedChanged&lt;/STRONG&gt; event of the parent item. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;' When OwnerItem becomes available, if it is a ToolStripMenuItem &lt;BR&gt;' with a CheckOnClick property value of true, subscribe to its &lt;BR&gt;' CheckedChanged event. &lt;BR&gt;Protected Overrides Sub OnOwnerChanged(ByVal e As EventArgs)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ownerMenuItem As ToolStripMenuItem = _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TryCast(OwnerItem, ToolStripMenuItem)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If ownerMenuItem IsNot Nothing AndAlso _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownerMenuItem.CheckOnClick Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler ownerMenuItem.CheckedChanged, New _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventHandler(AddressOf OwnerMenuItem_CheckedChanged)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBase.OnOwnerChanged(e)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;// When OwnerItem becomes available, if it is a ToolStripMenuItem &lt;BR&gt;// with a CheckOnClick property value of true, subscribe to its &lt;BR&gt;// CheckedChanged event. &lt;BR&gt;protected override void OnOwnerChanged(EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolStripMenuItem ownerMenuItem =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OwnerItem as ToolStripMenuItem;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ownerMenuItem != null &amp;amp;&amp;amp; ownerMenuItem.CheckOnClick)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownerMenuItem.CheckedChanged +=&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new EventHandler(OwnerMenuItem_CheckedChanged);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnOwnerChanged(e);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;3.&lt;/STRONG&gt; In the handler for the parent-item &lt;STRONG&gt;CheckedChanged&lt;/STRONG&gt; event, invalidate the item to update the display with the new enabled state. &lt;/P&gt;
&lt;BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px"&gt;
&lt;P&gt;&lt;U&gt;Visual Basic&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;' When the checked state of the parent item changes, &lt;BR&gt;' repaint the item so that the new Enabled state is displayed. &lt;BR&gt;Private Sub OwnerMenuItem_CheckedChanged( _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByVal sender As Object, ByVal e As EventArgs)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate()&lt;BR&gt;End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;C#&amp;nbsp;&amp;nbsp; &lt;BR&gt;&lt;/U&gt;&lt;FONT face="Courier New"&gt;// When the checked state of the parent item changes, &lt;BR&gt;// repaint the item so that the new Enabled state is displayed. &lt;BR&gt;private void OwnerMenuItem_CheckedChanged(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; object sender, EventArgs e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Invalidate();&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;Example&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;You can download the complete code example from the &lt;STRONG&gt;Attachment(s)&lt;/STRONG&gt; section below. The code example provides the complete &lt;STRONG&gt;ToolStripRadioButtonMenuItem&lt;/STRONG&gt; class, plus a &lt;STRONG&gt;Form&lt;/STRONG&gt; class and &lt;STRONG&gt;Program&lt;/STRONG&gt; class to demonstrate the option-button behavior. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Compiling the Code&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This example requires:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;References to the System, System.Drawing, and System.Windows.Forms assemblies. &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=582343" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/winformsue/attachment/582343.ashx" length="4885" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/winformsue/archive/tags/ToolStrip+Control/default.aspx">ToolStrip Control</category></item><item><title>Using ToolStrip to Create a Custom Title Bar</title><link>http://blogs.msdn.com/winformsue/archive/2006/04/07/571135.aspx</link><pubDate>Fri, 07 Apr 2006 21:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:571135</guid><dc:creator>Jay A. Allen</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/winformsue/comments/571135.aspx</comments><wfw:commentRss>http://blogs.msdn.com/winformsue/commentrss.aspx?PostID=571135</wfw:commentRss><wfw:comment>http://blogs.msdn.com/winformsue/rsscomments.aspx?PostID=571135</wfw:comment><description>&lt;P&gt;Our current documentation on creating nonrectangular forms could stand some enhancement. The most glaring piece of missing info is how to add a custom title bar. The document we do have gives code for how to move the form if the user clicks anywhere in the form area - but how often do you need this? In most cases, you want to slap your own custom title bar on the app, and move the app around when the user clicks on this title bar and drags it about.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://blogs.msdn.com/photos/jay_a_allen/picture570978.aspx"&gt;Picture 1: Meditate Awake! application&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;For the sample app I've been developing, I decided to replace the standard title bar with a ToolStrip that acts like a title bar. (Can't you tell I'm no graphic designer?) It was surprisingly easy to enable the ToolStrip to act like a title bar. The secret ingredient was&amp;nbsp;setting &lt;STRONG&gt;ToolStrip.Capture&lt;/STRONG&gt; to &lt;STRONG&gt;True&lt;/STRONG&gt; when the mouse button is clicked; this is necessary to prevent the cursor from moving faster than the form, which results in the cursor flying away from the ToolStrip before you've released the left mouse button.&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private _MouseOffset As Point&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private isMouseDown As Boolean = False&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub TitleStrip_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TitleStrip.MouseDown&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If e.Button = System.Windows.Forms.MouseButtons.Left Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _MouseOffset = New Point(e.X, e.Y)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _IsMouseDown = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TitleStrip.Capture = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub TitleStrip_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TitleStrip.MouseMove&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If _IsMouseDown Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim _CurrentPos As Point = Control.MousePosition&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _CurrentPos.X = _CurrentPos.X - _MouseOffset.X&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _CurrentPos.Y = _CurrentPos.Y - _MouseOffset.Y&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.Location = _CurrentPos&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub TitleStrip_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TitleStrip.MouseUp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If e.Button = System.Windows.Forms.MouseButtons.Left Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _IsMouseDown = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TitleStrip.Capture = False&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=571135" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/winformsue/archive/tags/ToolStrip+Control/default.aspx">ToolStrip Control</category></item><item><title>Using ToolStrip as a TabControl Alternative in Windows Forms</title><link>http://blogs.msdn.com/winformsue/archive/2006/03/21/557054.aspx</link><pubDate>Tue, 21 Mar 2006 23:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:557054</guid><dc:creator>WinFormsUE</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/winformsue/comments/557054.aspx</comments><wfw:commentRss>http://blogs.msdn.com/winformsue/commentrss.aspx?PostID=557054</wfw:commentRss><wfw:comment>http://blogs.msdn.com/winformsue/rsscomments.aspx?PostID=557054</wfw:comment><description>&lt;P&gt;I've been going back and forth lately with Karl Erickson, another member of our team, and the guy who owns the TabControl docs. It appears that &lt;A href="/winformsue/archive/2006/03/14/551564.aspx"&gt;my gripes with TabControl&lt;/A&gt; weren't mine alone. He's been fielding reports of various weird bugs, such as the visual styles weirdness and the funky way &lt;STRONG&gt;TabControl&lt;/STRONG&gt; handles layout at run time. Basically, the darn thing isn't meant to have its tab layout order changed at run time; properties like Alignment are best set at design time, and then kept like that for the life of your app.&lt;/P&gt;
&lt;P&gt;So, yes: it's possible to hack up TabControl to make right-aligned and left-aligned tabs work.&lt;/P&gt;
&lt;P&gt;Or, you can use &lt;STRONG&gt;&lt;A href="http://lab.msdn.microsoft.com/search/Redirect.aspx?title=ToolStrip+Control+(Windows+Forms)+&amp;amp;url=http://msdn2.microsoft.com/en-us/library/5daaw6hf.aspx"&gt;ToolStrip&lt;/A&gt;&lt;/STRONG&gt; instead.&lt;/P&gt;
&lt;P&gt;&lt;A href="/photos/winformsue/picture557005.aspx"&gt;&lt;STRONG&gt;Picture 1&lt;/STRONG&gt;: ToolStrip Tab Imitator&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The idea is simple. Add a SplitContainer to your form. Make one panel the "nav" panel, and the other the content panel. (You could just Dock it Left, but using SplitContainer makes it easier to resize. And yes, I know that ToolStripContainer exists - I'm still trying to force it to do my bidding.) Add a ToolStrip to the nav panel and set it to Dock=Full. Add image and text for each of the buttons, and use the following settings on each button:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;.DisplayType&lt;/STRONG&gt;=TextAndImage&lt;BR&gt;&lt;STRONG&gt;.ImageAlign&lt;/STRONG&gt;=MiddleLeft&lt;BR&gt;&lt;STRONG&gt;.TextAlign&lt;/STRONG&gt;=MiddleRight&lt;BR&gt;&lt;STRONG&gt;.TextImageRelation&lt;/STRONG&gt;=Overlay&lt;/P&gt;
&lt;P&gt;For the panels themselves, you can develop separate UserControl classes, and switch between them whenever a user clicks a button. You can incorporate interfaces onto the UserControls to test if there is any data that needs to be persisted before switching tabs. E.g., if you're on the Pay Bills tab, and the user has unconfirmed bill payments, you might want to prompt to confirm or discard the transactions.&lt;/P&gt;
&lt;P&gt;Here's another screenshot of a rinky-dink app I've been using as a testbed. I haven't written any of the panels yet, so there's a big gaping hole in the middle there, but this shows how to do the same thing using larger, more stylized buttons on the right hand side. These use .TextImageRelation=ImageBeforeText to make them work. Also, the &lt;STRONG&gt;RenderStyle&lt;/STRONG&gt; of ToolStrip is set to System, and the &lt;STRONG&gt;BackColor&lt;/STRONG&gt; to White to blend in with the buttons. (Don't&amp;nbsp;attempt to use &lt;STRONG&gt;TransparencyKey&lt;/STRONG&gt; when using complex images.)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You'll have to forgive the app's slight klunkiness; I've hacked it to bits recently. And yes, that&amp;nbsp;&lt;STRONG&gt;is&lt;/STRONG&gt; a ToolStrip control I'm using as the title bar!&lt;/P&gt;
&lt;P&gt;&lt;A href="https://blogs.msdn.com/photos/winformsue/picture557040.aspx"&gt;&lt;STRONG&gt;Picture 2&lt;/STRONG&gt;: Right-Aligned Buttons&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The benefits of this approach are numerous. Because you're using ToolStrip, you can use features like drop-down buttons, embedded ComboBoxes, fly-out menus, context menus, etc. ToolStrip is a great "kitchen sink" control that's been designed to do just about anything. It has a modern look and feel by default; you can&amp;nbsp;make it very slick without writing a lick of code.&amp;nbsp;If the&amp;nbsp;built-in renderers&amp;nbsp;don't meet your needs, however, never fear:&amp;nbsp;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms171698.aspx"&gt;ToolStrip can be stylized out the wazoo using a custom renderer&lt;/A&gt;. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=557054" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/winformsue/archive/tags/Container+Controls+and+Layout/default.aspx">Container Controls and Layout</category><category domain="http://blogs.msdn.com/winformsue/archive/tags/ToolStrip+Control/default.aspx">ToolStrip Control</category></item></channel></rss>