DOBON.NET DOBON.NETプログラミング掲示板過去ログ

buttonの枠線の消去

環境/言語:[C# .NET Framework 2.0]
分類:[.NET]

フォームに配置した button に FlatStyle.Popup を指定して
マウスがボタンに乗ったときに外観が3Dになるようにしたのですが、
一方マウスを乗せていない時にはボタンの周りに灰色の枠線が表示されるようになりました。
この枠線を消したいのですが、どのようにすれば良いのでしょうか?
私のPCで試したところ、ButtonがFocusを獲得すると灰色の外枠が太く描画されました。Focusを獲得しないようにすれば、細い外枠のままでした。
 したがって、以下のコードをButtonの代わりに使ってみてはいかがでしょうか?

●参考URL(魔界の仮面弁士さんのコード:フォーカスを持たないButton)
http://bbs.wankuma.com/index.cgi?mode=al2&namber=12748&KLOG=27

Public Class ButtonEx
Inherits Button
Public Sub New()
Me.SetStyle(ControlStyles.Selectable, False)
Me.FlatStyle = FlatStyle.Popup
End Sub
End Class

# コードがVBですがご了承下さい。m(_ _)m
# 枠線を完全に消したい場合は、自分で描画すればOKです。OnPaintメソッドをオーバーライドし、ControlPaint.DrawButtonメソッドを使ってボタンを描画する方法が考えられます。
言葉足らずですみませんでした。
私が実現したいのは非フォーカス時に枠線が完全に消えるボタンです。

H.K.R.様より頂いたヒント「ControlPaint.DrawButtonメソッド」を基に、
Buttonクラスを継承した独自クラスを作成し以下のように記述することで
(簡易的ですが)必要な機能が実現できました。
ありがとうございました。

// 最初に記述
using System.Windows.Forms.VisualStyles;

// 以下、派生クラス内の各種オーバーライド
private PushButtonState state = PushButtonState.Normal; // ボタンの状態格納変数

protected override void OnPaint(PaintEventArgs pe)
{
    Rectangle rect = this.ClientRectangle; // ボタンの描画範囲

    // 背景の描画(ボタンの状態により描画方法を分岐)
    if (state == PushButtonState.Normal)
        pe.Graphics.FillRectangle(Brushes.Gray, rect); // 背景の描画
    else if (state == PushButtonState.Hot)
        ControlPaint.DrawButton(pe.Graphics, rect, ButtonState.Normal);
    else if (state == PushButtonState.Pressed)
        ControlPaint.DrawButton(pe.Graphics, rect, ButtonState.Pushed);

    // テキスト描画
    StringFormat sf = new StringFormat();
    sf.Alignment = StringAlignment.Center;
    sf.LineAlignment = StringAlignment.Center;
    pe.Graphics.DrawString(this.Text, this.Font, Brushes.Black, rect, sf);
}

protected override void OnMouseDown(MouseEventArgs mevent)
{
    base.OnMouseDown(mevent);
    state = PushButtonState.Pressed;
}

protected override void OnMouseEnter(EventArgs e)
{
    base.OnMouseEnter(e);
    state = PushButtonState.Hot;
}

protected override void OnMouseLeave(EventArgs e)
{
    base.OnMouseLeave(e);
    state = PushButtonState.Normal;
}

protected override void OnMouseUp(MouseEventArgs mevent)
{
    base.OnMouseUp(mevent);
    OnMouseEnter(mevent);
}
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板