用户界面 - 尝试在鼠标向上 C# 时返回值



我试图完成我认为有点直截了当的事情,但显然不是。

我想完成的如下。 用户按下工具栏中的按钮,这允许更改 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;
        }
    }

现在,您可以简单地在每次状态更改时引发一个事件,并熟练地更改该事件。 例如,如果状态更改为正常,请检查是否已设置起点和终点,从而对值执行某些操作。

相关内容

  • 没有找到相关文章

最新更新