| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1920 人关注过本帖
标题:请问如何在右键菜单前面添加图标?就像Windows开始菜单一样
只看楼主 加入收藏
ruihua
Rank: 1
等 级:新手上路
威 望:1
帖 子:235
专家分:0
注 册:2006-2-21
收藏
 问题点数:0 回复次数:5 
请问如何在右键菜单前面添加图标?就像Windows开始菜单一样

如题。谢谢!

搜索更多相关主题的帖子: 菜单 图标 Windows 
2006-07-19 11:10
foproxs
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2006-4-24
收藏
得分:0 
重绘

2006-07-19 12:03
xzm2046
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-7-15
收藏
得分:0 

从别的网站找来的:如下

C#实现带图标菜单(2006-3-22 新增示例代码与可执行文件)
本文与《 C#获取文件与文件夹默认图标 》为同一系列,示例代码为同一个程序。

相关的资料我在Google上搜索了一下,好像找不到详细一点的中文资料,只好跑到国外的网站学习了一下,做了一个类似资源管理器功能的菜单,如下图所示。在这里总结下做带图标菜单的经验,让大家少走些弯路。

首先我从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)
{
}
}

就这样带图标的菜单可以正常显示了~~呵呵~~不信自己试试看,至于我怎么获取图中的分区信息以及文件和文件夹图标的,我会在后续文章中介绍。

本文与《C#获取文件与文件夹默认图标》为同一系列,示例代码为同一个程序。

示例代码下载地址:http://www.cnblogs.com/Files/BG5SBK/[2005-12-13-01]%20XView.rar
示例程序下载地址:http://www.cnblogs.com/Files/BG5SBK/XView_Bin.rar


2006-07-19 14:09
xzm2046
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-7-15
收藏
得分:0 
对了上面的是说在主菜单中加图标,在弹出菜单中加的话,应该改几处代码就OK了
我还没试过

2006-07-19 14:11
xzm2046
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-7-15
收藏
得分:0 
另外,如果你用的话,就简单多了,菜单控件属性中有Image项,可以加图标的

2006-07-19 14:12
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
以下是引用xzm2046在2006-7-19 14:12:29的发言:
另外,如果你用VS.net2005的话,就简单多了,菜单控件属性中有Image项,可以加图标的

找不到啊,请指点。

图片附件: 游客没有浏览图片的权限,请 登录注册


2006-08-10 09:39
快速回复:请问如何在右键菜单前面添加图标?就像Windows开始菜单一样
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019754 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved