2009-08-20 5 views
1

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

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

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

+0

Highlt, связанный с этим вопросом http://stackoverflow.com/questions/1299157/simulate-flat-button-mouse-mousedown-and-mouseover – yeyeyerman

ответ

0

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

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

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

Я считаю, что самый простой (хотя, возможно, немного «Hacky») способ сделать это, чтобы создать 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 событие пользователя чтобы потребитель мог присоединить обработчик событий к этому событию и действовать на него.

Смежные вопросы