尝试在Mouseup C#上返回值

时间:2011-05-05 13:37:01

标签: c# user-interface

我正在努力完成我认为有点直接的事情,但显然不是。

我想要完成的内容如下。用户按下工具栏中的按钮,这允许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()才能返回点。

4 个答案:

答案 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,因此请对值进行操作。