首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >鼠标悬停时ToolStripMenuItem背景图像消失(.net winforms)

鼠标悬停时ToolStripMenuItem背景图像消失(.net winforms)
EN

Stack Overflow用户
提问于 2013-06-14 10:50:58
回答 3查看 2.2K关注 0票数 1

我在我的ToolStripMenuItem上设置了一个属于ContextMenuItem的BackgroundImage。

当我将鼠标移到它上面时,背景图像就消失了。蓝色的“高亮”框出现在它的上方(至少我认为是这样)。

当鼠标悬停在背景图像上时,如何显示背景图像?

我尝试在MouseEnter事件中设置图像,但没有成功。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-14 10:57:41

为此,您需要使用自定义渲染器。

在ContextMenuStrip上设置渲染器

代码语言:javascript
运行
复制
contextMenuStrip1.Renderer = new BackgroundImageRenderer();

添加这个"Renderer Class“

根据需要自定义变量。

代码语言:javascript
运行
复制
private class BackgroundImageRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
    {
        if (!e.Item.Selected)
        {
            base.OnRenderMenuItemBackground(e);
        }
        else
        {
            if (e.Item.Name == "theNameOfMyToolStripMenuItem")
            {
                Image backgroundImage = global::YourProject.Properties.Resources.ImageFileName;
                e.Graphics.DrawImage(backgroundImage, 0, 0, e.Item.Width, e.Item.Height);
            }
            else {
                base.OnRenderMenuItemBackground(e);
            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-06-14 11:53:37

创建一个从ToolStripProfessionalRenderer派生的类

代码语言:javascript
运行
复制
public class customRenderer : ToolStripProfessionalRenderer
    {
        protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
        {
            // check if the object being rendered is actually a ToolStripButton
            if (e.Item is ToolStripButton)
            {
                ToolStripButton button = e.Item as ToolStripButton;

                // only render checked items differently
                if (button.Checked || button.Selected)
                {
                   //do work here
                }
                else
                    base.OnRenderButtonBackground(e);
            }
            // if this object is not a ToolStripButton, use the normal render event
            else
                base.OnRenderButtonBackground(e);
        }

        protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e)
        {
            //do checking here like above
            base.OnRenderItemBackground(e);
        }

    }

设置窗体构造器上的控件的渲染器-从toolstrip(toolstrip because,toolstripbutton,contexmenustrip,等等)中设置所有控件的渲染器。我刚刚重写了OnRenderButtonBackground,因为您提到了这一点,您可以重写ToolStripProfessionalRenderer的其他方法

代码语言:javascript
运行
复制
toolStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
            menuStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
            contextMenuStrip1.Renderer = new customRenderer();//if you have this and want to override any behaviour
票数 3
EN

Stack Overflow用户

发布于 2014-04-16 17:43:14

代码语言:javascript
运行
复制
public class customRenderer : ToolStripProfessionalRenderer
{
    protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
    {
        // check if the object being rendered is actually a ToolStripButton
        if (e.Item is ToolStripButton)
        {
            ToolStripButton button = e.Item as ToolStripButton;

            // only render checked items differently
            if (button.Checked || button.Selected)
            {
               //do work here
            }
            else
                base.OnRenderButtonBackground(e);
        }
        // if this object is not a ToolStripButton, use the normal render event
        else
            base.OnRenderButtonBackground(e);
    }

    protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e)
    {
        //do checking here like above
        base.OnRenderItemBackground(e);
    }

}

这对我很有效

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17100380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档