【问题标题】:How do i make that the rectangle first location will be the mouse cursor location and end point will be where i leave the mouse left button?我如何使矩形的第一个位置成为鼠标光标的位置,而终点将是我离开鼠标左键的位置?
【发布时间】:2014-08-17 11:12:11
【问题描述】:

我有这个代码:

private void pictureBoxSnap_Paint(object sender, PaintEventArgs e)
        {
            if (pictureBoxSnap.Image != null)
            {
                if (btn == true)
                {
                    if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
                    {
                        e.Graphics.DrawRectangle(pen, Rect);
                    }
                }
            }
        }

        private void pictureBoxSnap_MouseMove(object sender, MouseEventArgs e)
        {
            if (btn == true)
            {
            if (e.Button == MouseButtons.Left)
                return;
            Point tempEndPoint = e.Location;
            Rect.Location = new Point(
                Math.Min(RectStartPoint.X, tempEndPoint.X),
                Math.Min(RectStartPoint.Y, tempEndPoint.Y));
            Rect.Size = new Size(
                Math.Abs(RectStartPoint.X - tempEndPoint.X),
                Math.Abs(RectStartPoint.Y - tempEndPoint.Y));

                pictureBoxSnap.Invalidate();
            }
        }

        private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
        {
            btn = !btn;
        }

我想做的是两件事:

  1. 当我第一次单击鼠标左键时,RectStartPoint XY 应该是鼠标光标所在的位置。然后我移动鼠标,矩形变大或变小,然后当我再次单击鼠标左键时,将矩形保持在最后一个鼠标光标所在的大小上。我该怎么办? 现在它一直从 0,0 开始,RectStartPoint 将是 0,0 如果我将其更改为 e.Location.XY 而不是 RectStartPoint它不会画任何东西。

  2. 第二件事是当我第一次单击鼠标左键并更改矩形大小时,如果我将继续移动鼠标并同时再次单击鼠标左键,矩形将消失/删除。如果我不移动鼠标,只需左键单击按钮,矩形将保持不变。为什么我在删除矩形的同时移动鼠标并单击左键?

【问题讨论】:

  • 您应该将鼠标的位置存储到MouseDown 中的类级别变量(属性)中,并在MouseMove 事件中作为起点使用它作为起点
  • bansi 这正在工作,感谢存储,它工作得很好。第二个问题或者如果我在快速绘制/显示矩形时移动鼠标并单击鼠标左键矩形消失/删除,这可能是正常的。那是什么?如果我绘制矩形并再次缓慢单击鼠标左键,则矩形保持原样。但是,如果我在快速移动鼠标时单击鼠标左键,则矩形将被删除。
  • 我从未尝试在鼠标移动事件上绘图,pictureBoxSnap.Invalidate(); 重绘图片框。我通常会在pictureBoxSnapPaint 事件中绘制矩形。我只想存储矩形点,是否需要在MouseMove 事件中绘制矩形而不是绘制。
  • bansi 自己的绘制已经在绘制事件中了。如果我从移动事件中删除无效,那么它将永远不会到达绘画事件。我应该在哪里放置/添加图片框的无效?
  • if (Rect != null && Rect.Width > 0 && Rect.Height > 0) 在您单击而不移动后阻止绘图。现在,当您这样做时应该会发生什么?矩形应该消失,它应该改变还是什么都不发生?

标签: c# winforms


【解决方案1】:

我不太确定你想从你的问题中得到什么。下面的代码执行了经典的橡皮筋:绘制一个活动矩形,并在您单击而不移动时将其删除。

我把计算放在一个灵活的函数中。

bool btn = false;
Point RectStartPoint = Point.Empty;
Point RectEndPoint = Point.Empty;

private void pictureBoxSnap_Paint(object sender, PaintEventArgs e)
{
    if (pictureBoxSnap.Image != null)
    {
        {
            Rectangle Rect = getRect(RectStartPoint, RectEndPoint); ;
            if (Rect != Rectangle.Empty)
            {
                e.Graphics.DrawRectangle(Pens.Firebrick, Rect);
            }
        }
    }
}

private void pictureBoxSnap_MouseMove(object sender, MouseEventArgs e)
{
    if (btn == true)
    {
        RectEndPoint = e.Location;
        pictureBoxSnap.Invalidate();
    }
}

private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
{
    RectStartPoint = e.Location;
    btn = true;
}

private void pictureBoxSnap_MouseUp(object sender, MouseEventArgs e)
{
    btn = false;
    RectEndPoint = e.Location;
    pictureBoxSnap.Invalidate();
}

Rectangle getRect(Point p1, Point p2)
{
    Point p = new Point(Math.Min(p1.X, p2.X),Math.Min(p1.Y, p2.Y) );
    Size s = new Size(Math.Abs(p1.X - p2.X), Math.Abs(p1.Y - p2.Y));
    return new Rectangle(p, s);
}

注意 1:PictureBox 控件已经是双缓冲的,所以无论你画得多快或多大,它都不会闪烁。

注意 2:您可能需要更彻底地检查鼠标按钮是否可以参与右(或中)按钮。以下是“正确”检查的示例:

if (e.Button & MouseButtons.Left != MouseButtons.None)  ..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多