| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1385 人关注过本帖
标题:[求助]窗体淡入淡出效果怎么做的?
只看楼主 加入收藏
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
结帖率:100%
收藏
 问题点数:0 回复次数:10 
[求助]窗体淡入淡出效果怎么做的?
如题。
搜索更多相关主题的帖子: 窗体 效果 淡入 淡出 
2006-12-22 21:19
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

在应用程序中引入图片淡入及淡出,可以让用户界面更加美观。以前报刊杂志中介绍
的常用方法有两种:一是自己写程序,诸个象素进行混合渐变;二是使用DirectX,建立一
个带Alpha通道的Surface。第一种,效果可以自己控制,但比较麻烦,而且一般不容易生
成硬件优化的代码;第二种速度很快,却需要使用DirectX库。

本文结合Delphi实例代码,介绍两种简单快速的实现方法,算是一个总结吧,希望能
对初学者有所帮助。

一:AnimateWindow函数的使用:
(一)函数原型:

BOOL AnimateWindow(
HWND hwnd, // 要进行特效显示的窗体的句柄
DWORD dwTime, // 动画持续时间,以毫秒为单位
DWORD dwFlags // 动画类型
);

(二)参数设置:
hwnd :用“窗体名.handle”即可,如:Form1.handle;
dwTime:一般情况下用400比较合适,我偏向于1000;
dwFlags:可以设为多种效果,详见MSDN,这里我只介绍淡入淡出用到的参数AW_BLEND;
如果是淡入,设为AW_BLEND即可,如果是淡出,设为AW_BLEND or AW_HIDE。
(三)程序实例:
新建一个工程,在生成的窗体Form1上添加一个按钮Button1,Button1的Caption设为“淡
出”;接下来添加如下两段代码,实现淡入淡出:
1、淡入:双击Form1,在其“OnCreate”事件中添加:

AnimateWindow(Form1.Handle,1000,AW_BLEND);

2、淡出:双击Button1,在其“OnClick”事件中添加:

AnimateWindow(Form1.Handle,1000,AW_HIDE or AW_BLEND);
form1.Close;//关闭窗口


整个程序的procedure如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
AnimateWindow(Form1.Handle,1000,AW_BLEND);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateWindow(Form1.Handle,1000,AW_HIDE or AW_BLEND);
form1.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AnimateWindow(Form1.Handle,1000,AW_BLEND);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateWindow(Form1.Handle,1000,AW_HIDE or AW_BLEND);
form1.Close;
end;


二、AlphaBlend属性结合Timer组件:
(一)原理:
在Delphi6.0以上(6.0以下我不了解),每个窗体有AlphaBlend属性和AlphaBlendValue
属性,将AlphaBlend属性设为True,然后在Timer组件中随着时间改变AlphaBlendValue的
值(0-255)即可。
(二)程序实例:
新建一个工程,并添加一个窗体Form2,将其AlphaBlend属性设置为True;在窗体Form1上添
加一个按钮Button1,Caption属性设为“淡入”,在Form2上添加一个按钮Button1,Caption
属性设为“淡出”;另外,在Form2上添加两个Timer组件Timer1、Timer2,将它们的Interval
属性设为3(越大动画时间越长),Enable设为False;接下来添加如下4段代码:
1、双击Form1上的Button1,在其“OnCreate”事件中添加:

Form2.AlphaBlendValue:=1;//窗体从透明开始
Form2.Show; //显示窗体Form2
Form2.BringToFront; //将窗体Form2移到前端
Form2.Timer1.Enabled:=true; //启动Timer1,控制窗体可见度-增加

2、双击Form2上的Button1,在其“OnCreate”事件中添加:
Timer2.Enabled:=true; //启动Timer2,控制窗体可见度-减少
3、双击Form2上的Timer1,在其“OnTimer”事件中添加:

Form2.AlphaBlendValue:=Form2.AlphaBlendValue+1;//增加可见度
Timer2.Enabled:=false; //停止Timer2
//如果可见度达到最大,停止Timer1
if Form2.AlphaBlendValue=255 then
timer1.Enabled:=false;

Form2.AlphaBlendValue:=Form2.AlphaBlendValue+1;//增加可见度
Timer2.Enabled:=false; //停止Timer2
//如果可见度达到最大,停止Timer1
if Form2.AlphaBlendValue=255 then
timer1.Enabled:=false;


4、双击Form2上的Timer2,在其“OnTimer”事件中添加:

Form2.AlphaBlendValue:=Form2.AlphaBlendValue-1;//减少可见度
Timer1.Enabled:=false; //停止Timer1
//如果可见度达到最小,停止Timer2
if Form2.AlphaBlendValue=0 then
begin
timer2.Enabled:=false;
Form2.Close;
end;


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 21:40
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

Private Declare Function AnimateWindow Lib "user32" (ByVal hwnd As Long, ByVal dwTime As Long, ByVal dwFlags As Long) As Long

AnimateWindow hwnd, 3000, &H80000


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 21:41
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
Option Explicit
Public Const LWA_ALPHA = &H2
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
Public Const WS_EX_TRANSPARENT As Long = &H20&
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const HWND_TOPMOST = -1

Public Function SetMouseIn(ByVal hwnd As Long, Optional TouMing As Long = 200, Optional Top As Boolean = True, Optional cMouse As Boolean = True) As Long
Dim Ret As Long
Ret = GetWindowLong(hwnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
If cMouse Then Ret = Ret Or WS_EX_TRANSPARENT
SetWindowLong hwnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes hwnd, 0, TouMing, LWA_ALPHA
If Top Then SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Function

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 21:44
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
Option Explicit

'SetMouseIn 窗体的句柄,透明度(可选),是否置顶(可选),是否鼠标穿透(可选)
Private Const LWA_ALPHA = &H2
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const WS_EX_TRANSPARENT As Long = &H20&
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const HWND_TOPMOST = -1

Private Function SetMouseIn(ByVal hwnd As Long, Optional TouMing As Long = 200, Optional Top As Boolean = True, Optional cMouse As Boolean = True) As Long
Dim Ret As Long
Ret = GetWindowLong(hwnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
If cMouse Then Ret = Ret Or WS_EX_TRANSPARENT
SetWindowLong hwnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes hwnd, 0, TouMing, LWA_ALPHA
If Top Then SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Function

Private Sub Form_Load()
Timer1.Interval = 20
SetMouseIn Me.hwnd, 1, True, False
End Sub

Private Sub Timer1_Timer()
Static i As Long
If i >= 250 Then Timer1.Enabled = False
i = i + 5
SetMouseIn Me.hwnd, i, True, False
End Sub
=====================
以上完全可以。

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 21:44
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 
淡出可以写成:
Private Sub Timer1_Timer()
Static i As Long
If i >= 250 Then Timer1.Enabled = False
i = i + 5
SetMouseIn Me.hwnd, 255-i, True, False'<----------加了个255-i
End Sub

[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 21:45
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
收藏
得分:0 
这么说就是调API了。。。没其它办法

这个社会太复杂。。。
2006-12-22 21:57
学习VB才2天
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1653
专家分:0
注 册:2006-5-4
收藏
得分:0 

嗯...


[GLOW=255,DeepPink,3]我的免费网盘[/GLOW]
2006-12-22 22:22
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
收藏
得分:0 

知道了。。。谢谢


这个社会太复杂。。。
2006-12-22 23:07
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
可以自己写函数吧,不过我现在还不知道具体算法是什么,你去找一下这方面的算法,自己想想,可能比较复杂

[此贴子已经被作者于2006-12-22 23:18:53编辑过]



雁无留踪之意,水无取影之心
2006-12-22 23:14
快速回复:[求助]窗体淡入淡出效果怎么做的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047536 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved