我试图完成我认为有点直截了当的事情,但显然不是。
我想完成的如下。 用户按下工具栏中的按钮,这允许更改 UI 的状态。 现在,当用户单击鼠标按下时状态已更改,他们可以通过拖动鼠标在屏幕上创建一个框。 鼠标向上时,我想返回 x,y 坐标。
所以基本上是这样的
protected void MyUI_MouseDown(object inSender , MouseEventArgs inArgs)
{
switch(myState)
{
case CreateBox:
Rectangle rect = DrawBox();
}
}
public Rectangle DrawBox()
{
myDrawFlag = true;
}
private MyUI_MouseMove(object inSender , MouseEventArgs inArgs)
{
if(myDrawFlag)
{
DrawBox(inArgs.X , inArgs.Y);
}
}
基本上,我不确定如何从A点到C点。 鼠标按下会更改 UI 的状态,并允许我通过鼠标移动在屏幕上绘图 - 但我想在鼠标向上时返回值。
我知道我做错了什么 - 有人可以告诉我什么吗?
编辑 1:是的,DrawBox() 中没有任何内容。 基本上我的问题是我如何让该方法不返回 UN,直到我得到鼠标向上事件?
编辑2:我正在跟踪鼠标移动事件。 当鼠标移动时,我正在更新开始 X,Y 和新的端点 X,Y。 我仍然认为我没有正确问这个问题。
我不想在鼠标向上事件之前返回 DrawBox()。 鼠标按下应该只通知 UI 它可以在屏幕上绘制一个框。 鼠标移动(我正在使用)更新坐标。 然后鼠标向上应该告诉UI它不能再绘制了,只有这样DrawBox()才能返回点。
在 MouseDown 方法中等待直到触发 die MouseUp 事件的想法不是要走的路。你必须考虑事件驱动。最好在 MouseUp 方法中创建/保存最终对象。
protected void MyUI_MouseDown(object inSender, MouseEventArgs inArgs)
{
switch(myState)
{
case CreateBox:
Rectangle rect = new Rectangle(inArgs.X, inArgs.Y, 0, 0);
break;
}
}
protected void MyUI_MouseUp(object inSender, MouseEventArgs inArgs)
{
rect.Width = inArgs.X - rect.X;
rect.Height = inArgs.Y - rect.Y;
// now save/draw your object
}
您可以将点存储在结构中,然后在 MouseUp 事件中填充该结构,并在您希望的位置重复使用它。
struct coords
{
int x;
int y;
}
coords my_coords;
protected void MyGui_MouseUp(object sender, MouseEventArgs args)
{
my_coords.x = args.x;
my_coords.y = args.y;
}
//here you can use my_coords to what you need...
您需要处理 MouseUp 事件。 您正在处理的 MouseMove 事件将触发鼠标移动距离上的每个像素变化,因此您实际上调用了 DrawBox(int, int) 方法数百次。 如果您改为处理 MouseUp 事件,您将在释放鼠标按钮时获得坐标。
据我所知,您有 3 种状态:
正常,不需要任何解释。
设计模式,单击工具栏中的按钮时。
绘图框,当您实际绘制框时
现在,您需要以下转换:
Normal ->DesigMode -> OnDrawingBox -> AfterDrawingBox。
这可以使用状态机或枚举来实现。使用枚举,您的代码将如下所示:
enum DrawBoxState { Normal, DesignMode, DrawingBox }
DrawBoxState _currentState = DrawBoxState.Normal;
Point _startPoint;
Point _endPoint;
void OnToolbarButtonClicked(object sender, EventArgs e)
{
switch (_currentState)
{
case DrawBoxState.Normal:
_currentState = DrawBoxState.DesignMode;
break;
default:
_currentState = DrawBoxState.Normal;
break;
}
}
void OnMouseDown(object sender, MouseEventArgs e)
{
switch (_currentState)
{
case DrawBoxState.DesignMode:
{
_currentState = DrawBoxState.OnDrawingBox;
_startPoint = e.Location; // not sure if this is right
}
break;
}
}
void OnMouseUp(object sender, MouseEventArgs e)
{
switch (_currentState)
{
case DrawBoxState.DrawingBox:
{
_currentState = DrawBoxState.Normal;
_endPoint = e.Location;
}
break;
}
}
现在,您可以简单地在每次状态更改时引发一个事件,并熟练地更改该事件。 例如,如果状态更改为正常,请检查是否已设置起点和终点,从而对值执行某些操作。