WinForm窗体缩放动画

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

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

 

主要的代码如下:

ExpandedBlockStart.gif 代码
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 );
                }

            }
        }


目标宽度与当前宽度是否在步长之内
ExpandedBlockStart.gif 代码
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); 
        }


 源代码下载 :

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值