关于.net C# windows窗体开发的问题

如图啊~请问一下大家,要实现这个效果,用代码是怎么写的?我用的是MenuStrip控件~我是说在vs中用C#实现这种效果怎么写?其实我是单独添加一个查看可以,但是要添加查... 如图啊~请问一下大家,要实现这个效果,用代码是怎么写的?我用的是MenuStrip控件~
我是说在vs中用C#实现这种效果怎么写?其实我是单独添加一个查看可以,但是要添加查看下面的转到,主页,停止,刷新这些东西不知道用代码怎么写...
展开
 我来答
百度网友b2a6c0bb6
2010-07-04 · 超过10用户采纳过TA的回答
知道答主
回答量:73
采纳率:0%
帮助的人:30.9万
展开全部
首先从MenuItem继承,编写了一个自己的MenuItem类,
在构造函数中将OwnerDraw属性设置为true.
如果没有设置这个属性MenuItem的OnDrawItem事件将不会被执行。
接下来就是在OnDrawItem事件中重写MenuItem的绘制代码。
根据需要,除了绘制边框和文字外还要绘制菜单的图标。绘图的代码如下所示:

protected override void OnDrawItem(DrawItemEventArgs e)
{
try
{
// 绘制菜单项底色
e.Graphics.FillRectangle(BackColor, e.Bounds.X, e.Bounds.Y,
e.Bounds.Width + 1 , e.Bounds.Height + 1 );
// 绘制菜单图标底色
e.Graphics.FillRectangle(IconBackColor, e.Bounds.X, e.Bounds.Y, 20 , e.Bounds.Height + 1 );

if ( base .Text == " - " )
{
e.Graphics.FillRectangle(IconBackColor, e.Bounds.X + 20 ,
e.Bounds.Y + 2 , e.Bounds.Width - 20 , e.Bounds.Height - 2 );
}
else
{
Rectangle _rectIcon = new Rectangle(e.Bounds.X + 1 , e.Bounds.Y + 2 , 16 , 16 );

// 绘制图标
if (ItemIcon != null )
e.Graphics.DrawIconUnstretched(ItemIcon, _rectIcon);

e.Graphics.DrawString( base .Text, e.Font, TextColor, e.Bounds.X + 22 , e.Bounds.Y + 2 );

// 处于选中状态时绘制被选择项高亮显示效果
if ((e.State & DrawItemState.Selected) != 0 )
{
e.Graphics.FillRectangle(SelectedColor, e.Bounds);
e.Graphics.DrawRectangle(SelectedBroder, e.Bounds.X, e.Bounds.Y,
e.Bounds.Width - 1 , e.Bounds.Height - 1 );
}
}
}
catch (Exception _ex)
{
}
}

上面用到的自定义菜单项属性有:

public Icon ItemIcon = null ; // 菜单图标
private static Brush BackColor = Brushes.White; // 背景色
private static Brush TextColor = Brushes.Black; // 文本颜色
private static Brush IconBackColor = Brushes.LightBlue; // 图标背景色
private static Brush SelectedColor = new Pen(Color.FromArgb( 80 ,
Color.LightBlue.R,Color.LightBlue.G,Color.LightBlue.B)).Brush; // 被选中状态高亮颜色
private static Pen SelectedBroder = Pens.SkyBlue; // 被选中状态高亮边框颜色

我第一次做时就这么做完然后执行了,结果显示出来的是一个小的可怜的小矩形,没有图标也没有文字,后来跑去仔细看看别人的做法时才知道要重写OnMeasureItem事件的代码才能正确获取菜单的大小,以下是OnMeasureItem事件中的代码,我几乎原封不动从别人那里Copy过来的:
protected override void OnMeasureItem(MeasureItemEventArgs e)
{
try
{
if ( base .Text == " - " )
{
e.ItemHeight = 4 ;
}
else
{
e.ItemHeight = 18 ;
e.ItemWidth = Convert.ToInt32(e.Graphics.MeasureString( this .Text, TextFont).Width) + 30 ;
}
}
catch (Exception x)
{
}
}
jackyc23
2010-07-16 · TA获得超过523个赞
知道小有建树答主
回答量:376
采纳率:0%
帮助的人:394万
展开全部
楼主是想用代码动态添加菜单按钮吧
给段代码你参考一下,假设界面上已经有一个MenuStrip控件,并且添加了一个“查看”菜单按钮,名称为btnView

private void Form1_Load(object sender, EventArgs e)
{
//“查看”下级添加“转到”菜单
ToolStripMenuItem menuItem = new ToolStripMenuItem();
menuItem.Name = "menuItem1";
menuItem.Text = "转到(&G)";
menuItem.Click += new EventHandler(menuItem_Click);
btnView.DropDownItems.Add(menuItem);

//“转到”下级添加“后退”菜单
ToolStripMenuItem menuItem2 = new ToolStripMenuItem();
menuItem2.Name = "menuItem2";
menuItem2.Text = "后退(&B)";
menuItem2.ShortcutKeys = Keys.Alt | Keys.Left; //设置快捷键
menuItem2.ShortcutKeyDisplayString = "Alt + ←"; //设置快捷键的显示文本
menuItem2.Click += new EventHandler(menuItem_Click);
menuItem.DropDownItems.Add(menuItem2);

//“查看”下级添加分隔线
ToolStripSeparator separator = new ToolStripSeparator();
btnView.DropDownItems.Add(separator);

//“查看”下级添加“刷新”菜单
menuItem = new ToolStripMenuItem();
menuItem.Name = "menuItem3";
menuItem.Text = "刷新(&R)";
menuItem.ShortcutKeys = Keys.F5; //设置快捷键
menuItem.Click += new EventHandler(menuItem_Click);
btnView.DropDownItems.Add(menuItem);
}

void menuItem_Click(object sender, EventArgs e)
{
//菜单点击事件
MessageBox.Show((sender as ToolStripMenuItem).Text + " clicked");
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式