|
■No65451 (howling さん) に返信
> そんなに難しいんでしょうか?うーん…。
言葉足らずですみません。
マウス操作だけなら下記のコードでいけると思います。
でも、これにキーボード操作が加わると結構大変です。
マウスを押したままスペースキー連打とか、スペースキーを押したままマウスボタンを連打とか。
どちらもSystem.Windows.Forms.Buttonでは感覚と合わない奇妙な挙動を示したので、
きちんとあわせ込んだり、破綻なく動作させるように仕様を制定するのは結構面倒だと感じました。
public class MyButton : Control
{
private PushButtonState pushState_; // 現在の押下状態
public MyButton()
{
SetStyle(ControlStyles.StandardDoubleClick, false);
pushState_ = Enabled ? PushButtonState.Normal : PushButtonState.Disabled;
}
private bool Classic
{
get { return !(Application.RenderWithVisualStyles && VisualStyleRenderer.IsSupported); }
}
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
pushState_ = Enabled ? PushButtonState.Normal : PushButtonState.Disabled;
Invalidate();
}
protected override void OnEnabledChanged(EventArgs e)
{
base.OnEnabledChanged(e);
pushState_ = Enabled ? PushButtonState.Normal : PushButtonState.Disabled;
Invalidate();
}
protected override void OnMouseDown(MouseEventArgs mevent)
{
base.OnMouseDown(mevent);
pushState_ = PushButtonState.Pressed;
Invalidate();
}
protected override void OnMouseUp(MouseEventArgs mevent)
{
base.OnMouseUp(mevent);
pushState_ = (ClientRectangle.Contains(mevent.Location)) ? PushButtonState.Hot : PushButtonState.Normal;
Invalidate();
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
pushState_ = PushButtonState.Hot;
if (!Classic)
{
Invalidate();
}
}
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
pushState_ = PushButtonState.Normal;
if (!Classic)
{
Invalidate();
}
}
protected override void OnMouseMove(MouseEventArgs mevent)
{
base.OnMouseMove(mevent);
if ((mevent.Button & MouseButtons.Left) == MouseButtons.Left
&& !ClientRectangle.Contains(mevent.Location)
&& pushState_ == PushButtonState.Pressed)
{
pushState_ = PushButtonState.Normal;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
// pushState_の値に応じて描画
}
|