2009-08-20 22 views
1

マウスのようにキーボードで動作するボタンを作成したいと思います。私は、このようにそれを実装しています:Windowsフォームでキーボードのクリックをシミュレートする

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

あなたが正しく質問していると分かったら、ユーザーがクリックできるボタンを表示し、同じコマンドを呼び出すファンクションキーにバインドされるコントロールを作成しています。

私は最も簡単なこれを行うための方法(おそらく少し「ハック」が)、UserControlを作成し、ユーザーコントロールにMenuStripコントロールを追加し、MenuStrip制御にToolStripMenuItemを追加し、設定することであると信じていますClickイベントハンドラを開き、MenuStripVisibleプロパティをfalseに設定します。また、ユーザーコントロールにボタンを追加し、そのイベントハンドラのClickイベントハンドラを設定します。私のサンプルで

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イベントが発生します:両方のイベントハンドラがアクションを実行するために、いくつかのメソッドを呼び出して、最後にメニュー項目のShortcutKeys性質を反映ShortcutKeysプロパティを作成してい消費者がそのイベントにイベントハンドラを添付してそれに対処することができるようにする。

関連する問題