winform中间画一个方框,鼠标移到方框四点會有小方框可以進行放大縮小方框
时间: 2024-04-29 22:21:37 浏览: 10
你可以通过以下步骤在 WinForms 中实现该功能:
1. 在窗体上添加一个 Panel 控件,设置其 Dock 属性为 Fill,以使其充满整个窗体。
2. 在 Panel 控件上重载 OnPaint 方法,在 OnPaint 方法中使用 Graphics 对象绘制一个矩形框。
3. 在 Panel 控件上订阅 MouseDown、MouseMove 和 MouseUp 事件。在 MouseDown 事件中记录鼠标点击位置,并判断是否在矩形框内。如果是,则设置一个标志位表示正在调整矩形框大小。在 MouseMove 事件中根据标志位判断是否需要调整矩形框大小,并更新矩形框的位置和大小。在 MouseUp 事件中取消标志位。
4. 在 Panel 控件上绘制四个小矩形框,分别表示矩形框的四个角。在 MouseMove 事件中判断鼠标是否在小矩形框内,如果是,则设置一个标志位表示正在调整矩形框大小。在 MouseUp 事件中取消标志位。
5. 在 MouseMove 事件中根据标志位判断是否需要调整小矩形框大小,并更新矩形框的位置和大小。
下面是示例代码:
```csharp
public partial class Form1 : Form
{
private Rectangle rect;
private bool isDragging;
private bool isResizing;
private Point startPoint;
private int resizeHandleSize = 8;
public Form1()
{
InitializeComponent();
rect = new Rectangle(100, 100, 200, 150);
panel1.Paint += Panel1_Paint;
panel1.MouseDown += Panel1_MouseDown;
panel1.MouseMove += Panel1_MouseMove;
panel1.MouseUp += Panel1_MouseUp;
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{
ControlPaint.DrawBorder(e.Graphics, rect, Color.Black, ButtonBorderStyle.Solid);
DrawResizeHandles(e.Graphics, rect);
}
private void Panel1_MouseDown(object sender, MouseEventArgs e)
{
if (rect.Contains(e.Location))
{
isDragging = true;
startPoint = e.Location;
}
else if (IsOverResizeHandle(e.Location))
{
isResizing = true;
startPoint = e.Location;
}
}
private void Panel1_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging)
{
int dx = e.Location.X - startPoint.X;
int dy = e.Location.Y - startPoint.Y;
rect.X += dx;
rect.Y += dy;
panel1.Invalidate();
startPoint = e.Location;
}
else if (isResizing)
{
int dx = e.Location.X - startPoint.X;
int dy = e.Location.Y - startPoint.Y;
if (IsOverTopLeftHandle(startPoint))
{
rect.X += dx;
rect.Width -= dx;
rect.Y += dy;
rect.Height -= dy;
}
else if (IsOverTopRightHandle(startPoint))
{
rect.Width += dx;
rect.Y += dy;
rect.Height -= dy;
}
else if (IsOverBottomLeftHandle(startPoint))
{
rect.X += dx;
rect.Width -= dx;
rect.Height += dy;
}
else if (IsOverBottomRightHandle(startPoint))
{
rect.Width += dx;
rect.Height += dy;
}
panel1.Invalidate();
startPoint = e.Location;
}
else if (IsOverResizeHandle(e.Location))
{
Cursor = Cursors.SizeNWSE;
}
else
{
Cursor = Cursors.Default;
}
}
private void Panel1_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
isResizing = false;
}
private bool IsOverResizeHandle(Point p)
{
return IsOverTopLeftHandle(p) || IsOverTopRightHandle(p) || IsOverBottomLeftHandle(p) || IsOverBottomRightHandle(p);
}
private bool IsOverTopLeftHandle(Point p)
{
return new Rectangle(rect.X - resizeHandleSize, rect.Y - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2).Contains(p);
}
private bool IsOverTopRightHandle(Point p)
{
return new Rectangle(rect.Right - resizeHandleSize, rect.Y - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2).Contains(p);
}
private bool IsOverBottomLeftHandle(Point p)
{
return new Rectangle(rect.X - resizeHandleSize, rect.Bottom - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2).Contains(p);
}
private bool IsOverBottomRightHandle(Point p)
{
return new Rectangle(rect.Right - resizeHandleSize, rect.Bottom - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2).Contains(p);
}
private void DrawResizeHandles(Graphics g, Rectangle rect)
{
g.FillRectangle(Brushes.White, new Rectangle(rect.X - resizeHandleSize, rect.Y - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2));
g.FillRectangle(Brushes.White, new Rectangle(rect.Right - resizeHandleSize, rect.Y - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2));
g.FillRectangle(Brushes.White, new Rectangle(rect.X - resizeHandleSize, rect.Bottom - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2));
g.FillRectangle(Brushes.White, new Rectangle(rect.Right - resizeHandleSize, rect.Bottom - resizeHandleSize, resizeHandleSize * 2, resizeHandleSize * 2));
}
}
```