private void Resize(Point p) { p = originalForm.PointToScreen(p); Screen activeScr = Screen.FromPoint(p); formRect = originalForm.Bounds; int iRight = formRect.Right; int iBottom = formRect.Bottom; // no normalize required // first strech the window to the new position if (resizeDirection.HasFlag(ResizeDir.Left)) { formRect.Width = formRect.X - p.X + formRect.Width; formRect.X = iRight - formRect.Width; } if (resizeDirection.HasFlag(ResizeDir.Right)) { formRect.Width = p.X - formRect.Left; } if (resizeDirection.HasFlag(ResizeDir.Top)) { formRect.Height = formRect.Height - p.Y + formRect.Top; formRect.Y = iBottom - formRect.Height; } if (resizeDirection.HasFlag(ResizeDir.Bottom)) { formRect.Height = p.Y - formRect.Top; } // this is the real new position // now, try to snap it to different objects (first to screen) // CARE !!! We use "Width" and "Height" as Bottom & Right!! (C++ style) //formOffsetRect = new Rectangle ( stickGap + 1, stickGap + 1, 0, 0 ); formOffsetRect.X = stickGap + 1; formOffsetRect.Y = stickGap + 1; formOffsetRect.Height = 0; formOffsetRect.Width = 0; if (stickToScreen) { Resize_Stick(activeScr.WorkingArea, false); } if (stickToOther) { // now try to stick to other forms foreach (Form sw in GlobalStickyWindows) { if (sw != this.originalForm) { Resize_Stick(sw.Bounds, true); } } } // Fix (clear) the values that were not updated to stick if (formOffsetRect.X == stickGap + 1) { formOffsetRect.X = 0; } if (formOffsetRect.Width == stickGap + 1) { formOffsetRect.Width = 0; } if (formOffsetRect.Y == stickGap + 1) { formOffsetRect.Y = 0; } if (formOffsetRect.Height == stickGap + 1) { formOffsetRect.Height = 0; } // compute the new form size if (resizeDirection.HasFlag(ResizeDir.Left)) { // left resize requires special handling of X & Width acording to MinSize and MinWindowTrackSize int iNewWidth = formRect.Width + formOffsetRect.Width + formOffsetRect.X; if (originalForm.MaximumSize.Width != 0) { iNewWidth = Math.Min(iNewWidth, originalForm.MaximumSize.Width); } iNewWidth = Math.Min(iNewWidth, SystemInformation.MaxWindowTrackSize.Width); iNewWidth = Math.Max(iNewWidth, originalForm.MinimumSize.Width); iNewWidth = Math.Max(iNewWidth, SystemInformation.MinWindowTrackSize.Width); formRect.X = iRight - iNewWidth; formRect.Width = iNewWidth; } else { // other resizes formRect.Width += formOffsetRect.Width + formOffsetRect.X; } if (resizeDirection.HasFlag(ResizeDir.Top)) { int iNewHeight = formRect.Height + formOffsetRect.Height + formOffsetRect.Y; if (originalForm.MaximumSize.Height != 0) { iNewHeight = Math.Min(iNewHeight, originalForm.MaximumSize.Height); } iNewHeight = Math.Min(iNewHeight, SystemInformation.MaxWindowTrackSize.Height); iNewHeight = Math.Max(iNewHeight, originalForm.MinimumSize.Height); iNewHeight = Math.Max(iNewHeight, SystemInformation.MinWindowTrackSize.Height); formRect.Y = iBottom - iNewHeight; formRect.Height = iNewHeight; } else { // all other resizing are fine formRect.Height += formOffsetRect.Height + formOffsetRect.Y; } // Done !! originalForm.Bounds = formRect; }