找回密码
 加入
搜索
查看: 39296|回复: 81

[转贴] API第二讲:实现窗口透明、滑动、淡入淡出等动画效果(dingamao)

 火... [复制链接]
发表于 2008-5-21 18:38:17 | 显示全部楼层 |阅读模式
原本没打算讲这个,但因为在第一讲课后说要讲的那两个API,都要在英文版的API手册里才能找到,故今天改为讲AnimateWindow。

相信大家都见过有些程序在运行弹出界面时带有动画效果,觉得漂亮之余,大家有没有想过是怎么实现的呢?嗯,大家以后不用疑惑与妒忌别人的作品了,因为今天俺会来讲讲~

首先当然就是打开API手册,找到AnimateWindow的说明:   
函数功能:该函数能在显示与隐藏窗口时能产生特殊的效果。有两种类型的动画效果:滚动动画和滑动动画。
    函数原型:BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags);
    参数:
    hWnd:指定产生动画的窗口的句柄。
    dwTime:指明动画持续的时间(以微秒计),完成一个动画的标准时间为200微秒。
dwFags:指定动画类型。这个参数可以是一个或多个下列标志的组合。

两点我补充一下:1.普及一下知识:1秒=1000微秒
                2. 如果大家还记得第一讲里面的内容,会发现dwFags这个参数不知怎么控制,因为我们不知道譬如像AW_BLEND这个参数的16进制数是多少。还好还好,聪明无双善解人意急群众之所急……(后省略数万字)的dingamao,已经在MSDN官网上找到了我们必需的参数说明,对应如下:
AW_HOR_POSITIVE (0x00000001) '从左到右打开窗口
AW_HOR_NEGATIVE (0x00000002 ) '从右到左打开窗口
AW_VER_POSITIVE (0x00000004) '从上到下打开窗口
AW_VER_NEGATIVE (0x00000008) '从下到上打开窗口
AW_CENTER    (0x00000010) '若使用了AW_HIDE标志,则使窗口向内重叠;若未使用AW_HIDE标志,则使窗口向外扩展。但我的感觉是后者的效果不明显
AW_HIDE     (0x00010000) '在窗体卸载时若想使用本函数就得加上此常量
AW_ACTIVATE   (0x00020000) '在窗体通过本函数打开后,默认情况下会失去焦点,除非加上本常量
AW_SLIDE     (0x00040000) '使用滑动类型。缺省则为滚动动画类型。当使用AW_CENTER标志时,这个标志就被忽略
AW_BLEND     (0x00080000) '淡入淡出效果

至于各个参数在使用时还有什么限制,比如使用哪个标志时,哪一个标志会被忽略,请大家认真查查API手册。

那么好,现在我们先来试试最简单的淡出效果。

$hwnd = GUICreate("Animate Window", 300, 300)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwnd, "int", 1000, "long", 0x00080000)
GUISetState()

动画的显示时间参数,我设为1000,也就是1秒,这是为了看得清楚些,大家可以根据实际需要更改。
大家可以先运行看看,如何,效果不错吧。

刚才举的例子只是在dwFags标志中用了一个单独的参数,可别忘记了,API手册中还说了很重要的一点:这个参数可以是一个或多个下列标志的组合。
好,举个例子~
$hwnd = GUICreate("Animate Window", 300, 300)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwnd, "int", 1000, "long", 0x00040004)
GUISetState()

出现的是从上到下滑动打开窗口,为什么呢,因为0x00040004=0x00000004+0x00040000,也就是相当于AW_VER_POSITIVE与AW_SLIDE的组合。

再给大家来一个是三个标志组合的例子: $hwnd = GUICreate("Animate Window", 300, 300)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwnd, "int", 1000, "long", 0x00040006)
GUISetState()

嘿嘿,这次的效果就比较神奇了,乃是界面从左上角出现,滑动至左下角,因为0x00040006=0x00000004+0x00040000+0x00000002
呃,这里有必要说明一下,大家在运算的时候,最好不要过于自信,直接就相加了,有时会达不到预期的效果,为什么呢,可别忘了,这个是16进制的运算,不是我们平日习惯的10进制运算,在没有把握的时候,推荐打开开始菜单里的计算器,切换成16进制的模式来进行运算。

嗯,到这里就讲得差不多了,其实还有许多种组合方式,大家都可以自己去尝试!

最后再给大家讲一下我的发现,刚才大家可能已经发现了,GUISetState()我是放在DLLCALl的后面,如果放在前面呢?
嗯,我发现很多情况下,如果是放在前面,那么dwFags里的组合项中,最好是加上AW_HIDE这个标志,否则看不出效果,而且经过这样处理之后,效果跟原来可是不一样的,以刚才的第一个最简单的例子来说,修改为这样:  $hwnd = GUICreate("Animate Window", 300, 300)
GUISetState()
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $hwnd, "int", 1000, "long", 0x00090000)

0x00090000=0x00090000+0x00010000,也就是加多了一个AW_HIDE,大家看看,效果是不是不一样了?
很好玩吧?

评分

参与人数 1金钱 +10 收起 理由
autt + 10 =====以上为管理组专用,请普通会员不要使用 ...

查看全部评分

发表于 2008-5-21 21:41:59 | 显示全部楼层
好帖,顶起!
发表于 2008-5-22 08:22:36 | 显示全部楼层

好!有用!
谢谢!
发表于 2008-5-23 11:22:35 | 显示全部楼层

回复 1# 逍遥子 的帖子

顶顶顶啊!!
发表于 2008-5-24 23:55:48 | 显示全部楼层
GUISetState()的位置不同引起效果不同,到底该放在哪里现在还不明白呢
发表于 2008-6-1 11:47:01 | 显示全部楼层
天啊,好贴
发表于 2008-7-6 22:32:29 | 显示全部楼层
1秒=1000微秒
这里可是有点错误哦,应该是 1秒=1000毫秒
不过瑕不掩瑜,这是一篇很好的文章。

发表于 2008-7-6 22:34:42 | 显示全部楼层
同样,楼主原文里面的很多微秒也要改为毫秒。
millisecond  毫秒
microsecond 微秒
发表于 2008-7-21 16:46:54 | 显示全部楼层
那要实现退出效果代码应该加在什么地方呢?
加在退出下面没有效果!!
发表于 2008-9-6 01:28:57 | 显示全部楼层
学习了,谢谢
发表于 2008-12-21 13:28:09 | 显示全部楼层
极品
发表于 2009-2-5 10:06:34 | 显示全部楼层
学习了,收藏
发表于 2009-2-5 11:30:35 | 显示全部楼层
顶下先~~~~~~
发表于 2009-2-5 11:30:50 | 显示全部楼层
顶下先~~~~~~
发表于 2009-2-6 11:07:25 | 显示全部楼层
支持下,很有用的东西
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-19 13:57 , Processed in 0.085276 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表