예제 #1
0
            private void AnimateWindow(bool show)
            {
                if (!FlagAnimate && Visible != show)
                {
                    Visible = show;
                    return;
                }

                Parent.SuspendLayout();

                Rectangle rectSource = GetRectangle(!show);
                Rectangle rectTarget = GetRectangle(show);
                int       dxLoc, dyLoc;
                int       dWidth, dHeight;

                dxLoc = dyLoc = dWidth = dHeight = 0;
                if (DockState == DockState.DockTopAutoHide)
                {
                    dHeight = show ? 1 : -1;
                }
                else if (DockState == DockState.DockLeftAutoHide)
                {
                    dWidth = show ? 1 : -1;
                }
                else if (DockState == DockState.DockRightAutoHide)
                {
                    dxLoc  = show ? -1 : 1;
                    dWidth = show ? 1 : -1;
                }
                else if (DockState == DockState.DockBottomAutoHide)
                {
                    dyLoc   = (show ? -1 : 1);
                    dHeight = (show ? 1 : -1);
                }

                if (show)
                {
                    Bounds = DockPanel.GetAutoHideWindowBounds(new Rectangle(-rectTarget.Width, -rectTarget.Height, rectTarget.Width, rectTarget.Height));
                    if (Visible == false)
                    {
                        Visible = true;
                    }
                    PerformLayout();
                }

                SuspendLayout();

                LayoutAnimateWindow(rectSource);
                if (Visible == false)
                {
                    Visible = true;
                }

                int speedFactor = 1;
                int totalPixels = (rectSource.Width != rectTarget.Width) ?
                                  Math.Abs(rectSource.Width - rectTarget.Width) :
                                  Math.Abs(rectSource.Height - rectTarget.Height);
                int      remainPixels = totalPixels;
                DateTime startingTime = DateTime.Now;

                while (rectSource != rectTarget)
                {
                    DateTime startPerMove = DateTime.Now;

                    rectSource.X      += dxLoc * speedFactor;
                    rectSource.Y      += dyLoc * speedFactor;
                    rectSource.Width  += dWidth * speedFactor;
                    rectSource.Height += dHeight * speedFactor;
                    if (Math.Sign(rectTarget.X - rectSource.X) != Math.Sign(dxLoc))
                    {
                        rectSource.X = rectTarget.X;
                    }
                    if (Math.Sign(rectTarget.Y - rectSource.Y) != Math.Sign(dyLoc))
                    {
                        rectSource.Y = rectTarget.Y;
                    }
                    if (Math.Sign(rectTarget.Width - rectSource.Width) != Math.Sign(dWidth))
                    {
                        rectSource.Width = rectTarget.Width;
                    }
                    if (Math.Sign(rectTarget.Height - rectSource.Height) != Math.Sign(dHeight))
                    {
                        rectSource.Height = rectTarget.Height;
                    }

                    LayoutAnimateWindow(rectSource);
                    if (Parent != null)
                    {
                        Parent.Update();
                    }

                    remainPixels -= speedFactor;

                    while (true)
                    {
                        TimeSpan time           = new TimeSpan(0, 0, 0, 0, ANIMATE_TIME);
                        TimeSpan elapsedPerMove = DateTime.Now - startPerMove;
                        TimeSpan elapsedTime    = DateTime.Now - startingTime;
                        if (((int)((time - elapsedTime).TotalMilliseconds)) <= 0)
                        {
                            speedFactor = remainPixels;
                            break;
                        }
                        else
                        {
                            speedFactor = remainPixels * (int)elapsedPerMove.TotalMilliseconds / (int)((time - elapsedTime).TotalMilliseconds);
                        }
                        if (speedFactor >= 1)
                        {
                            break;
                        }
                    }
                }
                ResumeLayout();
                Parent.ResumeLayout();
            }