using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics; namespace AnimatedTransform
{
static class FormTransform
{
public static void TransformSize(Form frm, int newWidth, int newHeight)
{
TransformSize(frm, new Size(newWidth, newHeight));
} public static void TransformSize(Form frm, Size newSize)
{
ParameterizedThreadStart threadStart = new ParameterizedThreadStart(RunTransformation);
Thread transformThread = new Thread(threadStart);
transformThread.Start(new object[] { frm, newSize });
} private delegate void RunTransformationDelegate(object paramaters);
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);
} private static bool IsHeightOff(int currentHeight, int targetHeight, int step)
{
//目标高度与当前高度是否在步长之内,假设是,返回false
if (Math.Abs(currentHeight - targetHeight) <= Math.Abs(step)) return false; return (step > 0 && currentHeight < targetHeight) ||
(step < 0 && currentHeight > targetHeight);
}
}
}
调用方法:
Random random = new Random();
int width = random.Next(100, 500);//随机数产生窗口的宽
int height = random.Next(50, 800);//随机数产生窗口的高
FormTransform.TransformSize(this, width, height);

WinForm 窗口缩放动画效果的更多相关文章

  1. UILabel的缩放动画效果

    UILabel的缩放动画效果 效果图 源码 https://github.com/YouXianMing/Animations // // ScaleLabel.h // Animations // ...

  2. AndroidUI 视图动画-缩放动画效果 (ScaleAnimation)

    放动画效果,可以使用ScaleAnimation: <Button android:id="@+id/btnScale2" android:layout_width=&quo ...

  3. Android动画效果之Tween Animation(补间动画)

    前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...

  4. Android 动画效果 及 自定义动画

    1. View动画-透明动画效果2. View动画-旋转动画效果3. View动画-移动动画效果4. View动画-缩放动画效果5. View动画-动画效果混合6. View动画-动画效果侦听7. 自 ...

  5. AndroidUI 布局动画-为列表添加布局动画效果

    新建一个Android project ,使MainActivity 继承自 ListActivity: public class MainActivity extends ListActivity ...

  6. AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听

    在前面介绍了几种动画效果:透明动画效果(AlphsAnimation).移动动画效果(TranslateAnimation).旋转动画效果(RotateAnimation).缩放动画效果(ScaleA ...

  7. Swift - UITableView展开缩放动画

    Swift - UITableView展开缩放动画 效果 源码 https://github.com/YouXianMing/Swift-Animations // // HeaderViewTapA ...

  8. POP缩放动画

    POP缩放动画 效果 源码 https://github.com/YouXianMing/Animations // // SpringScaleViewController.m // Animati ...

  9. UITableView的headerView展开缩放动画

    UITableView的headerView展开缩放动画 效果 源码 https://github.com/YouXianMing/Animations // // HeaderViewTapAnim ...

随机推荐

  1. Coding.net简单使用指南

    注意:大家创建项目时一定要选择创建公开仓库!不然别人看不到! Coding.net是一个代码托管平台,简单来说这东西就是一个你在线存放代码的地方. 至于为什么要把代码存到这东西上呢?很多好处,比如防丢 ...

  2. RxSwift 系列(九)

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  3. Python中yield和yield from的用法

    yield python中yield的用法很像return,都是提供一个返回值,但是yield和return的最大区别在于,return一旦返回,则代码段执行结束,但是yield在返回值以后,会交出C ...

  4. FastReport.Net使用:[9]多栏报表(多列报表)

    方法一:使用页的列属性(Page Columns) 1.绘制报表标题 2.设置页的列数量为3,其他默认不变.报表设计界面便如下呈现. 3.报表拷贝前面[分组]报表的内容. 4.就这么简单,一张多栏报表 ...

  5. android studio 可以汉化的 文件 地方

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...

  6. 前缀和:CodeForces 932B Recursive Queries

    Description Let us define two functions f and g on positive integer numbers. You need to process Q q ...

  7. [BZOJ4870][六省联考2017]组合数问题(组合数动规)

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 748  Solved: 398[Submit][Statu ...

  8. [MVC4]Data Annotations Extensions:无法使用EmailAddress等验证特性的解决方法

    本文地址:http://www.cnblogs.com/egger/p/3404159.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑! 数据注解(Data Annotations) Web应用 ...

  9. asp.net url传值,弹窗

    一,<a>标签链接式传值 1, <a href="News_list.aspx?ClassID=<%#((DataRowView)Container.DataItem ...

  10. java同步ldap实例

    1.准备过程 1.1  在windows server 2008 R2操作系统下搭建AD域,不懂得看链接地址:http://99532720.blog.51cto.com/2194488/696611 ...