Имитация щелчка с помощью клавиатуры в Windows Forms - PullRequest
1 голос
/ 20 августа 2009

Я хочу сделать кнопку, которая работает с клавиатурой, как с мышью. Я реализую это так:

class FunctionButton : System.Windows.Forms.Button
{
    public FunctionButton() : base() { }

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

    protected override void OnLostFocus(EventArgs e)
    {
        OnMouseLeave(null);
        base.OnLostFocus(e);
    }

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

    public void FunctionKeyPressed()
    {
        OnMouseDown(new MouseEventArgs(MouseButtons.Left,1,0,0,0));
        PerformClick();
    }

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

Я не знаю, как получить действительную позицию нажатия для этой кнопки для генерации события

OnMouseDown(new MouseEventArgs(MouseButtons.Left,1,X,Y,0));

Как я могу это сделать? Есть ли лучший способ реализовать кнопку такого типа?

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

Наконец-то я реализовал кнопку смены фона:

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);
        }
    }
}

Это не самый чистый способ, но он работает нормально. Я хотел бы больше примеров, делающих это с более чистым и более элегантным стилем.

0 голосов
/ 20 августа 2009

Если я правильно понимаю ваш вопрос, вы создаете элемент управления, который будет отображать кнопку, которую может нажать пользователь, и которая также будет связана с функциональной клавишей, которая должна вызывать ту же команду.

Я полагаю, что самый простой (хотя, возможно, немного "хакерский") способ сделать это - создать UserControl, добавить элемент управления MenuStrip в свой пользовательский элемент управления, добавить ToolStripMenuItem для элемента управления MenuStrip, настройте обработчик событий Click и установите для свойства Visible MenuStrip значение false. Также добавьте кнопку в пользовательский элемент управления и установите для нее обработчик события Click. Пусть оба обработчика событий вызовут какой-либо метод для выполнения действия и, наконец, создадут свойство ShortcutKeys, отражающее свойство ShortcutKeys пункта меню:

public partial class FunctionButton : UserControl
{
    public FunctionButton()
    {
        InitializeComponent();
    }

    private void MenuItem_Click(object sender, EventArgs e)
    {
        PerformCommand();            
    }

    private void Button_Click(object sender, EventArgs e)
    {
        PerformCommand();
    }

    private void PerformCommand()
    {
        OnClick(EventArgs.Empty);
    }

    public Keys ShortcutKeys
    {
        get
        {
            return _menuItem.ShortcutKeys;
        }
        set
        {
            _menuItem.ShortcutKeys = value;
        }
    }
}

В моем примере обработчики событий щелчка просто вызовут событие Click пользовательского элемента управления, чтобы потребитель мог присоединить обработчик события к этому событию и действовать на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...