Как сделать инструмент выделения в C # - PullRequest
5 голосов
/ 09 февраля 2012

Скачать проект

Я пытаюсь создать панель с цветом фона, который можно будет рисовать во время выполнения, когда пользователь удерживает левую кнопку мыши и перемещает ее,Все работы находят, когда пользователь начинает с верхнего левого угла и идет к нижнему правому, как показано на рисунке:

Но я хочу, чтобы пользователь мог сделать панель снизу справа вверху слева.Так же, как когда вы выбираете что-то на своем компьютере с помощью мыши

Le Image

Вот мой код на данный момент:

public void parent_MouseMove(object sender, MouseEventArgs e)
{
  if (e.Button == System.Windows.Forms.MouseButtons.Left)
  {
    Point tempLoc = e.Location;
    this.Location = new Point
    (
      Math.Min(this.Location.X, tempLoc.X),
      Math.Min(this.Location.Y, tempLoc.Y)
    );

    this.Size = new Size
    (
      Math.Abs(this.Location.X - tempLoc.X),
      Math.Abs(this.Location.Y - tempLoc.Y)
    );

    this.Invalidate();
  }
}

Я думаю, что это то, куда я идунеправильно, и я просто не могу найти правильный алгоритм для него:

this.Size = new Size
(
  Math.Abs(this.Location.X - tempLoc.X),
  Math.Abs(this.Location.Y - tempLoc.Y)
);

Но если я использую прямоугольник, он работает нормально, но я хочу, чтобы моя панель тоже могла это делать.

1 Ответ

3 голосов
/ 09 февраля 2012

Вам нужно просто проверить минимумы и максимумы вашей начальной точки в сравнении с вашей точкой перемещения мыши.Проблема с кодом заключается в том, что вы используете контрольное местоположение в качестве отправной точки, но если вы перемещаете мышь из нижнего правого угла в верхний левый, ваше местоположение должно измениться.Элемент управления не может иметь отрицательный размер.

Вот как я переписал его (я удалил ненужные вещи для тестирования):

public class SelectionTool : Panel {
  Form parent;
  Point _StartingPoint;

  public SelectionTool(Form parent, Point startingPoint) {
    this.DoubleBuffered = true;
    this.Location = startingPoint;

    //this.endingPoint = startingPoint;
    _StartingPoint = startingPoint;

    this.parent = parent;
    this.parent.Controls.Add(this);
    this.parent.MouseMove += new MouseEventHandler(parent_MouseMove);
    this.BringToFront();
    this.Size = new Size(0, 0);
  }

  public void parent_MouseMove(object sender, MouseEventArgs e) {
    if (e.Button == MouseButtons.Left) {
      int minX = Math.Min(e.Location.X, _StartingPoint.X);
      int minY = Math.Min(e.Location.Y, _StartingPoint.Y);
      int maxX = Math.Max(e.Location.X, _StartingPoint.X);
      int maxY = Math.Max(e.Location.Y, _StartingPoint.Y);
      this.SetBounds(minX, minY, maxX - minX, maxY - minY);

      this.Invalidate();
    }
  }

  protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    this.BackColor = Color.Blue;
  }
}

Вот код, который я использовал для проверкиэто по форме:

private SelectionTool _SelectPanel = null;

private void Form1_MouseMove(object sender, MouseEventArgs e) {
  if (e.Button == System.Windows.Forms.MouseButtons.Left) {
    if (_SelectPanel == null)
      _SelectPanel = new SelectionTool(this, e.Location);
  }
}

private void Form1_MouseUp(object sender, MouseEventArgs e) {
  if (_SelectPanel != null) {
    _SelectPanel.Dispose();
    _SelectPanel = null;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...