我有一个List<Rectangle> myRectangles
在面板控件中呈现的。如果我想在鼠标位于任何 myRectangle 内时触发事件处理程序,我最好的选择是执行“foreach”吗?然后去做 myRectangle.OnMouseMove() 会做的任何事情?
问问题
350 次
4 回答
2
这似乎对 Reactive LINQ 或 Rx 很有用,但我更熟悉使用前者。
http://tomasp.net/blog/reactive-ii-csevents.aspx
您将需要优化以确定哪些矩形可能相交,但只需使用 OnMouseMove,然后在您的 LINQ 查询中,您将找到输入的任何矩形。
这可能会成为性能问题。
于 2009-12-13T01:22:04.107 回答
1
不要对矩形使用控件,它们非常昂贵并且不能重叠。您不能仅使用 OnMouseMove() 方法使其可靠,当用户快速移动鼠标和/或矩形的边缘靠近面板边框时,您将错过鼠标移出面板的情况。使用 Control.Capture 属性很容易解决。一些示例代码:
public event EventHandler InsideRectangles;
private List<Rectangle> mRectangles = new List<Rectangle>();
private bool mInside;
protected void OnInsideRectangles(EventArgs e) {
EventHandler handler = InsideRectangles;
if (handler != null) handler(this, e);
}
protected override void OnMouseMove(MouseEventArgs e) {
bool inside = false;
foreach (var rc in mRectangles) {
if (rc.Contains(e.Location)) {
inside = true;
break;
}
}
if (inside && !mInside) OnInsideRectangles(EventArgs.Empty);
this.Capture = inside;
mInside = inside;
base.OnMouseMove(e);
}
于 2009-12-13T12:51:13.890 回答
0
您可以创建一个控件,其中包含两个矩形。外部矩形的 OnMouseMove 将被暴露。外部矩形将是不可见的。通过这种方式,您可以让 Windows 管理事件调用并且不会有杂乱的代码。
于 2009-12-13T01:21:42.297 回答
0
我假设您必须使用Winforms?如果是这样,您可能需要考虑使矩形分隔子控件(渲染矩形中的任何外观OnPaint
)并使用Control
.
于 2009-12-13T01:25:42.727 回答