自己做出VB.NET风格的右键菜单(简单,实用)
此主题相关图片如下:
1
class MyMenuItem : System.Windows.Forms.MenuItem
2

{
3
public MyMenuItem()
4
{
5
//这里很重要,必须把OwerDraw设为true,庋梢宰约夯说ィ裨虮闶侨貌僮飨低郴说チ耍系氖莊alse
6
this.OwnerDraw = true;
7
}
8
protected override void OnDrawItem(SysDrawItemEventArgs e)
9
{
10
//要重画菜单,是没有OnPaint方法重载的,只有重载OnDrawItem方法!
11
Graphics g = e.Graphics;
12
g.SmoothingMode = SmoothingMode.AntiAlias;//抗锯齿
13
Font f = new Font(FontFamily.GenericSerif, 12, FontStyle.Regular, GraphicsUnit.Pixel);//设定菜单的字体
14
Pen p = new Pen(Color.Navy, 1);//这是画边框的字体
15
if (e.State == DrawItemState.NoAccelerator)//一开始右键单击出现菜单,但是鼠标并没有移上去
16
{ //用白色的底色
17
g.FillRectangle(Brushes.WhiteSmoke, e.Bounds.X - 2, e.Bounds.Y - 2, 121, 23);
18
}
19
//鼠标移上去,但是并没有单击
20
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
21
{
22
//花边框和底色
23
g.FillRectangle(Brushes.LightSteelBlue, e.Bounds.X, e.Bounds.Y, 109, 20);
24
g.DrawLine(p, e.Bounds.X, e.Bounds.Y, e.Bounds.X, e.Bounds.Y + 19);
25
g.DrawLine(p, e.Bounds.X, e.Bounds.Y + 19, e.Bounds.X + 109, e.Bounds.Y + 19);
26
g.DrawLine(p, e.Bounds.X + 109, e.Bounds.Y + 19, e.Bounds.X + 109, e.Bounds.Y);
27
g.DrawLine(p, e.Bounds.X + 109, e.Bounds.Y, e.Bounds.X, e.Bounds.Y);
28
}
29
//显示文字
30
g.DrawString(this.Text, f, Brushes.Black, e.Bounds.X, e.Bounds.Y);
31
g.Dispose();
32
}
33
//这是很重要的,这给你的菜单定义了大小,高20,宽100,否则你的菜单什么也看不到
34
protected override void OnMeasureItem(MeasureItemEventArgs e)
35
{
36
e.ItemHeight = 20;
37
e.ItemWidth = 100;
38
}
39
}
说明:这里我没有画按钮按下时的样子(懒:),主要是以后进一步改进),当然也没有画图标,也是为了以后改进,这只是一个初步的形态,大家看看有什么更高的方法?!