예제 #1
0
        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;
        }