【问题标题】:Winforms Button Right-Click visual feedback (Show button in pushed state)Winforms 按钮右键单击视觉反馈(在按下状态下显示按钮)
【发布时间】:2017-03-17 01:05:42
【问题描述】:

默认的 winforms Button 控件仅在用户左键单击按钮时将自身绘制为“单击状态”。我需要 Button 控件在单击状态下绘制自身,无论它是左键单击还是右键单击。我将如何做到这一点?

更具体地说,我知道我需要从 Button 派生一个控件来扩展功能,但我没有扩展 winforms 控件的功能或在 GDI+ 中绘图的经验。所以我有点傻眼了,我到那里后到底需要做什么。

感谢您的帮助。

【问题讨论】:

  • 但请注意,这种行为违反了 Windows 样式的一致性...

标签: c# .net winforms button right-click


【解决方案1】:

标准按钮控制使用私有SetFlag 方法将按钮设置为按下模式。你也可以自己做。我在下面的代码中做到了:

using System.Windows.Forms;
public class MyButton : Button
{
    protected override void OnMouseDown(MouseEventArgs e)
    {
        SetPushed(true);
        base.OnMouseDown(e);
        Invalidate();
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
        SetPushed(false);
        base.OnMouseUp(e);
        Invalidate();
    }
    private void SetPushed(bool value)
    {
        var setFlag = typeof(ButtonBase).GetMethod("SetFlag", 
            System.Reflection.BindingFlags.Instance |
            System.Reflection.BindingFlags.NonPublic);
        if(setFlag != null)
        {
            setFlag.Invoke(this, new object[] { 2, value });
            setFlag.Invoke(this, new object[] { 4, value });
        }
    }
}

【讨论】:

  • 这可能会在框架的未来版本中中断。
  • @Maarten 也许但不太可能。许多基于反射的东西可能会在未来的版本中中断。但至少从 .NET 2.0 到 .NET 4.6.2,该功能是相同的。我不确定 .NET 1.0 和 1.1。
  • @Maarten 作为另一种选择,您可以依靠自己使用ButtonRendererVisualStyleRenderer 绘制控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多