十字星

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

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

2020-11-26 1939点热度 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

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >
最新 热点 随机
最新 热点 随机
git迁移项目中的某个目录到新项目 winform判断设计模式还是运行时模式 C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹
解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关于asp.net导出Excel出现“异常来自 HRESULT:0x800A03EC”错误的另一种可能 linux下搭建svn服务器 Visual Studio Code(VSCode)配置PHP调试 针对上一篇《单例模式基类如何初始化子类》中有关线程启动停止的优化 复制网页上的内容到Excel,结果不小心复制进去了一个输入框,怎么删除?
标签聚合
CentOS IT Linux Excel PHP WinForm WordPress C# 工具 W10
最近评论
admin 发布于 4 年前(01月22日) 使用Andi Dittrich作者的插件Enlighter实现
alex 发布于 4 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

Theme Kratos Made By Seaton Jiang