⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sminmenuitem.cs

📁 适合VB初学者看
💻 CS
字号:
namespace MenuSample
{
	using System;
	using System.Windows.Forms;
	using System.Drawing;
	using System.Drawing.Text;
	using System.Diagnostics;
    

	public class ColorGroup 
	{
		public ColorGroup(Color bgcolor, Color stripecolor, Color selectioncolor, Color bordercolor)
		{
			this.bgcolor = bgcolor;
			this.stripecolor = stripecolor;
			this.selectioncolor = selectioncolor;
			this.bordercolor = bordercolor;
		}

		Color bgcolor;
		Color stripecolor;
		Color selectioncolor;
		Color bordercolor;

		public Color bgColor 
		{
			get 
			{
				return bgcolor;
			}
		}
		
		public Color stripeColor 
		{
			get 
			{
				return stripecolor;
			}
		}

		public Color selectionColor 
		{
			get 
			{
				return selectioncolor;
			}
		}

		public Color borderColor 
		{
			get 
			{
				return bordercolor;
			}
		}
	}

	public class ThemeColors
	{
		public static ColorGroup GetColorGroup() 
		{
			Color bg = SystemColors.Menu;
			Color stripe = SystemColors.Control;
			Color border = SystemColors.Highlight;
			
			Color selection = SystemColors.Highlight;
			byte a = selection.A;
			byte r = selection.R;
			byte g = selection.G;
			byte b = selection.B;
			selection = Color.FromArgb((int)a/2, (int)r, (int)g, (int)b);

			ColorGroup colorGroup = new ColorGroup(bg, stripe, selection, border);
			return colorGroup;
		}
	}


	public class SminMenuItem : MenuItem 
	{
		static ColorGroup group = ThemeColors.GetColorGroup();
		static Color bgColor  = group.bgColor;
		static Color stripeColor = group.stripeColor;
		static Color selectionColor  = group.selectionColor;
		static Color borderColor = group.borderColor;
		
		static int iconSize = SystemInformation.SmallIconSize.Width + 5;
		static int itemHeight;
		static bool doColorUpdate = false;
		string shortcuttext = "";
		Image icon   = null;
		static int BITMAP_SIZE = 16;
		static int STRIPE_WIDTH = iconSize + 5;
		
		
		public SminMenuItem(string name, EventHandler handler, Shortcut shortcut, Image img) : this(name, handler, shortcut) 
		{
			icon = img;
		}

		public SminMenuItem(string name, EventHandler handler, Image img) : this(name, handler) 
		{
			icon = img;
		}

		public SminMenuItem(string name, Image img) : this(name) 
		{
			icon = img;
		}

		public SminMenuItem(string name, EventHandler handler, Shortcut shortcut) : base(name, handler, shortcut) 
		{
			OwnerDraw = true;
		}
		
		public SminMenuItem(string name, EventHandler handler) : base(name, handler) 
		{
			OwnerDraw = true;
		}
		
		public SminMenuItem(string name) : base(name) 
		{
			OwnerDraw = true;
		}
		
		public SminMenuItem() : base() 
		{
			OwnerDraw = true;
		}

		public Image Icon 
		{
			get 
			{
				return icon;
			}
			set 
			{
				icon = value;
			}
		}

		public string ShortcutText 
		{
			get 
			{
				return shortcuttext;
			}
			set 
			{
				shortcuttext = value;
			}
		}

		static public void UpdateMenuColors() 
		{            
			doColorUpdate = true;
		}

		private void DoUpdateMenuColors() 
		{
			ColorGroup group = ThemeColors.GetColorGroup();
			bgColor  = group.bgColor;
			stripeColor = group.stripeColor;
			selectionColor  = group.selectionColor;
			borderColor = group.borderColor;
			
			doColorUpdate = false;

		}

		protected override void OnMeasureItem(MeasureItemEventArgs e) 
		{
			base.OnMeasureItem(e);
			
			if (Shortcut != Shortcut.None) 
			{
				string text = "";
				int    key  = (int)Shortcut;
				int    ch   = key & 0xFF;
				if (((int)Keys.Control & key) > 0) text += "Ctrl+";
				if (((int)Keys.Shift & key) > 0) text += "Shift+";
				if (((int)Keys.Alt & key) > 0) text += "Alt+";
				
				if (ch >= (int)Shortcut.F1 && ch <= (int)Shortcut.F12)
					text += "F" + (ch - (int)Shortcut.F1 + 1);
				else 
				{
					if ( Shortcut == Shortcut.Del) 
					{
						text += "Del";
					}
					else 
					{
						text += (char)ch;
					}
				}
				shortcuttext = text;
			} 
			
			if (Text == "-") 
			{
				e.ItemHeight = 8;
				e.ItemWidth  = 4;
				return;
			}
				
			bool topLevel = Parent == Parent.GetMainMenu();
			string tempShortcutText = shortcuttext;
			if ( topLevel ) 
			{
				tempShortcutText = "";
			}
			int textwidth = (int)(e.Graphics.MeasureString(Text + tempShortcutText, SystemInformation.MenuFont).Width);
			int extraHeight = 4;
			e.ItemHeight  = SystemInformation.MenuHeight + extraHeight;
			if ( topLevel )
				e.ItemWidth  = textwidth - 5; 
			else
				e.ItemWidth   = Math.Max(160, textwidth + 50);

			itemHeight = e.ItemHeight;
		}
		
		protected override void OnDrawItem(DrawItemEventArgs e) 
		{
			if ( doColorUpdate) 
			{
				DoUpdateMenuColors();
			}
			
			base.OnDrawItem(e);

			Graphics  g      = e.Graphics;
			Rectangle bounds = e.Bounds;
			bool selected = (e.State & DrawItemState.Selected) > 0;
			bool toplevel = (Parent == Parent.GetMainMenu());
			bool hasicon  = Icon != null;
			bool enabled = Enabled;
			
			DrawBackground(g, bounds, e.State, toplevel, hasicon, enabled);
			if (hasicon)
				DrawIcon(g, Icon, bounds, selected, Enabled, Checked);
			else
				if (Checked)
				DrawCheckmark(g, bounds, selected);
			
			if (Text == "-") 
			{
				DrawSeparator(g, bounds);
			} 
			else 
			{
				DrawMenuText(g, bounds, Text, shortcuttext, Enabled, toplevel, e.State);
			}
		}


		public void DrawCheckmark(Graphics g, Rectangle bounds, bool selected) 
		{
			int checkTop = bounds.Top + (itemHeight - BITMAP_SIZE)/2;
			int checkLeft = bounds.Left + ( STRIPE_WIDTH - BITMAP_SIZE)/2;
			ControlPaint.DrawMenuGlyph(g, new Rectangle(checkLeft, checkTop, BITMAP_SIZE, BITMAP_SIZE), MenuGlyph.Checkmark);
			g.DrawRectangle(new Pen(borderColor), checkLeft-1, checkTop-1, BITMAP_SIZE+1, BITMAP_SIZE+1);
		}

		
		public void DrawIcon(Graphics g, Image icon, Rectangle bounds, bool selected, bool enabled, bool ischecked) 
		{
			int iconTop = bounds.Top + (itemHeight - BITMAP_SIZE)/2;
			int iconLeft = bounds.Left + (STRIPE_WIDTH - BITMAP_SIZE)/2;
			if (enabled) 
			{
				if (selected) 
				{
					ControlPaint.DrawImageDisabled(g, icon, iconLeft + 1, iconTop, Color.Black);
					g.DrawImage(icon, iconLeft, iconTop-1);
				} 
				else 
				{
					g.DrawImage(icon, iconLeft + 1, iconTop);
				}
			} 
			else 
			{
				ControlPaint.DrawImageDisabled(g, icon, iconLeft + 1, iconTop, SystemColors.HighlightText);
			}
		}
	
		public void DrawSeparator(Graphics g, Rectangle bounds) 
		{
			int y = bounds.Y + bounds.Height / 2;
			g.DrawLine(new Pen(SystemColors.ControlDark), bounds.X + iconSize + 7, y, bounds.X + bounds.Width - 2, y);
		}
		
		public void DrawBackground(Graphics g, Rectangle bounds, DrawItemState state, bool toplevel, bool hasicon, bool enabled) 
		{
			bool selected = (state & DrawItemState.Selected) > 0;
			
			if (selected || ((state & DrawItemState.HotLight) > 0)) 
			{
				if (toplevel && selected) 
				{
					bounds.Inflate(-1, 0);
					g.FillRectangle(new SolidBrush(stripeColor), bounds);
					ControlPaint.DrawBorder3D(g, bounds.Left, bounds.Top, bounds.Width, 
						bounds.Height, Border3DStyle.Flat, Border3DSide.Top | Border3DSide.Left | Border3DSide.Right);
				} 
				else 
				{
					if ( enabled ) 
					{
						g.FillRectangle(new SolidBrush(selectionColor), bounds);
						g.DrawRectangle(new Pen(borderColor), bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1);
					}
					else 
					{
						g.FillRectangle(new SolidBrush(stripeColor), bounds);
						bounds.X += STRIPE_WIDTH;
						bounds.Width -= STRIPE_WIDTH;
						g.FillRectangle(new SolidBrush(bgColor), bounds);
					}
				}
			} 
			else 
			{
				if (!toplevel) 
				{
					g.FillRectangle(new SolidBrush(stripeColor), bounds);
					bounds.X += STRIPE_WIDTH;
					bounds.Width -= STRIPE_WIDTH;
					g.FillRectangle(new SolidBrush(bgColor), bounds);
				} 
				else 
				{
					g.FillRectangle(SystemBrushes.Control, bounds);
				}
			}
		}

		public void DrawMenuText(Graphics g, Rectangle bounds, string text, string shortcut, bool enabled, bool toplevel, DrawItemState state )	
		{
			StringFormat stringformat = new StringFormat();
			stringformat.HotkeyPrefix = ((state & DrawItemState.NoAccelerator) > 0) ? HotkeyPrefix.Hide : HotkeyPrefix.Show;
		
			if ( toplevel ) 
			{
				int index = text.IndexOf("&");
				if ( index != -1 ) 
				{
					text = text.Remove(index,1);
				}
			}
			
			int textwidth = (int)(g.MeasureString(text, SystemInformation.MenuFont).Width);
			int x = toplevel ? bounds.Left + (bounds.Width - textwidth) / 2: bounds.Left + iconSize + 10;
			int topGap = 4;
			if ( toplevel ) topGap = 2;
			int y = bounds.Top + topGap;
			Brush brush = null;
			
			if (!enabled)
				brush = new SolidBrush(Color.FromArgb(127, SystemColors.MenuText));
			else 
				brush = new SolidBrush(Color.Black);
			
			g.DrawString(text, SystemInformation.MenuFont, brush, x, y, stringformat);

			if ( !toplevel ) 
			{
				stringformat.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
				g.DrawString(shortcut, SystemInformation.MenuFont, brush, bounds.Width - 10 , bounds.Top + topGap, stringformat);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -