【问题标题】:How do I get a disabled ToolStripButton to paint its image in colour?如何让禁用的 ToolStripButton 将其图像绘制成彩色?
【发布时间】:2009-02-10 10:03:48
【问题描述】:

我们有一个允许用户“锁定”表单的按钮。不允许用户“解锁”表单,因此当按下时,我们希望禁用按钮,以便用户收到适当的视觉反馈。

但是,客户报告说,灰色的“锁定”图标向他们表明表单未锁定,因此我们希望将按钮显示为按下状态,但图标是彩色的,即使按钮是已禁用。

我们如何做到这一点,并使用绝对最小数量的覆盖绘画?

【问题讨论】:

    标签: c# .net winforms toolstripbutton


    【解决方案1】:

    实际上我不同意这种方法。您的客户可能有一个有效的观点,但我认为他们没有正确的修复建议。您应该研究使表单显示为“锁定”的其他方法。更改边框或字体颜色,出现大挂锁图标或从打开变为关闭等。按钮看起来有一定的方式,因为这是用户所期望的。如果您有一个禁用的按钮,看起来它可能已启用,这会让用户感到困惑,他们可能不明白为什么他们不能点击它。

    【讨论】:

    • 我同意你的观点,但他们是付钱的人。
    【解决方案2】:

    您可以将ToolStripButton Image 设置为BackgroundImage
    然后将DiplayStyle 设置为None

    无论按钮Enabled 的值是什么,图片都应该保持彩色。

    【讨论】:

    • 这不太行——由于某种原因,按钮不尊重 ImageLayout.Center 作为 BackgroundImageLayout,所以图像被绘制在左上角。
    • 你是对的,但如果你的图片比例不错,你可以使用'BackgroundImageLayout.Stretch'。
    • 嗯,好的,我刚刚尝试过,一旦按钮被选中,背景图像似乎消失了,所以它仍然不是一个好的答案抱歉。
    【解决方案3】:

    几周前我遇到过这种情况,这个问题没有答案,所以这是我 4 年后的解决方案:

    我在很多情况下都使用这个解决方案来重绘 ToolStripButton:禁用、选中、选中

    1. 覆盖 OnPaint 事件或更改 ToolStrip 的渲染器
    2. 用这种方法绘制你的图像没有灰色过滤器,只需设置按钮的图像和图像在按钮上的位置:http://msdn.microsoft.com/en-us/library/chas0s9c(v=vs.110).aspx

    两个对我有帮助的好例子:

    ToolStrip 类:

    ToolStrip ts = new ToolStrip();
    //[...]
    ts.RenderMode = ToolStripRenderMode.Professional; //Professional is just an example
    ts.Renderer = new CustomRenderer();
    

    CustomRenderer 类:

    public class CustomRenderer: ToolStripProfessionalRenderer
    {
        protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e)
        {
            if (!e.Item.Enabled) //in this case you will just have the image in your button, you need to add text etc in this if
            {
                 //to draw the image
                 Graphics g = e.Graphics;
                 g.DrawImageUnscaled(e.Item.Image, new Point(2, 2)); //you need to specify the correct position
            }
            else //other cases
                base.OnRenderButtonBackground(e);
         }
    }
    

    问题是要知道 ToolStripButton 中所有元素的正确位置,这就是我在每种情况下都绘制 ToolStripButton 的原因

    【讨论】:

      【解决方案4】:

      另一种方式:根本不要设置button.Enabled = false。只需设置button.Checked = truefalse,当有人点击按钮时测试Checked 状态并做任何你做的事情。然后,该按钮将按照您的意愿发挥作用并保持颜色不变。

      【讨论】:

      • 好点子,但他确实说过用户无法解锁表单,所以这并不是他真正想要的。
      • 是的,如果我将 button.Enabled 设置为 true,则用户在将鼠标悬停在按钮上时仍会获得视觉反馈,因此看起来他们可以点击。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多