想在窗口加载、退出、显示、隐藏时实现淡入淡出的效果。我现在可以实现,但是方法不好,我想能否找到更好的实现方法。现在的方法:1,在加载、显示时用Timer来实现淡入;2,在退出、隐藏时调用自编循环函数实现淡出。两种方法不能混用,我理解是窗口淡入要求在窗口出现以后实现,淡出要求窗口消失之前实现,而Timer是滞后执行,函数是即时执行。这样做的缺点就是麻烦、复杂。我想找一种适用于各种情况的方法,谁知道能告诉我,非常感谢。
解决方案 »
- ref int 的应用 - -!
- 我想得到xml里的某一个节点的值,怎么办呢?题目在下面。。。。。
- VS2005的树
- 提示并非所有路径都有返回值,这是怎么回事啊???
- 救命:如何换肤
- 我写的Windows 服务,启动时,一启动就自动关闭了??怎么回事啊??
- 『菜鸟问题』为什么 combo 和 菜单 还有 tooltip 的显示窗口可以超出主窗口以外的地方啊?
- 请以前用MFC,后来转向visualc#.NET的前辈们指导一下你们转到NET的经验,解我几个疑问~~
- 用C#怎样生成mht文件?
- 要使用 c# 开发 web 报表平台,请给点意见
- 一个简单的字符串的截取问题!! 菜鸟求人相助
- 如何跳出一个新窗口
{
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 属性.
各位:我是想找一种适合各种情况(加载、退出、显示、隐藏)的方法,不是仅对哪一种情况有效的方法。我不是无法实现效果,而是想找一种更好更简单更通用的实现方法。谢谢了
{
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();
}
}
}
{
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下使用,淡入淡出效果
回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);
}
}
回brucenan999(布鲁斯南):Infragistics,这个什么东西?没见过
回lye2000000_super(我自横刀香甜笑):这样本质上虽然还是一样,但形式上起码统一了。多谢。