Click here to Skip to main content
15,889,867 members
Articles / Programming Languages / C#
Article

Magic MenuControl - VS.NET Style

Rate me:
Please Sign up or sign in to vote.
4.83/5 (45 votes)
29 Sep 20022 min read 338.3K   1.7K   101   60
Menus that mimic VS.NET/OfficeXP

Sample Image - MagicMenuControl.gif

Why another MenuControl?

The .NET Framework contains a wide range of user interface controls, but they offer only a basic look and feel. Today's user expects a richer experience that you just cannot build with the out-of-the-box controls. The Magic Library (of which this MenuControl is a major part) aims to solve this by providing a set of user interface elements that add the sophistication expected from modern Windows applications.

Downloads

The first download MenuControl Sample contains a example application that uses shows the MenuControl from the Magic Library. This allows you to experiment and test out the feature. The actual source code is inside the separate second download. At nearly 1MB in size, I thought people would prefer to download the sample before deciding if they want to install the entire source code project!

Description

The usual way to create a menu for your application is via the Menu property of your applications main Form. Unfortunately this gives a very basic look and feel and does not support the new Visual Studio .NET appearance.

This is where the MenuControl class comes into its own as it closely mimics the Visual Studio .NET look and feel. Not only that, but you can create as many instances as you like and place them anywhere on your Form. You can even use the Dock property to place the control against the left/right and bottom edges as well as the traditional top position. When placed on the left or right edges it will draw the menu items vertically.

When using the control within an MDI application it is important that exactly one instance of the MenuControl uses the MdiContainer property. This property should be given a reference to the MDI parent Form so that it can correctly display the pendant for MDI child Forms .

MenuCommand Instances

The control exposes a property called MenuCommands that contains the collection of MenuCommand instances for display. You cannot use the builtin menu designer to generate the instances and so will need to use code to create the structure you need. Look at the sample code to see how this is done.

PopupMenu

Also demonstrated in the sample is use of the PopupMenu class that can be seen by right clicking the RichTextBox present inside each MDI child instance. This shows how to create a context menu using the VS.NET/OfficeXP look and feel. It uses the same MenuCommand instances as the MenuControl.

More Details

Download and install the Magic Libary where a couple of more detailed artiles describe how all the various features of the MenuControl and PopupMenu work.

Revision History

30 Sept 2002 - Initial Revision

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United Kingdom United Kingdom
I am a big fan of .NET and have been working on developing a free user interface library to enhance the very basic controls that come out-of-the-box. Download the free source code project from http://www.dotnetmagic.com. I often carry out bespoke development work for companies, so feel free to email me for a quote on your .NET needs!



Comments and Discussions

 
Questionlicx Pin
PuneWala16-Sep-07 19:32
PuneWala16-Sep-07 19:32 
GeneralNow it is no more for free Pin
Anonymous7-Jun-05 5:57
Anonymous7-Jun-05 5:57 
GeneralRe: Now it is no more for free Pin
Gazon7-Jun-05 7:54
Gazon7-Jun-05 7:54 
GeneralDon't add the MDI child Menu Pin
cscrazy14-May-05 2:49
cscrazy14-May-05 2:49 
GeneralRelate with NotifyIcon Pin
Gazon12-Feb-05 16:30
Gazon12-Feb-05 16:30 
QuestionProgrammatically forcing an update? Pin
Rick Pingry21-Dec-04 9:24
Rick Pingry21-Dec-04 9:24 
QuestionNot CLS Compliant? Pin
Rick Pingry8-Sep-04 13:45
Rick Pingry8-Sep-04 13:45 
AnswerRe: Not CLS Compliant? Pin
DelphiCoder12-Oct-04 19:49
DelphiCoder12-Oct-04 19:49 
GeneralRe: Not CLS Compliant? Pin
Rick Pingry13-Oct-04 4:08
Rick Pingry13-Oct-04 4:08 
GeneralRe: Not CLS Compliant? Pin
DelphiCoder20-Oct-04 9:43
DelphiCoder20-Oct-04 9:43 
GeneralRe: Not CLS Compliant? Pin
Rick Pingry20-Oct-04 10:11
Rick Pingry20-Oct-04 10:11 
GeneralNedd GUI controls Pin
Member 119551229-Aug-04 20:11
Member 119551229-Aug-04 20:11 
GeneralProblems with dynamic contextmenu + notifyIcon Pin
Member 113148229-May-04 0:31
Member 113148229-May-04 0:31 
GeneralProgrammatically opening a menu Pin
Rick Pingry25-May-04 6:35
Rick Pingry25-May-04 6:35 
QuestionHow I Install DotNetBar in my Visual Studio .NET Pin
sk0rpi0n16-Mar-04 4:44
sk0rpi0n16-Mar-04 4:44 
GeneralError with menu within menu Pin
Klaasjan Mors14-Feb-04 11:17
Klaasjan Mors14-Feb-04 11:17 
GeneralMerge MDI Child Menu with MDI Parent Menu. Pin
SunilNRao11-Jan-04 18:58
SunilNRao11-Jan-04 18:58 
GeneralAdding "Popup Menu" as Context Menu to a ToolBar Pin
jayakarthikeyan23-Dec-03 3:10
jayakarthikeyan23-Dec-03 3:10 
GeneralCompiling on command line Pin
Marc Heiligers5-Nov-03 7:04
Marc Heiligers5-Nov-03 7:04 
GeneralBUG: Showing a PopupMenu over controls that handle MouseEnter/MouseLeave Pin
dacris27-Aug-03 9:17
dacris27-Aug-03 9:17 
When you show a PopupMenu and it overlaps another control while the mouse is inside that control, the control no longer receives WM_MOUSELEAVE messages after the PopupMenu is dismissed. This is because the control still thinks the mouse is over it.

HOW TO REPRODUCE:
1. Start up the docking sample for MagicLibrary.
2. Choose Manager -> Create 3 in Column.
3. Hover the mouse over the maximize button of the Form 0 docking window, and leave the cursor there.
4. Activate and show the Settings menu via keyboard, and press ESC twice to deactivate it again.
5. Move the mouse outside of the maximize button and notice how the button is still in its hover state. Only restarting the application will fix it.

HOW TO FIX:
The solution is simple. Right before calling CreateHandle in CreateAndShowWindow for the PopupMenu, add a call to ReleaseMouse, and declare the function ReleaseMouse, as follows:

private void ReleaseMouse() <br />
{ <br />
// This is a fix to a bug in MagicLibrary! <br />
// Get the window underneath the mouse cursor <br />
// and tell it that the mouse has left its <br />
// client and nonclient areas. <br />
// Otherwise, the window will still think the <br />
// mouse is over it. <br />
<br />
IntPtr hWnd = User32.WindowFromPoint(Cursor.Position.X, Cursor.Position.Y); <br />
if(hWnd != IntPtr.Zero) <br />
{ <br />
User32.SendMessage(hWnd, Win32.Msgs.WM_NCMOUSELEAVE, 0, 0); <br />
User32.SendMessage(hWnd, Win32.Msgs.WM_MOUSELEAVE, 0, 0); <br />
} <br />
} 


Declare the WindowFromPoint API function in User32 as follows:

[DllImport("User32.dll")] <br />
public static extern IntPtr WindowFromPoint(int xPoint, int yPoint); 


You may also need to declare the WM_MOUSELEAVE and WM_NCMOUSELEAVE messages as per the Win32 API documentation.

I have a symbiotic relationship with my computer.
GeneralRe: BUG: Showing a PopupMenu over controls that handle MouseEnter/MouseLeave Pin
Anonymous4-Oct-04 9:05
Anonymous4-Oct-04 9:05 
GeneralTo Phil Pin
Member 21889620-Aug-03 5:50
Member 21889620-Aug-03 5:50 
GeneralUrgent! Pin
psusong18-Jun-03 1:17
psusong18-Jun-03 1:17 
QuestionSos!!How can i add my own icon to the menu?? Pin
Anonymous8-Apr-03 1:24
Anonymous8-Apr-03 1:24 
AnswerRe: Sos!!How can i add my own icon to the menu?? Pin
Manster7-Jul-03 3:19
Manster7-Jul-03 3:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.