实现窗口透明、滑动、淡入淡出等动画效果

原本没打算讲这个,但因为在第一讲课后说要讲的那两个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)

DllCall(“user32.dll”, “int”, “AnimateWindow”, “hwnd”, $hwnd, “int”, 1000, “long”, 0x00090000)
0x00090000=0x00090000+0x00010000,也就是加多了一个AW_HIDE,大家看看,效果是不是不一样了?
很好玩吧?

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容