模拟平面按钮鼠标MouseDown和MouseOver

时间:2009-08-19 10:58:41

标签: c# user-interface

我有一个Windows窗体应用程序,其中包含一些用于F键的按钮。当您将鼠标放在按钮上时会变为灰色,当您单击它们时,它们会略微变亮。我想用F键击键来模仿这种行为......你会怎么做?

4 个答案:

答案 0 :(得分:3)

将表单的KeyPreview属性设置为true,处理KeyDownKeyUp事件,跟踪按下的功能键,并调用{{1每个键的按钮上的方法都会向下或向上移动。

然后,处理按钮的Invalidate事件,如果其按键已关闭,请使用ButtonRenderer class按钮,就像按下按钮一样。

答案 1 :(得分:1)

使用Button.PerformClick()。

答案 2 :(得分:1)

最后我实现了改变背景的按钮:

class FunctionButton : Button
{
    private Color m_colorOver;
    private bool m_isPressed;

    public FunctionButton() : base()
    {
        m_isPressed = false;
    }

    protected override void OnGotFocus(EventArgs e)
    {
        OnMouseEnter(null);
        base.OnGotFocus(e);
    }

    protected override void OnLostFocus(EventArgs e)
    {
        if (!m_isPressed)
        {
            OnMouseLeave(null);
        }

        base.OnLostFocus(e);
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        if (!Focused && !m_isPressed)
        {
            base.OnMouseLeave(e);
        }
    }

    public void FunctionKeyPressed()
    {
        // Handle just the first event
        if (!m_isPressed)
        {
            m_isPressed = true;
            m_colorOver = FlatAppearance.MouseOverBackColor;
            FlatAppearance.MouseOverBackColor = FlatAppearance.MouseDownBackColor;

            OnMouseEnter(null);
            PerformClick();    
        }
    }

    public void FunctionKeyReleased()
    {
        m_isPressed = false;
        FlatAppearance.MouseOverBackColor = m_colorOver;

        if (Focused)
        {
            OnMouseEnter(null);
        }
        else
        {
            base.OnMouseLeave(null);
        }
    }
}

这不是最干净的方式,但它工作正常。我想用更清洁,更优雅的风格来做更多这样的例子。

答案 3 :(得分:0)

SetCapture和ReleaseCapture可能会有效。