想在窗口加载、退出、显示、隐藏时实现淡入淡出的效果。我现在可以实现,但是方法不好,我想能否找到更好的实现方法。现在的方法:1,在加载、显示时用Timer来实现淡入;2,在退出、隐藏时调用自编循环函数实现淡出。两种方法不能混用,我理解是窗口淡入要求在窗口出现以后实现,淡出要求窗口消失之前实现,而Timer是滞后执行,函数是即时执行。这样做的缺点就是麻烦、复杂。我想找一种适用于各种情况的方法,谁知道能告诉我,非常感谢。

解决方案 »

  1.   

    或者直接用标签;比如<META content=RevealTrans(Duration=1,Transition=6) http-equiv=Page-Enter>
      

  2.   

    回hcb111(夏天25) :我的是windows应用程序,不是B/S编程啊
      

  3.   

    在load和close中写一段代码。修改窗体的透明度。中间用thread.sleep来进行延时
      

  4.   

    回fsdy2000(乡愁):你说的是实现淡出的方法,我已用到了,但是无法在load、show中有效。
      

  5.   

    private void MoveControl_Load(object sender, System.EventArgs e)
    {
    this.timer1.Enabled = true;
    this.timer1.Interval = 100;
    this.Opacity =0.5;
    } private void timer1_Tick(object sender, System.EventArgs e)
    {
    if(this.Opacity == 1)
    {
    this.timer1.Enabled = false;
    }
    this.Opacity += 0.1;
    }
    窗体的Opacity 属性.
      

  6.   

    show 和 load的时候都可以. 用Timer控件就可以了.
      

  7.   

    楼上方法就可以了。注意一点,更改Opacity属性可以修改透明度,需要之后执行一下me.Refresh来更新界面,否则看到就是黑色,直接跳到正常。
      

  8.   

    回Aallonlin(风之力):我只是说那种方法不适用于show和load。你说的是用Timer,我前面说过了,它不能用于退出、隐藏。
    各位:我是想找一种适合各种情况(加载、退出、显示、隐藏)的方法,不是仅对哪一种情况有效的方法。我不是无法实现效果,而是想找一种更好更简单更通用的实现方法。谢谢了
      

  9.   

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                timer1.Enabled = true;
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                this.Opacity += 0.01;
                this.progressBar1.Value++;
                if (this.Opacity >= 1)
                {
                    timer1.Enabled = false;
                    MessageBox.Show("窗体加载完成。确定后开始退出。");
                    this.Close();
                }
            }        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                while (this.Opacity > 0)
                {
                    this.Opacity -= 0.01;
                    progressBar1.Value--;
                    Application.DoEvents();
                }
            }
        }
      

  10.   

    using System.Runtime.InteropServices; private void Form2_Load(object sender, System.EventArgs e) 

    Win32.AnimateWindow(this.Handle,500, Win32.AW_BLEND); 

    public class Win32 

    public const Int32 AW_HOR_POSITIVE = 0x00000001; 
    public const Int32 AW_HOR_NEGATIVE = 0x00000002; 
    public const Int32 AW_VER_POSITIVE = 0x00000004; 
    public const Int32 AW_VER_NEGATIVE = 0x00000008; 
    public const Int32 AW_CENTER = 0x00000010; 
    public const Int32 AW_HIDE = 0x00010000; 
    public const Int32 AW_ACTIVATE = 0x00020000; 
    public const Int32 AW_SLIDE = 0x00040000; 
    public const Int32 AW_BLEND = 0x00080000; 
    [DllImport("user32.dll", CharSet=CharSet.Auto)] 
    public static extern bool AnimateWindow( 
    IntPtr hwnd, // handle to window 
    int dwTime, // duration of animation 
    int dwFlags // animation type 
    ); 

    1.AW_HOR_POSITIVE = $00000001; // 从左向右开屏
    2.AW_HOR_NEGATIVE = $00000002; // 从右向左开屏
    3.AW_VER_POSITIVE = $00000004; // 从上向下开屏
    4.AW_VER_NEGATIVE = $00000008; // 从下向上开屏
    5,AW_CENTER = $00000010; // 从中心向四周扩展,在关闭动画中则为从四周向中心收缩
    6.AW_HIDE = $00010000; // 关闭时候与前面的定义组合使用,如AW_HIDE or AW_CENTER
    7.AW_ACTIVATE = $00020000; // 与1-5组合,开屏使用
    8.AW_SLIDE = $00040000; // 与1-5 + 6/7 组合,产生滑行效果
    9.AW_BLEND = $00080000; // Win2000下使用,淡入淡出效果
      

  11.   

    楼上的不错。赞一个。退出的也有api么?
      

  12.   

    回wuyazhe(我的宝贝叫阿刺) :你的方法还是和我原来的一样,不过还是谢谢了。
    回zhgroup() :你的这个不是.Net中的方法吧?是VC++里的吧?
    看来大概没有通用的方法了。但还是得到一点启发,把程序修改了,稍微变简单了一点。
    这是我修改前的代码:
    int nTimeCount=0;
    int nTime=1000,nInterval=50;
    int nStart=0,nEnd=100;
    double nIncrement;
    /// <summary>
    /// 设置窗口透明化渐变参数,并启动执行
    /// </summary>
    /// <param name="start">开始透明度[0,100]</param>
    /// <param name="end">最终透明度[0,100]</param>
    /// <param name="time">渐变持续时间ms</param>
    /// <param name="interval">渐变时间间隔ms</param>
    private void Shade(int start,int end,int time,int interval)
    {
    nStart=start;
    nEnd=end;
    nTime=time;
    nInterval=interval; this.Opacity=nStart;
    nIncrement=(double)nInterval/nTime*(nEnd-nStart)*0.01;
    nTimeCount=0;
    tkOne.Interval=nInterval;
    tkOne.Start();
    } private void tkOne_Tick(object sender, System.EventArgs e)
    {
    this.Opacity=this.Opacity+nIncrement;
    //this.Refresh();
    nTimeCount++;
    if(nTimeCount*nInterval>=nTime) tkOne.Stop();
    } /// <summary>
    /// 设置执行窗口透明化渐变
    /// </summary>
    /// <param name="Start">开始透明度[0,100]</param>
    /// <param name="End">最终透明度[0,100]</param>
    /// <param name="Interval">透明度变化间隔</param>
    /// <param name="Frequency">变化频率ms</param>
    private void Shade2(int Start,int End,int Interval,int Frequency)
    {
    if(Start<=End)
    {
    for(int i=Start;i<=End;i+=Interval)
    {
    this.Opacity=i/100.0;
    this.Refresh();
    System.Threading.Thread.Sleep(Frequency);
    }
    }
    else
    {
    for(int i=Start;i>=End;i-=Interval)
    {
    this.Opacity=i/100.0;
    this.Refresh();
    System.Threading.Thread.Sleep(Frequency);
    }
    }
    } private void FrmLogin_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    Shade2(100,0,10,10);
    } private void FrmLogin_VisibleChanged(object sender, System.EventArgs e)
    {
    if(this.Visible)
    {
    Shade(0,100,500,10);
    }
    else
    {
    Shade2(100,0,10,10);
    }
    }这是修改后的代码:
    int nStart=0,nEnd=100; //起止可见度[0,100]
    int nIncrement=10; //透明度增量[1,100]
    int nInterval=100; //变化间隔ms /// <summary>
    /// 设置窗口透明化渐变参数,并启动执行
    /// </summary>
    /// <param name="Start">开始可见度[0,100]</param>
    /// <param name="End">最终可见度[0,100]</param>
    /// <param name="IncreMent">透明度变化增量[1,100]</param>
    /// <param name="Interval">变化间隔ms</param>
    private void ShadeSet(int Start,int End,int Increment,int Interval)
    {
    nStart=Start;
    nEnd=End;
    nIncrement=Increment;
    nInterval=Interval;
    tkOne.Start();
    } private void tkOne_Tick(object sender, System.EventArgs e)
    {
    Shade(nStart,nEnd,nIncrement,nInterval);
    tkOne.Stop();
    } /// <summary>
    /// 执行窗口透明化渐变
    /// </summary>
    /// <param name="Start">开始可见度[0,100]</param>
    /// <param name="End">最终可见度[0,100]</param>
    /// <param name="IncreMent">透明度变化增量[1,100]</param>
    /// <param name="Interval">变化间隔ms</param>
    private void Shade(int Start,int End,int Increment,int Interval)
    {
    if(Start<=End)
    {
    for(int i=Start;i<=End;i+=Increment)
    {
    this.Opacity=i/100.0;
    this.Refresh();
    System.Threading.Thread.Sleep(Interval);
    }
    }
    else
    {
    for(int i=Start;i>=End;i-=Increment)
    {
    this.Opacity=i/100.0;
    this.Refresh();
    System.Threading.Thread.Sleep(Interval);
    }
    }
    } private void FrmLogin_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    Shade(100,0,10,10);
    } private void FrmLogin_VisibleChanged(object sender, System.EventArgs e)
    {
    if(this.Visible)
    {
    ShadeSet(0,100,10,10);
    }
    else
    {
    Shade(100,0,10,10);
    }
    }
      

  13.   

    我发的那个是.net的,只不过是在.net中直接使用api
      

  14.   

    Infragistics的组件源码里有实现,你可以去查一下,不过跟楼上几位的方法差不多啊。
      

  15.   

    加一个timer控件  以及做一个用来淡出/入的窗体。然后就是用到上面的代码,他们上面给了出/入的快慢可以在timer里设置
      

  16.   

    回zhgroup():在.net中直接使用api,这个没用过,可是我查帮助怎么没有啊?
    回brucenan999(布鲁斯南):Infragistics,这个什么东西?没见过
    回lye2000000_super(我自横刀香甜笑):这样本质上虽然还是一样,但形式上起码统一了。多谢。