2009-08-09 11 views
0

C#でVS2008を使用してWindowsフォームを作成しています。約32個のボタンがあります。デフォルトのボタンにイメージを配置しましたが、ホバー/アップ/ダウンこれらのボタンのそれぞれに効果があり、私はこの情報をどこにも見つけることができません。C#Windowsフォームのグラフィックスボタンステート

おそらく私は間違った用語を探していますが、いずれの方向も高く評価されています。

答えて

3

System.Windows.Forms.Buttonクラスから継承し、次のメソッドをオーバーライドします。

  • れるonmousedownが、これはあなた「が押さ画像」
  • OnMouseEnterが、これはあなたの「置くと画像」
  • を扱う扱います

  • OnMouseLeaveが、これは、コードは次のようになりますあなたの元画像

扱い

public class MyButton : System.Windows.Forms.Button { 
    public MyButton() 
     : base() { 
     // No default implementation 
    } 

    protected override void OnMouseDown(Object sender, MouseEventArgs e) { 
     this.Image = Properties.Resources.PressedImage; 
    } 

    protected override void OnMouseEnter(Object sender, MouseEventArgs e) { 
     this.Image = Properties.Resources.HoveringImage; 
    } 

    protected override void OnMouseLeave(Object sender, MouseEventArgs e) { 
     this.Image = Properties.Resources.DefaultImage; 
    } 
} 

複数のボタンがあるので、もちろん、リソースの取得をプロパティに切り替えることができます。

public Image DefaultImage { 
    get; 
    set; 
} 

public Image PressedImage { 
    get; 
    set; 
} 

public Image HoveringImage { 
    get; 
    set; 
} 

オーバーライドされた仮想メソッドのものを使用します。これはおそらくあなたの最善のアプローチです。私は非常に珍しくて面倒な解決策であるので、私は以下の答えを避ける(Phoexoは犯行しない)。

新しいボタンを作成してコンパイルすると、既存のボタンのタイプを変更するための簡単な検索と置換ができます。ちょっとしたクリーンアップを行い、それぞれのボタンの3つのプロパティをそれぞれ対応するイメージに設定し、いくつかのデザイナーコードをクリーンアップする必要がありますが、ボタンを追加する必要がある場合は、

+0

ありがとうございますこれは美しく動作しています。ありがとうございます。 –

1

私に相続する仕事のように聞こえる。私は、ボタンクラスをサブクラス化し、ホバー、プレス、およびOnHover、OnPress、OnLeave、およびOnPaintメソッドをオーバーライドすることによって処理します。ボタンペインティングはOnPaintで行います。

0

私はいくつかのラベルで、これを必要なプログラムを作ってきた、その結果は、私は((AddHandlesを追加) - のForm_Loadに無効)を思い付いた:私はもともとラベルでこれを使用

private void AddHandles() 
    { 
     foreach (Control c in this.Controls) 
     { 
      if (c.GetType() == typeof(Button)) 
      { 
       c.MouseEnter += new EventHandler(ButtonEnter); 
       c.MouseLeave += new EventHandler(ButtonLeave); 
       c.MouseDown += new MouseEventHandler(ButtonDown); 
       c.MouseUp += new MouseEventHandler(ButtonUp); 
      } 
     } 
    } 
    private void ButtonEnter(object sender, EventArgs e) 
    { 
     ((Button)sender).BackColor = Color.DarkGray; 
     ((Button)sender).Cursor = System.Windows.Forms.Cursors.Hand; 
    } 
    private void ButtonLeave(object sender, EventArgs e) 
    { 
     ((Button)sender).BackColor = Color.Black; 
     ((Button)sender).Cursor = System.Windows.Forms.Cursors.Default; 
    } 
    private void ButtonDown(object sender, MouseEventArgs e) 
    { 
     ((Button)sender).BackColor = Color.Gray; 
    } 
    private void ButtonUp(object sender, MouseEventArgs e) 
    { 
     ((Button)sender).BackColor = Color.Black; 
     ((Button)sender).Cursor = System.Windows.Forms.Cursors.Default; 

     //Code to be executed 
     //Use the name/text/etc of the Button to figure what to do... 
    } 

注意、いくつかの変更が必要な場合があります。

+0

34個のインスタンスが継承を叫び、forループ内にイベントハンドラを割り当てていない! –

0

David Andersonのソリューションとよく似ていますが、実際の状態を記録し、OnPaintメソッドをオーバーライドして適切なイメージを描画します。それがもっと良いかどうかは分かりませんが、私はこれをどうやってやったのですか。

0

チェックボックスまたはラジオボタンを使用して、外観をボタンに変更します。通常のボタンのように、チェックボックスまたはラジオボタンに画像を追加できます。

設定がいずれかのデザイナまたはコードを介して設定することができる。

チェックボックスチェックボックス=新しいチェックボックス()。 checkBox.Appearance = Appearance.Button;

関連する問題