WinForm窗体缩放动画

WinForm自带的窗体大小发生改变的时候,当内存不够的时候,会出现界面停滞的现象,会出现许多的条条纹纹,给人很不好的感觉,这里提供一个WinForm窗体缩放时会有一个渐变的动画效果给大家。

思路是这样的,在特定的时间段内,如果缩放的宽度的距离不在步骤之内,则逐渐逐渐增加宽度,以达到动画的效果。

 

主要的代码如下:

代码
private static void RunTransformation(object parameters)
        {
            Form frm 
= (Form)((object[])parameters)[0];
            
if (frm.InvokeRequired)
            {
                RunTransformationDelegate del 
= new RunTransformationDelegate(RunTransformation);
                frm.Invoke(del, parameters);
            }
            
else
            {
                
//动画的变量参数
                double FPS = 300.0;
                
long interval = (long)(Stopwatch.Frequency / FPS);
                
long ticks1 = 0;
                
long ticks2 = 0;

                
//传进来的新的窗体的大小
                Size size = (Size)((object[])parameters)[1];

                
int xDiff = Math.Abs(frm.Width - size.Width);
                
int yDiff = Math.Abs(frm.Height - size.Height);

                
int step = 10;

                
int xDirection = frm.Width < size.Width ? 1 : -1;
                
int yDirection = frm.Height < size.Height ? 1 : -1;

                
int xStep = step * xDirection;
                
int yStep = step * yDirection;

                
//要调整的窗体的宽度是否在步长之内
                bool widthOff = IsWidthOff(frm.Width, size.Width, xStep);
                
//要调整的窗体的高度是否在步长之内
                bool heightOff = IsHeightOff(frm.Height, size.Height, yStep);


                
while (widthOff || heightOff)
                {
                    
//获取当前的时间戳
                    ticks2 = Stopwatch.GetTimestamp();
                    
//允许调整大小仅在有足够的时间来刷新窗体的时候
                    if (ticks2 >= ticks1 + interval) 
                    {
                        
//调整窗体的大小
                        if (widthOff)
                            frm.Width 
+= xStep;

                        
if (heightOff)
                            frm.Height 
+= yStep;

                        widthOff 
= IsWidthOff(frm.Width, size.Width, xStep);
                        heightOff 
= IsHeightOff(frm.Height, size.Height, yStep);

                        
//允许窗体刷新
                        Application.DoEvents();

                        
//保存当前的时间戳
                        ticks1 = Stopwatch.GetTimestamp();
                    }

                    Thread.Sleep(
1);
                }

            }
        }


目标宽度与当前宽度是否在步长之内
代码
private static bool IsWidthOff(int currentWidth, int targetWidth, int step)
        {
            
//目标宽度与当前宽度是否在步长之内,如果是,返回false
            if (Math.Abs(currentWidth - targetWidth) <= Math.Abs(step)) return false;

            
return (step > 0 && currentWidth < targetWidth) ||
                   (step 
< 0 && currentWidth > targetWidth); 
        }


 源代码下载 :

 

posted @ 2011-01-18 22:29  Alexis  阅读(5188)  评论(13编辑  收藏  举报