我正在编写一个带有按钮行为的自定义控件。用户需要能够处理点击事件,并且控制需要在视觉上发出信号已被按下的信号。我在OnMouseDown方法中更改控件的可视状态,并在OnMouseUp中将其还原,并且完美地工作;但是,我已经注意到在测试中我的控件不会总是收到鼠标点击消息,但设备正在为点击发出正确的听觉信号,控件不会失去焦点。
P.S。如果有人知道一个好的实用程序,它将允许我记录发送到我的应用程序的窗口消息,这将是膨胀,也许可以帮助我看看可能出错的地方。
这里有我所拥有的非常简化的版本
public class CustomButton : UserControl
{
private bool _isMouseDown = false;//flag tells PaintBorder what state to draw
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
PaintBackground(e);
PaintBorder(e, _isMouseDown);
}
protected override void OnGotFocus(EventArgs e)
{
this.Invalidate();
base.OnGotFocus(e);
}
protected override void OnTextChanged(EventArgs e)
{
this.Invalidate();
base.OnTextChanged(e);
}
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_isMouseDown = true;
if (!this.Focused)
{
this.Focus();
}
else //getting focus causes Invalidate, no need to call twice
{
this.Invalidate();
}
}
base.OnMouseDown(e);
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (_isMouseDown)
{
_isMouseDown = false;
this.Invalidate();
}
base.OnMouseUp(e);
}
}
答案 0 :(得分:0)
我的Compact Framework按钮控件遇到了类似的问题。
事实证明,如果您足够快地点击按钮,Click
的某些内容将成为DoubleClick
。
此代码为我解决了这个问题:
protected override void OnDoubleClick(EventArgs e)
{
base.OnClick(e);
}
请注意,插入此代码后DoubleClick
将不再有效。