これは少し古いですが、これはこの種のタスクの最初の(そして私が見つけた限りでは唯一の有用な)結果です。
上記のサンプルを使用して、テスト済みのソリューションを強化および実装しました。私の場合、長方形を厳密に別の長方形内に配置したかったのです。具体的には、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();
}
}