我正在努力完成我认为有点直接的事情,但显然不是。
我想要完成的内容如下。用户按下工具栏中的按钮,这允许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()中没有任何内容。基本上我的问题是我如何让这个方法不返回UNTIL,我得到了鼠标升级事件?
编辑2:我正在跟踪鼠标移动事件。当鼠标移动时,我正在更新起始X,Y和新端点X,Y。我仍然认为我没有正确地提出这个问题。
我不希望在鼠标向上事件之前返回DrawBox()。鼠标按下应该只通知UI它可以在屏幕上绘制一个框。 Mouse-Move(我正在使用)更新坐标。然后Mouse-Up应该告诉UI它不能再绘制了,只有DrawBox()才能返回点。
答案 0 :(得分:3)
在MouseDown方法内等待直到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
}
答案 1 :(得分:0)
您可以将您的点存储在结构中,然后在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...
答案 2 :(得分:0)
您需要处理MouseUp事件。您正在处理的MouseMove事件将触发鼠标移动距离的每个像素变化,因此您实际上调用了DrawBox(int,int)方法数百次。如果您处理MouseUp事件,则会在释放鼠标按钮时获取坐标。
答案 3 :(得分:0)
据我所知,你有3种状态:
正常,不需要任何解释。
DesignMode ,点击工具栏中的按钮时。
DrawingBox ,当您实际绘制框时
现在您需要以下转换:
正常 - > 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;
}
}
现在,您可以简单地在每次状态更改时引发事件,并熟悉该事件的更改。例如如果状态更改为正常,请检查是否已设置startPoint和endPoint,因此请对值进行操作。