c# .net 如何为MENU菜单加图片 (转)
2008-01-14 16:57
323 查看
方法1:
需要使用到API
首先: using System.Runtime.InteropServices;
然后:
[DllImport("user32",EntryPoint="SetMenuItemBitmaps")]
private static extern int SetMenuItemBitmaps (IntPtr hMenu, int nPosition, int wFlags, IntPtr hBitmapUnchecked, IntPtr hBitmapChecked);
最后在Form_Load时:
Bitmap bitmap = new Bitmap("c:\\icon.ico");
int MF_BYPOSITION = 0x0400;
SetMenuItemBitmaps(menuFile.Handle,0,MF_BYPOSITION,bitmap.GetHbitmap(System.Drawing.Color.White),bitmap.GetHbitmap(System.Drawing.Color.White));
注:此图标我为白色底,如果为红色底的则使用 System.Drawing.Color.Red;
以此类推,就OK了。
方法2:
用.net也可以做出来的,方法如下:
/// <summary>
/// 绘制菜单项 XP 风格
/// </summary>
/// <param name="e">绘制菜单事件</param>
/// <param name="unSelectBackColor">未选择时背景色</param>
/// <param name="selectBackColor">选择时背景色</param>
/// <param name="selectBackColorEnd">选择时背景过渡色,如果没有请用透明色</param>
/// <param name="unSelectForeColor">未选择时前景色</param>
/// <param name="selectForeColor">选择时前景色</param>
/// <param name="menuRect">菜单矩框大小</param>
/// <param name="imgMenu">整个菜单左边的图片</param>
/// <param name="iconMenu">菜单项图标</param>
/// <param name="iconTranColor">菜单项图标之透明色</param>
/// <param name="sMenuItemWord">菜单项文字</param>
private void DrawMenuItem(DrawItemEventArgs e, Color unSelectBackColor,Color selectBackColor,Color selectBackColorEnd,Color unSelectForeColor,Color selectForeColor,Image imgMenu,Image iconMenu,Color iconTranColor,String sMenuItemWord)
{
Bitmap iconBitMapMenu = new Bitmap(iconMenu);
iconBitMapMenu.MakeTransparent(iconTranColor);
Rectangle rectMenu = e.Bounds;
Brush selectBackBrush = new System.Drawing.SolidBrush(selectBackColor);
Brush unSelectBackBrush = new System.Drawing.SolidBrush(unSelectBackColor);
Brush selectForeBrush = new System.Drawing.SolidBrush(selectForeColor);
Brush unSelectForeBrush = new System.Drawing.SolidBrush(unSelectForeColor);
if(e.State == DrawItemState.NoAccelerator)
{
e.Graphics.FillRectangle(unSelectBackBrush,rectMenu);
e.Graphics.DrawString(sMenuItemWord,this.Font,unSelectForeBrush,rectMenu.X+40,rectMenu.Y+4);
e.Graphics.DrawImageUnscaled(iconBitMapMenu,rectMenu.X+22,rectMenu.Y+2,iconMenu.Width,iconMenu.Height);
}
else
{
if(selectBackColorEnd != Color.Transparent)
selectBackBrush = new System.Drawing.Drawing2D.LinearGradientBrush(rectMenu,selectBackColor,selectBackColorEnd,0F);
e.Graphics.FillRectangle(selectBackBrush,rectMenu);
e.Graphics.DrawString(sMenuItemWord,this.Font,selectForeBrush,rectMenu.X+40,rectMenu.Y+4);
e.Graphics.FillRectangle(System.Drawing.Brushes.WhiteSmoke,rectMenu.X+20,rectMenu.Y,20,20);//图标背景
e.Graphics.DrawImageUnscaled(iconBitMapMenu,rectMenu.X+2+20,rectMenu.Y+2,imgMenu.Width,imgMenu.Height);//图标
}
e.Graphics.DrawImageUnscaled(imgMenu,0,0);
}
//不过,您要在调用前设Menu的OwnerDraw=true才行哦。以下是调用方法:
private void menuExit_DrawItem(object sender, DrawItemEventArgs e)
{
DrawMenuItem(e,Color.WhiteSmoke,Color.DeepSkyBlue,Color.White,Color.Black,Color.Black,picMenu.Image,imageList.Images[2],Color.White,"退出");
}
private void menuExit_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemWidth = 150;
e.ItemHeight = 20;
}
需要使用到API
首先: using System.Runtime.InteropServices;
然后:
[DllImport("user32",EntryPoint="SetMenuItemBitmaps")]
private static extern int SetMenuItemBitmaps (IntPtr hMenu, int nPosition, int wFlags, IntPtr hBitmapUnchecked, IntPtr hBitmapChecked);
最后在Form_Load时:
Bitmap bitmap = new Bitmap("c:\\icon.ico");
int MF_BYPOSITION = 0x0400;
SetMenuItemBitmaps(menuFile.Handle,0,MF_BYPOSITION,bitmap.GetHbitmap(System.Drawing.Color.White),bitmap.GetHbitmap(System.Drawing.Color.White));
注:此图标我为白色底,如果为红色底的则使用 System.Drawing.Color.Red;
以此类推,就OK了。
方法2:
用.net也可以做出来的,方法如下:
/// <summary>
/// 绘制菜单项 XP 风格
/// </summary>
/// <param name="e">绘制菜单事件</param>
/// <param name="unSelectBackColor">未选择时背景色</param>
/// <param name="selectBackColor">选择时背景色</param>
/// <param name="selectBackColorEnd">选择时背景过渡色,如果没有请用透明色</param>
/// <param name="unSelectForeColor">未选择时前景色</param>
/// <param name="selectForeColor">选择时前景色</param>
/// <param name="menuRect">菜单矩框大小</param>
/// <param name="imgMenu">整个菜单左边的图片</param>
/// <param name="iconMenu">菜单项图标</param>
/// <param name="iconTranColor">菜单项图标之透明色</param>
/// <param name="sMenuItemWord">菜单项文字</param>
private void DrawMenuItem(DrawItemEventArgs e, Color unSelectBackColor,Color selectBackColor,Color selectBackColorEnd,Color unSelectForeColor,Color selectForeColor,Image imgMenu,Image iconMenu,Color iconTranColor,String sMenuItemWord)
{
Bitmap iconBitMapMenu = new Bitmap(iconMenu);
iconBitMapMenu.MakeTransparent(iconTranColor);
Rectangle rectMenu = e.Bounds;
Brush selectBackBrush = new System.Drawing.SolidBrush(selectBackColor);
Brush unSelectBackBrush = new System.Drawing.SolidBrush(unSelectBackColor);
Brush selectForeBrush = new System.Drawing.SolidBrush(selectForeColor);
Brush unSelectForeBrush = new System.Drawing.SolidBrush(unSelectForeColor);
if(e.State == DrawItemState.NoAccelerator)
{
e.Graphics.FillRectangle(unSelectBackBrush,rectMenu);
e.Graphics.DrawString(sMenuItemWord,this.Font,unSelectForeBrush,rectMenu.X+40,rectMenu.Y+4);
e.Graphics.DrawImageUnscaled(iconBitMapMenu,rectMenu.X+22,rectMenu.Y+2,iconMenu.Width,iconMenu.Height);
}
else
{
if(selectBackColorEnd != Color.Transparent)
selectBackBrush = new System.Drawing.Drawing2D.LinearGradientBrush(rectMenu,selectBackColor,selectBackColorEnd,0F);
e.Graphics.FillRectangle(selectBackBrush,rectMenu);
e.Graphics.DrawString(sMenuItemWord,this.Font,selectForeBrush,rectMenu.X+40,rectMenu.Y+4);
e.Graphics.FillRectangle(System.Drawing.Brushes.WhiteSmoke,rectMenu.X+20,rectMenu.Y,20,20);//图标背景
e.Graphics.DrawImageUnscaled(iconBitMapMenu,rectMenu.X+2+20,rectMenu.Y+2,imgMenu.Width,imgMenu.Height);//图标
}
e.Graphics.DrawImageUnscaled(imgMenu,0,0);
}
//不过,您要在调用前设Menu的OwnerDraw=true才行哦。以下是调用方法:
private void menuExit_DrawItem(object sender, DrawItemEventArgs e)
{
DrawMenuItem(e,Color.WhiteSmoke,Color.DeepSkyBlue,Color.White,Color.Black,Color.Black,picMenu.Image,imageList.Images[2],Color.White,"退出");
}
private void menuExit_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemWidth = 150;
e.ItemHeight = 20;
}
相关文章推荐
- .net c# gif动画如何添加图片水印实现思路及代码
- asp.net 中如何得到图片的高度(height)和宽度(width)以及生成图片的缩略图 C#
- [ASP.NET教程] C#中如何实现数据拖动?(拖动图片,到TextBox,并显示)
- C#.NET常见问题(FAQ)-如何给Listbox添加右键菜单
- asp.net 中如何得到图片的高度(height)和宽度(width)以及生成图片的缩略图 C#
- C#.NET常见问题(FAQ)-如何给Listbox添加右键菜单
- c# .net中如何实现图片防盗链功能的代码实例
- asp.net C#如何上传指定路径的图片,不用FileUpload控件[转]
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- (原創) 如何将图片左右翻转? (.NET) (ASP.NET) (C#) (GDI+) (Image Processing)
- .net c# gif动画如何添加图片水印实现思路及代码
- 用asp.net(c#)如何将彩色图片变灰阶图片
- (原創) 如何将图片以对角线做映射(Mirror)? (.NET) (ASP.NET) (C#) (GDI+) (Image Processing)
- C# .NET如何定义图片按钮
- 如何在asp.net中用C#自动生成透明的GIF图片
- C#/.NET 如何提取PPT中的所有图片
- (原創) 如何将图片转成Binary Image? (.NET) (ASP.NET) (C#) (GDI+) (Image Processing)
- C#/VB.NET 操作Word批注(二)——如何插入图片、读取、回复Word批注内容
- asp.net+c#图片压缩后上传
- C#水印图片的生成 - 教你如何用C#程序生成水印图片