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);
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        /// <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;
            }
        }
Esempio n. 5
0
 /// <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);