public bool PreFilterMessage(ref Message m) { if (m.Msg == WM_KEYDOWN) { Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; if (keyCode == Keys.ControlKey) { if (!_ctrlDown && _dragged != null && IsDocked(_dragged)) { ToolBarDockArea docked = GetDockedArea(_dragged); docked.SuspendLayout(); _dragged.Parent = _dragged.FloatForm; _dragged.Location = new Point(0, 0); _dragged.DockStyle = DockStyle.None; _dragged.FloatForm.Visible = true; _dragged.FloatForm.Location = new Point(Control.MousePosition.X - _ptOffset.X, Control.MousePosition.Y - 8); _dragged.FloatForm.Size = _dragged.Size; docked.ResumeLayout(); docked.PerformLayout(); } _ctrlDown = true; } } else if (m.Msg == WM_KEYUP) { Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; if (keyCode == Keys.ControlKey) { if (_ctrlDown && _dragged != null && !IsDocked(_dragged)) { ToolBarDockArea closest = GetClosestArea(Control.MousePosition, _dragged.PreferredDockedArea); if (closest != null) { closest.SuspendLayout(); Point newLoc = closest.PointToClient(Control.MousePosition); _dragged.DockStyle = closest.Dock; _dragged.Parent = closest; _dragged.PreferredDockedLocation = newLoc; _dragged.FloatForm.Visible = false; _dragged.PreferredDockedArea = closest; closest.ResumeLayout(); closest.PerformLayout(); } } _ctrlDown = false; } } return(false); }
private void ToolBarMouseMove(object sender, MouseEventArgs e) { Point ptPos = new Point(e.X, e.Y); if (_dragged != null) { Point ptDelta = new Point(_ptStart.X - Control.MousePosition.X, _ptStart.Y - Control.MousePosition.Y); Point newLoc = _dragged.PointToScreen(new Point(0, 0)); newLoc = new Point(newLoc.X - ptDelta.X, newLoc.Y - ptDelta.Y); ToolBarDockArea closest = GetClosestArea(Control.MousePosition, _dragged.PreferredDockedArea); // Added by mav if (closest != null && !_dragged.IsAllowed(closest.Dock)) { closest = null; } ToolBarDockArea docked = GetDockedArea(_dragged); if (_ctrlDown) { closest = null; } if (docked != null) { if (closest == null) { docked.SuspendLayout(); _dragged.Parent = _dragged.FloatForm; _dragged.Location = new Point(0, 0); _dragged.DockStyle = DockStyle.None; _dragged.FloatForm.Visible = true; _dragged.FloatForm.Location = new Point(Control.MousePosition.X - _ptOffset.X, Control.MousePosition.Y - 8); _dragged.FloatForm.Size = _dragged.Size; docked.ResumeLayout(); docked.PerformLayout(); } else if (closest != docked) { closest.SuspendLayout(); newLoc = closest.PointToClient(Control.MousePosition); _dragged.DockStyle = closest.Dock; _dragged.Parent = closest; _dragged.PreferredDockedLocation = newLoc; _dragged.FloatForm.Visible = false; _dragged.PreferredDockedArea = closest; closest.ResumeLayout(); closest.PerformLayout(); } else { closest.SuspendLayout(); newLoc = closest.PointToClient(Control.MousePosition); // if(closest.Horizontal) // newLoc = new Point(newLoc.X - 4, newLoc.Y - _dragged.Height/2); // else // newLoc = new Point(newLoc.X - _dragged.Width/2, newLoc.Y - 4); _dragged.PreferredDockedLocation = newLoc; closest.ResumeLayout(); closest.PerformLayout(); } } else { if (closest == null) { _dragged.FloatForm.Location = newLoc; } else { closest.SuspendLayout(); newLoc = closest.PointToClient(Control.MousePosition); _dragged.DockStyle = closest.Dock; _dragged.Parent = closest; _dragged.PreferredDockedLocation = newLoc; _dragged.FloatForm.Visible = false; _dragged.PreferredDockedArea = closest; closest.ResumeLayout(); closest.PerformLayout(); } } _ptStart = Control.MousePosition; } }