using DevExpress.XtraBars.Docking;
|
using DevExpress.XtraEditors;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
|
namespace Gs.DevApp.DevFrm
|
{
|
public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm
|
{
|
|
private bool isDragging = false;
|
private Point dragCursorPoint;
|
private Point dragPanelPoint;
|
|
public XtraForm1()
|
{
|
InitializeComponent();
|
// 初始化表单
|
this.Text = "Draggable Panel Example";
|
this.Size = new Size(800, 600);
|
|
// 添加鼠标事件处理程序
|
panTuo.MouseDown += new MouseEventHandler(DraggablePanel_MouseDown);
|
panTuo.MouseMove += new MouseEventHandler(DraggablePanel_MouseMove);
|
panTuo.MouseUp += new MouseEventHandler(DraggablePanel_MouseUp);
|
}
|
private void DraggablePanel_MouseDown(object sender, MouseEventArgs e)
|
{
|
if (e.Button == MouseButtons.Left)
|
{
|
isDragging = true;
|
dragCursorPoint = Cursor.Position;
|
dragPanelPoint = panTuo.Location;
|
panTuo.Cursor = Cursors.SizeAll;
|
|
}
|
}
|
|
private void DraggablePanel_MouseMove(object sender, MouseEventArgs e)
|
{
|
if (isDragging)
|
{
|
|
panTuo.Location = new Point(
|
dragPanelPoint.X + Cursor.Position.X - dragCursorPoint.X,
|
dragPanelPoint.Y + Cursor.Position.Y - dragCursorPoint.Y);
|
Point newLocation = panTuo.Location;
|
Rectangle bounds = panelControl1.Bounds;
|
lbMsg.Text = panTuo.Location.ToString() + "-" + bounds.ToString();
|
|
if (IsOutsideBounds(panTuo, panelControl1))
|
{
|
lbMsg.Text = "超了";
|
panelControl1.Controls.Remove(panTuo);
|
dockPanel1.Controls.Add(panTuo);
|
|
panTuo.Location = new Point(
|
Math.Max(0, Math.Min(dockPanel1.Width - panTuo.Width, newLocation.X - dockPanel1.Location.X)),
|
Math.Max(0, Math.Min(dockPanel1.Height - panTuo.Height, newLocation.Y - dockPanel1.Location.Y)));
|
}
|
else
|
{
|
lbMsg.Text = panTuo.Location.ToString() + "-" + bounds.ToString();
|
}
|
}
|
|
|
}
|
public static bool IsOutsideBounds(Control child, Control parent)
|
{
|
// 获取控件相对于其父容器的位置和大小
|
Rectangle childBounds = new Rectangle(child.Location, child.Size);
|
Rectangle parentBounds = new Rectangle(Point.Empty, parent.ClientSize); // 使用ClientSize获取容器的工作区大小
|
|
// 注意:这里我们假设child是parent的直接子控件,因此child.Location是相对于parent的。
|
// 如果child不是parent的直接子控件,你需要先找到child相对于parent的相对位置。
|
|
// 检查childBounds是否超出了parentBounds的任何一个边界
|
return !parentBounds.Contains(childBounds);
|
}
|
|
private void DraggablePanel_MouseUp(object sender, MouseEventArgs e)
|
{
|
if (e.Button == MouseButtons.Left)
|
{
|
isDragging = false;
|
}
|
}
|
|
|
}
|
|
}
|