c# 窗体不能拖拽放大
时间: 2023-08-01 09:12:57 浏览: 65
要实现窗体的拖拽和放大功能,可以在窗体的MouseDown、MouseMove、MouseUp事件中编写相应的代码。下面是一个简单的示例代码,可以实现窗体的拖拽和放大功能。
```csharp
private const int WM_NCHITTEST = 0x0084;
private const int HTLEFT = 10;
private const int HTRIGHT = 11;
private const int HTTOP = 12;
private const int HTTOPLEFT = 13;
private const int HTTOPRIGHT = 14;
private const int HTBOTTOM = 15;
private const int HTBOTTOMLEFT = 16;
private const int HTBOTTOMRIGHT = 17;
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_SIZE = 0xF000;
private bool isDragging = false;
private Point lastLocation;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if (m.Result.ToInt32() == HTCLIENT)
{
Point mouseLocation = PointToClient(Cursor.Position);
if (mouseLocation.X <= 5)
m.Result = new IntPtr(HTLEFT);
else if (mouseLocation.X >= ClientSize.Width - 5)
m.Result = new IntPtr(HTRIGHT);
else if (mouseLocation.Y <= 5)
m.Result = new IntPtr(HTTOP);
else if (mouseLocation.Y >= ClientSize.Height - 5)
m.Result = new IntPtr(HTBOTTOM);
else if (mouseLocation.X <= 10 && mouseLocation.Y <= 10)
m.Result = new IntPtr(HTTOPLEFT);
else if (mouseLocation.X >= ClientSize.Width - 10 && mouseLocation.Y <= 10)
m.Result = new IntPtr(HTTOPRIGHT);
else if (mouseLocation.X <= 10 && mouseLocation.Y >= ClientSize.Height - 10)
m.Result = new IntPtr(HTBOTTOMLEFT);
else if (mouseLocation.X >= ClientSize.Width - 10 && mouseLocation.Y >= ClientSize.Height - 10)
m.Result = new IntPtr(HTBOTTOMRIGHT);
}
return;
case WM_SYSCOMMAND:
if (m.WParam.ToInt32() == SC_SIZE)
{
Point mouseLocation = PointToClient(Cursor.Position);
if (mouseLocation.X <= 5 || mouseLocation.X >= ClientSize.Width - 5)
m.WParam = new IntPtr((mouseLocation.Y <= 5) ? HTTOP : HTBOTTOM);
else if (mouseLocation.Y <= 5 || mouseLocation.Y >= ClientSize.Height - 5)
m.WParam = new IntPtr((mouseLocation.X <= 5) ? HTLEFT : HTRIGHT);
}
break;
}
base.WndProc(ref m);
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDragging = true;
lastLocation = e.Location;
}
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (isDragging)
{
Location = new Point(Location.X - lastLocation.X + e.X, Location.Y - lastLocation.Y + e.Y);
Update();
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
isDragging = false;
}
```
这段代码可以实现以下几个功能:
1. 实现窗体边框的拖拽调整大小功能;
2. 在窗体的左上角、右上角、左下角、右下角调整窗体大小时,鼠标会变成对应的调整大小的光标;
3. 实现窗体的拖拽移动功能。
你可以在窗体的MouseDown、MouseMove、MouseUp事件中分别调用上述代码实现窗体的拖拽和放大功能。