如何在不拖动其他小部件的情况下拖动我的小部件?

我在屏幕上有一堆可拖拽的小部件。 当我拖动其中一个小部件时,如果将鼠标拖到另一个小部件上,那么这个小部件会被“挂住”,同时也会被拖动。

虽然这是一个很好的东西,我可以想到基于这一点的几个游戏的想法,这是不是打算。 😛

背景信息

我有一个Widget类,是我的用户界面控件的基础。 它有一堆定义它的大小,位置,图像信息等的属性。它还定义了一些事件OnMouseOverOnMouseOutOnMouseClick等。所有的事件处理函数都是virtual ,这样子对象就可以override它们并使使用它们的实现而不复制代码。

小部件不知道对方。 他们不能告诉对方,“嘿,我正在拖着这样的瞎子!”

源代码

这里是小部件更新的地方(每一帧):

 public virtual void Update( MouseComponent mouse, KeyboardComponent keyboard ) { // update position if the widget is being dragged if ( this.IsDragging ) { this.Left -= (int)( mouse.LastPosition.X - mouse.Position.X ); this.Top -= (int)( mouse.LastPosition.Y - mouse.Position.Y ); } ... // define and throw other events if ( !this.WasMouseOver && this.IsMouseOver && mouse.IsButtonDown( MouseButton.Left ) ) { this.IsMouseDown = true; this.MouseDown( mouse, new EventArgs() ); } ... // define and throw other events } 

这里是IsDraggable属性设置的OnMouseDown事件:

 public virtual void OnMouseDown( object sender, EventArgs args ) { if ( this.IsDraggable ) { this.IsDragging = true; } } 

问题

看看源代码,很明显这是为什么发生。 只要将鼠标hover在Widget ,鼠标左键“down”(但不一定按顺序!), OnMouseDown事件就会被触发。 这意味着,即使我把鼠标放在屏幕上的其他地方,只要把它放在IsDraggable任何IsDraggable ,它都会“挂钩”到鼠标上去。

所以,现在很明显, 我做错了 ,我该怎么做呢?

看来你需要某种布尔variables来告诉你是否在这个确切时间拖动某个东西。 假设你一次只能拖动一个小部件,只要检查draggingSomething是否为true,如果是的话,不要“钩住”任何新的小部件。

只有触发OnMouseDown事件,如果鼠标在之前, 现在是closures(全部在同一个元素)。 这意味着只有在当前小部件上单击鼠标时才触发,而不是通过在多个小部件之间拖动单击的鼠标。 意味着你需要跟踪鼠标状态。

跟踪鼠标当前处于哪个部件可能对您非常有用,如果您还没有这样做的话。 当检测到鼠标按下时,无论您的GUI控制器类是什么,都可以使用它。 然后GUI控制器将把事件发送到当前选定的小部件。

当前select的小部件得到更新像这样(这个代码是由您的GUI控制器运行):

 poll mouse position walk tree into children and find bottom most child widget mouse is in if underMouseWidget is different than the currentWidget currentWidget.mouseLeave() currentWidget = underMouseWidget currentWidget.mouseEnter() 

现在您已经拥有当前的小部件,您的GUI控制器可以更轻松地处理事件。 像,点击鼠标:

 currentWidget.mouseClick(Button, Position) 

这也意味着你总是知道你的鼠标在哪里,你的小部件知道它们是否是当前按下的鼠标下的那些。