private void OwnedForm_Resizing(object sender, ResizeEventArgs e) { if (m_snapGrid != null) { m_snapGrid.SnapWhileResizing(e, ref m_rectangleBeforeSizeMove, MaxSnapDistance, InsensitiveBorderEndLength); } }
private void MdiChild_Resizing(object sender, ResizeEventArgs e) { if (m_snapGrid != null) { // Check if the MDI client rectangle changed during move/resize, because the client area may show or hide scrollbars during sizing/moving of the window. CheckUpdateSizeMove(); m_snapGrid.SnapWhileResizing(e, ref m_rectangleBeforeSizeMove, MaxSnapDistance, InsensitiveBorderEndLength); } }
protected override void WndProc(ref Message m) { if (m.Msg == WM.SIZING) { // Marshal the size/move rectangle from the message. RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); var e = new ResizeEventArgs(rc, (ResizeMode)m.WParam.ToInt32()); OnResizing(e); // Marshal back the result. Marshal.StructureToPtr(e.MoveResizeRect, m.LParam, true); } else if (m.Msg == WM.MOVING) { // Marshal the size/move rectangle from the message. RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); // Add displacement resulting from continuous updates by OnMoving(). rc.Left += m_displacement.X; rc.Top += m_displacement.Y; rc.Right += m_displacement.X; rc.Bottom += m_displacement.Y; var e = new MoveResizeEventArgs(rc); OnMoving(e); // Calculate new displacement for the next WndProc() iteration. m_displacement.X = rc.Left - e.MoveResizeRect.Left; m_displacement.Y = rc.Top - e.MoveResizeRect.Top; // Marshal back the result. Marshal.StructureToPtr(e.MoveResizeRect, m.LParam, true); } base.WndProc(ref m); }
/// <summary> /// Modifies a <see cref="ResizeEventArgs"/> so a window will snap to segments /// defined in this <see cref="SnapGrid"/> while it's being resized. /// </summary> /// <param name="e"> /// The <see cref="ResizeEventArgs"/> to modify. /// </param> /// <param name="rectangleBeforeSizeMove"> /// The bounds of the rectangle of the window before it was being resized. /// </param> /// <param name="maxSnapDistance"> /// The maximum distance from a line segment within which the window will snap to a line segment. /// </param> /// <param name="cutoff"> /// The length to cut off both ends of line segments representing the edges of the window being resized. /// </param> public void SnapWhileResizing(ResizeEventArgs e, ref Rectangle rectangleBeforeSizeMove, int maxSnapDistance, int cutoff) { // Evaluate left/right borders, then top/bottom borders. // Initialize snap threshold. int snapThresholdX = maxSnapDistance + 1; switch (e.ResizeMode) { case ResizeMode.Left: case ResizeMode.TopLeft: case ResizeMode.BottomLeft: LineSegment leftBorder = LeftEdge(ref e.MoveResizeRect, cutoff); if (null != leftBorder) { foreach (LineSegment verticalSegment in VerticalSegments) { if (leftBorder.SnapSensitive(ref snapThresholdX, verticalSegment)) { // Snap left border, preserve original location of right border of the rectangle. e.MoveResizeRect.Left = verticalSegment.Position; e.MoveResizeRect.Right = rectangleBeforeSizeMove.Right; } } } break; case ResizeMode.Right: case ResizeMode.TopRight: case ResizeMode.BottomRight: LineSegment rightBorder = RightEdge(ref e.MoveResizeRect, cutoff); if (null != rightBorder) { foreach (LineSegment verticalSegment in VerticalSegments) { if (rightBorder.SnapSensitive(ref snapThresholdX, verticalSegment)) { // Snap right border, preserve original location of left border of the rectangle. e.MoveResizeRect.Left = rectangleBeforeSizeMove.Left; e.MoveResizeRect.Right = verticalSegment.Position; } } } break; } // Initialize snap threshold. int snapThresholdY = maxSnapDistance + 1; switch (e.ResizeMode) { case ResizeMode.Top: case ResizeMode.TopLeft: case ResizeMode.TopRight: LineSegment topBorder = TopEdge(ref e.MoveResizeRect, cutoff); if (null != topBorder) { foreach (LineSegment horizontalSegment in HorizontalSegments) { if (topBorder.SnapSensitive(ref snapThresholdY, horizontalSegment)) { // Snap top border, preserve original location of bottom border of the rectangle. e.MoveResizeRect.Top = horizontalSegment.Position; e.MoveResizeRect.Bottom = rectangleBeforeSizeMove.Bottom; } } } break; case ResizeMode.Bottom: case ResizeMode.BottomLeft: case ResizeMode.BottomRight: LineSegment bottomBorder = BottomEdge(ref e.MoveResizeRect, cutoff); if (null != bottomBorder) { foreach (LineSegment horizontalSegment in HorizontalSegments) { if (bottomBorder.SnapSensitive(ref snapThresholdY, horizontalSegment)) { // Snap bottom border, preserve original location of top border of the rectangle. e.MoveResizeRect.Top = rectangleBeforeSizeMove.Top; e.MoveResizeRect.Bottom = horizontalSegment.Position; } } } break; } }
/// <summary> /// Raises the <see cref="Resizing"/> event. /// </summary> /// <param name="e"> /// The <see cref="ResizeEventArgs"/> containing the event data. /// </param> protected virtual void OnResizing(ResizeEventArgs e) => Resizing?.Invoke(this, e);