2012-05-06 9 views
1

マウスが入るたびにボタンに描画したい。ボタンのテキストの後ろに矩形を描きたい。テキストの背後にあるボタンに描画するC#

private void button1_MouseEnter(object sender, EventArgs e) 
{ 
    Graphics g = this.button1.CreateGraphics(); 
    LinearGradientBrush myBrush = new 
     LinearGradientBrush(
     this.button1.ClientRectangle, 
     Color.Red, 
     Color.AliceBlue, 
     LinearGradientMode.Horizontal 
    ); 
    g.FillRectangle(myBrush, this.button1.ClientRectangle); 
} 

私はそれがカスタムボタンをせずに可能であった場合、それを行う方法を思っていた:私はその上に描画するために、次のコードを持っています。

提案/解決策がありましたら、ここに投稿してください。

ありがとうございます!

+0

すべてのボタンで同じことを描画しますか?または、各ボタンに別のものを描きたいのですか? – Ove

+0

フォーム上のすべてのボタンに対して同じことを描きたいと思います。 – 3aw5TZetdf

+0

最も簡単な解決策は、 'System.Windows.Forms.Button'から派生したカスタムボタンクラスを作ることです。なぜあなたはその考えに反対していますか? – Ove

答えて

2

私は最も簡単な方法は、カスタムボタンを作成し、そのOnPaintメソッドを上書きすることです。次に、ButtonをソースファイルのCustomBtnに置き換えて、新しいボタンを使用することができます。

class CustomBtn : Button 
{ 
    private bool ShouldDraw = false; 
    private LinearGradientBrush myBrush = null; 

    protected override void OnMouseEnter(EventArgs e) 
    { 
     base.OnMouseEnter(e); 
     ShouldDraw = true; 
    } 

    protected override void OnMouseLeave(EventArgs e) 
    { 
     base.OnMouseLeave(e); 
     ShouldDraw = false; 
    } 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     base.OnPaint(pevent); 
     if (ShouldDraw) 
     { 
      if (myBrush == null || (myBrush != null && myBrush.Rectangle != ClientRectangle)) 
      { 
       myBrush = new LinearGradientBrush(ClientRectangle, Color.Red, Color.AliceBlue, LinearGradientMode.Horizontal); 
      } 
      pevent.Graphics.FillRectangle(myBrush, ClientRectangle); 
      TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; 
      TextRenderer.DrawText(pevent.Graphics, Text, Font, ClientRectangle, ForeColor, flags); 
     } 
    } 
} 
+0

ありがとうございます、私はこれを私のアプリケーションに適用します。 – 3aw5TZetdf

関連する問題