2

Windowsフォームの上に長方形を描画しましたが、提供されているハンドルの1つを使用してサイズを変更したいと思います。

ここに画像の説明を入力してください

Rectangle areaRect = new Rectangle(100,100, 300, 300);
Bool dragging = false;
Point ptOld = new Point(0, 0);

protected override void OnPaint(PaintEventArgs e)
{
  Graphics dcPaint = e.Graphics;
  dcPaint.DrawRectangle(rectPen, areaRect);
}

protected override void OnMouseDown(MouseEventArgs e)
{
  ptOld = new Point(e.X, e.Y);
  dragging = true;
}

protected override void OnMouseMove(MouseEventArgs e)
{
  if(dragging = true) 
  {
    Point ptNew = new Point(e.X, e.Y);
    Int32 handleSelected = GetSelectedHandle(ptNew);

   // Lets say I want to resize this rectangle using Handle 2 now.
    if(handleSelected == 2) 
    {
      // I am resizing this rectangle Width
      areaRect.X += ptNew.X - ptOld.X;
      areaRect.Width -= ptNew .X - ptOld.X;

      this.Invalidate();
    }
  }
}

protected override void OnMouseUp(MouseEventArgs e)
{
  dragging = false;
}

こんな効果が出ます。どちらが正しい、

ここに画像の説明を入力してください

ただし、これを少し調整したい場合は、この長方形の高さも変更したいと思います。ポイント2を移動するときは、ポイント7をそのままにしておく必要があります。ポイント4を移動すると、ポイント5もそのままになります。ポイント7と2についても同様です。

ここに画像の説明を入力してください

高さを変えるとポイント7の位置も変わるので、どうすればいいですか?

4

2 に答える 2

2

このような描画はMouseMove、WinFormsではあまりスムーズになりません。

サイズを変更する前に、基本的に長方形への参照が必要です。

長方形とドラッグ可能な8つのポイントを追跡するために、次のコードを追加しました。

private Point GetHandlePoint(int value) {
  Point result = Point.Empty;

  if (value == 1)
    result = new Point(areaRect.Left, areaRect.Top);
  else if (value == 2)
    result = new Point(areaRect.Left, areaRect.Top + (areaRect.Height / 2));
  else if (value == 3)
    result = new Point(areaRect.Left, areaRect.Bottom);
  else if (value == 4)
    result = new Point(areaRect.Left + (areaRect.Width / 2), areaRect.Top);
  else if (value == 5)
    result = new Point(areaRect.Left + (areaRect.Width / 2), areaRect.Bottom);
  else if (value == 6)
    result = new Point(areaRect.Right, areaRect.Top);
  else if (value == 7)
    result = new Point(areaRect.Right, areaRect.Top + (areaRect.Height / 2));
  else if (value == 8)
    result = new Point(areaRect.Right, areaRect.Bottom);

  return result;
}

private Rectangle GetHandleRect(int value) {
  Point p = GetHandlePoint(value);
  p.Offset(-2, -2);
  return new Rectangle(p, new Size(5, 5));
}

これが私があなたのフォームコードを作り直した方法です:

private Rectangle areaRect = new Rectangle(100, 100, 300, 300);
private Rectangle oldRect;
private int dragHandle = 0;
private Point dragPoint;

public Form1() {
  InitializeComponent();
  this.DoubleBuffered = true;
}

protected override void OnMouseDown(MouseEventArgs e) {
  for (int i = 1; i < 9; i++) {
    if (GetHandleRect(i).Contains(e.Location)) {
      dragHandle = i;
      oldRect = areaRect;
      dragPoint = GetHandlePoint(i);
    }
  }
  base.OnMouseDown(e);
}

protected override void OnMouseMove(MouseEventArgs e) {
  if (dragHandle == 1) {
    // to do
  } else if (dragHandle == 2) {
    int diff = dragPoint.X - e.Location.X;
    areaRect = new Rectangle(oldRect.Left - diff, oldRect.Top, oldRect.Width + diff, oldRect.Height);
  } else if (dragHandle == 7) {
    int diff = dragPoint.X - e.Location.X;
    areaRect = new Rectangle(oldRect.Left, oldRect.Top, oldRect.Width - diff, oldRect.Height);
  }

  if (dragHandle > 0)
    this.Invalidate();

  base.OnMouseMove(e);
}

protected override void OnMouseUp(MouseEventArgs e) {
  dragHandle = 0;
  base.OnMouseUp(e);
}

protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.DrawRectangle(Pens.Red, areaRect);
  for (int i = 1; i < 9; i++) {
    e.Graphics.FillRectangle(Brushes.DarkRed, GetHandleRect(i));
  }
  base.OnPaint(e);
}

投稿されたコードはポイント#2と#7のみを実行しますが、それはあなたに作業するためのいくつかのロジックを与えるはずです。このコードは改善できると確信しています。これは単なる実用的な例です。

于 2012-04-17T21:16:52.480 に答える
1

これは少し古いですが、これはこの種のタスクの最初の(そして私が見つけた限りでは唯一の有用な)結果です。

上記のサンプルを使用して、テスト済みのソリューションを強化および実装しました。私の場合、長方形を厳密に別の長方形内に配置したかったのです。具体的には、PictureBoxで描画していて、画像の外に出ないようにしたかったのです。これは、max_widthとmax_heightが対応するものです。

時々少しおかしいことに注意してください-特定の方向で最小サイズに達すると、反対方向にサイズが変更されます。私はその振る舞いが好きで、それが機能であるべきだと決めました。:)

protected void pictureBox1_OnMouseMove(object sender, MouseEventArgs e)
{
        // Where I started - where I stopped
        int x_diff = dragPoint.X - e.Location.X;
        int y_diff = dragPoint.Y - e.Location.Y;

        // Minimum values
        int small_offset = 5;
        int left = small_offset;
        int top = small_offset;
        int width = small_offset;
        int height = small_offset;

        // Max values
        int max_width = this.pictureBox1.Image.Width;
        int max_height = this.pictureBox1.Image.Height;

        if (dragHandle == 1)
        {
            left = Math.Max(oldRect.Left - x_diff, left);
            top = Math.Max(oldRect.Top - y_diff, top);
            width = Math.Min(Math.Max(oldRect.Width + x_diff, width), max_width - left - small_offset);
            height = Math.Min(Math.Max(oldRect.Height + y_diff, height), max_height - top - small_offset);
        }
        else if (dragHandle == 2)
        {
            left = Math.Max(oldRect.Left - x_diff, left);
            top = oldRect.Top;
            width = Math.Min(Math.Max(oldRect.Width + x_diff, width), max_width - left - small_offset);
            height = oldRect.Height;
        }
        else if (dragHandle == 3)
        {
            left = Math.Max(oldRect.Left - x_diff, left);
            top = oldRect.Top;
            width = Math.Min(Math.Max(oldRect.Width + x_diff, width), max_width - left - small_offset);
            height = Math.Min(Math.Max(oldRect.Height - y_diff, height), max_height - top - small_offset);
        }
        else if (dragHandle == 4)
        {
            left = oldRect.Left;
            top = Math.Max(oldRect.Top - y_diff, top);
            width = oldRect.Width;
            height = Math.Min(Math.Max(oldRect.Height + y_diff, height), max_height - top - small_offset);
        }
        else if (dragHandle == 5)
        {
            left = oldRect.Left;
            top = oldRect.Top;
            width = oldRect.Width;
            height = Math.Min(Math.Max(oldRect.Height - y_diff, height), max_height - top - small_offset);
        }
        else if (dragHandle == 6)
        {
            left = oldRect.Left;
            top = Math.Max(oldRect.Top - y_diff, top);
            width = Math.Min(Math.Max(oldRect.Width - x_diff, width), max_width - left - small_offset);
            height = Math.Min(Math.Max(oldRect.Height + y_diff, height), max_height - top - small_offset);
        }
        else if (dragHandle == 7)
        {
            left = oldRect.Left;
            top = oldRect.Top;
            width = Math.Min(Math.Max(oldRect.Width - x_diff, width), max_width - left - small_offset);
            height = oldRect.Height;

        }
        else if (dragHandle == 8)
        {
            left = oldRect.Left;
            top = oldRect.Top ;
            width = Math.Min(Math.Max(oldRect.Width - x_diff, width), max_width - left - small_offset);
            height = Math.Min(Math.Max(oldRect.Height - y_diff, height), max_height - top - small_offset);
        }


        if (dragHandle > 0)
        {
            areaRect = new Rectangle(left, top, width, height);
            this.Invalidate();
        }
}
于 2015-02-01T22:03:27.623 に答える