📄 sminmenuitem.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 + -