| | |
| | | using DevExpress.XtraBars.Docking; |
| | | using DevExpress.XtraEditors; |
| | | using DevExpress.XtraEditors; |
| | | using DevExpress.XtraRichEdit.Model; |
| | | using Gs.DevApp.ToolBox; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | |
| | | { |
| | | public partial class XtraForm1 : DevExpress.XtraEditors.XtraForm |
| | | { |
| | | |
| | | private bool isDragging = false; |
| | | private Point dragCursorPoint; |
| | | private Point dragPanelPoint; |
| | | |
| | | private Gs.DevApp.ToolBox.DragResizeHelp _drapHelp; |
| | | 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); |
| | | // this.xtraTabControl1.CustomHeaderButtonClick += new DevExpress.XtraTab.ViewInfo.CustomHeaderButtonEventHandler(this.xtraTabControl1_CustomHeaderButtonClick); |
| | | _drapHelp = new DragResizeHelp(this, splitContainerControl1.Panel1, labelControl2); |
| | | } |
| | | private void DraggablePanel_MouseDown(object sender, MouseEventArgs e) |
| | | |
| | | private void xtraTabControl1_CustomHeaderButtonClick(object sender, DevExpress.XtraTab.ViewInfo.CustomHeaderButtonEventArgs e) |
| | | { |
| | | if (e.Button == MouseButtons.Left) |
| | | { |
| | | isDragging = true; |
| | | dragCursorPoint = Cursor.Position; |
| | | dragPanelPoint = panTuo.Location; |
| | | panTuo.Cursor = Cursors.SizeAll; |
| | | |
| | | } |
| | | _drapHelp.Show(); |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |