关于.net C# windows窗体开发的问题
如图啊~请问一下大家,要实现这个效果,用代码是怎么写的?我用的是MenuStrip控件~我是说在vs中用C#实现这种效果怎么写?其实我是单独添加一个查看可以,但是要添加查...
如图啊~请问一下大家,要实现这个效果,用代码是怎么写的?我用的是MenuStrip控件~
我是说在vs中用C#实现这种效果怎么写?其实我是单独添加一个查看可以,但是要添加查看下面的转到,主页,停止,刷新这些东西不知道用代码怎么写... 展开
我是说在vs中用C#实现这种效果怎么写?其实我是单独添加一个查看可以,但是要添加查看下面的转到,主页,停止,刷新这些东西不知道用代码怎么写... 展开
2个回答
展开全部
首先从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)
{
}
}
在构造函数中将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)
{
}
}
展开全部
楼主是想用代码动态添加菜单按钮吧
给段代码你参考一下,假设界面上已经有一个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");
}
给段代码你参考一下,假设界面上已经有一个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");
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询