十字星

  • 首页
  • 技术
  • 随笔
  • 瞎折腾
  • 平面设计
  • 文集
  • 留言
  1. 首页
  2. 技术
  3. 正文

C#右键菜单ContextMenuStrip菜单项仅使用图片并有鼠标滑动及选中效果

2020-11-26 1275点热度 2人点赞 0条评论

ContextMenuStrip右键菜单原生样式只能显示一个图标配一个对应菜单文字,现在有一个需求是菜单项已经做成对应的图片,只需要显示对应图片而不需要显示文字,直接设置属性是无法实现的,下面说明实现方法

1.自定义一个继承ToolStripMenuItem控件的子控件MainToolStripMenuItem

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormDemo.ToolStripMenu
{
    public class MainToolStripMenuItem : ToolStripMenuItem
    {
        #region

        /// <summary>悬浮时</summary>
        [Category("MouseImageEnter"), Description("悬浮时背景")]
        public Image ImageMouseBack { get; set; }

        /// <summary>点击时</summary>
        [Category("MouseImageDown"), Description("点击时背景")]
        public Image ImageDownBack { get; set; }

        private Image normlback;
        /// <summary>初始时</summary>
        [Category("MouseImageNorml"), Description("初始时背景")]
        public Image ImageNormlBack
        {
            get { return normlback; }
            set
            {
                if (normlback != value)
                {
                    normlback = value;
                    this.Image = normlback;
                    this.Invalidate();
                }
            }
        }
        #endregion

        public MainToolStripMenuItem()
        {
            this.DisplayStyle = ToolStripItemDisplayStyle.Image;
            this.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
            this.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
            this.ShowShortcutKeys = false;
        }
    }
}

2.自定义一个继承ToolStripProfessionalRenderer的子类StackRenderer

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WinFormDemo.ToolStripMenu
{
    internal class StackRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
        {//实现鼠标按下/鼠标移动/无鼠标情况下显示不同图片
            MainToolStripMenuItem toolItem = e.Item as MainToolStripMenuItem;
            if (toolItem == null) { base.OnRenderMenuItemBackground(e); }
            else
            {
                Graphics g = e.Graphics;
                ToolStrip toolStrip = e.ToolStrip;
                if (toolStrip is ContextMenuStrip)
                {
                    if (e.Item.Pressed)
                    {
                        g.DrawImage(toolItem.ImageDownBack, new Point(-10, 0));
                    }
                    else if (e.Item.Selected)
                    {
                        g.DrawImage(toolItem.ImageMouseBack, new Point(-10, 0));
                    }
                    else
                    {
                        g.DrawImage(toolItem.ImageNormlBack, new Point(-10, 0));
                    }
                }
            }
        }
 
        protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e)
        {//去掉前景图
            //base.OnRenderItemImage(e);
        }
        protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
        {//去掉边框
            //base.OnRenderToolStripBorder(e);
        }
    }
}

3.在需要右键菜单的控件上创建ContextMenuStrip对象contextMenuStrip1,添加第1步创建MainToolStripMenuItem类型的菜单项,并设置三个不同状态时要显示的图片,第一次无法添加MainToolStripMenuItem类型的菜单项将程序生成一下就可以添加了

4.设置要显示右键菜单控件的ContextMenuStrip属性为contextMenuStrip1

5.在要显示右键菜单控件的构造函数中增加

this.contextMenuStrip1.Renderer = new StackRenderer();

foreach (ToolStripMenuItem tsmi in this.contextMenuStrip1.Items)
{
    tsmi.AutoSize = false;
    tsmi.Height = 32;
    tsmi.Click += (sender, e) =>
    {
        MainToolStripMenuItem _item = sender as MainToolStripMenuItem;
        if (_item == null || !_item.Enabled)
        {
            return;
        }
        MessageBox.Show(_item.Tag.ToString(),"提示");
    };
}

6.效果

7.完整代码下载

本地下载 ContextMenuStrip右键菜单仅显示图片不显示文字并有鼠标滑动及选中效果

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C# MenuStrip WinForm
最后更新:2021-09-22

cxw

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

取消回复

最新 热点 随机
最新 热点 随机
C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹 esxi无法直通sata控制器,只能使用rdm直通硬盘 Esxi总是会话超时需要重新登录,修改配置,增加超时时间
XP系统屏幕保护返回到欢迎屏幕的方法 C# String类型JSON数组转为JArray类型 C# 获取this.Handle时异常"创建窗口句柄时出错",其中一种原因 C# 单例模式基类如何初始化子类 C#程序退出托盘图标NotifyIcon不会自动消失的解决方法 Setup Factory9安装目录自动补全
标签聚合
W10 Excel WinForm C# IT WordPress CentOS Hyper-V PHP Linux
最近评论
alex 发布于 2 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

THEME KRATOS MADE BY VTROIS

京ICP备2020032489号-2