『 已解决』 用AU3加载透明GIF图片的疑问
本帖最后由 dnbj2010 于 2010-3-10 21:48 编辑用AU3给窗体加载背景图片,可是对于透明的GIF图片,加上去始终是白色。查过资料,又通过摸索,终于达到了这个效果,不管加载JPG还是GIF,都可以将窗体透明而只显示图片,且图片背景也透明。代码如下:#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
$mainwindow = GUICreate("窗体透明", 80, 120, 400, 300, BitOR($WS_POPUP,$WS_CLIPSIBLINGS),$WS_EX_LAYERED)
$Label = GUICtrlCreateLabel("标签", 0, 0, 80, 120,$SS_BLACKFRAME,$GUI_WS_EX_PARENTDRAG);通过右键菜单退出-拖拽
FileInstall("tu.gif", @TempDir & "\") ;编译图片
$Pic1 = GUICtrlCreatePic(@TempDir & "\tu.gif", 0, 0, 80, 120)
$contextmenu = GUICtrlCreateContextMenu (3); 创建右键主菜单
$infoitem = GUICtrlCreateMenuitem ("退出",$contextmenu) ; 退出
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
exit
Case $infoitem; 退出
infoitem()
EndSwitch
WEnd
Func infoitem()
FileDelete(@TempDir & "\tu.gif") ;删除图片
Exit
EndFunc一个透明背景可随意拖拽的窗体运行成功 既然这样一个单张图片的窗体可以,于是想到GIF动画无非是多几帧而已,于是我想用两张图片间隔显现来表现动画效果,代码如下:#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
$mainwindow = GUICreate("GIF动画", 80, 120, 400, 300, BitOR($WS_POPUP,$WS_CLIPSIBLINGS),$WS_EX_LAYERED)
$Label = GUICtrlCreateLabel("标签", 0, 0, 80, 120,$SS_BLACKFRAME,$GUI_WS_EX_PARENTDRAG);右键菜单-退出-拖拽
FileInstall("tuzuo.gif", @TempDir & "\") ;编译图片
FileInstall("tuyou.gif", @TempDir & "\")
$Pic1 = GUICtrlCreatePic(@TempDir & "\tuzuo.gif", 0, 0, 80, 120)
$Pic2 = GUICtrlCreatePic(@TempDir & "\tuyou.gif", 0, 0, 80, 120)
$contextmenu = GUICtrlCreateContextMenu (3); 创建右键主菜单
$infoitem = GUICtrlCreateMenuitem ("退出",$contextmenu) ; 退出
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
exit
Case 0
dongzuo() ;运行动作事件
Case $infoitem; 退出
infoitem()
EndSwitch
WEnd
Func dongzuo()
While 1
GUICtrlSetState ($Pic1, $GUI_SHOW)
GUICtrlSetState ($Pic2, $GUI_HIDE)
Sleep(500)
GUICtrlSetState ($Pic1, $GUI_HIDE)
GUICtrlSetState ($Pic2, $GUI_SHOW)
Sleep(500)
If $infoitem then ExitLoop;发生退出事件时停止循环
WEnd
EndFunc
Func infoitem()
FileDelete(@TempDir & "\tuzuo.gif") ;删除图片
FileDelete(@TempDir & "\tuyou.gif")
Exit
EndFunc但是图片动画会有闪动,请高手帮忙解决!
但是图片动画会有闪动,请高手帮忙解决! 忘了图片了,现在把图片也传上来,方便大家测试。
把编译好的EXE文件也发上来
谢谢。
另餐,透明的话建议用PNG那个函数。PNG比GIF透明更好看。 既然这样一个单张图片的窗体可以,于是想到GIF动画无非是多几帧而已,于是我想用两张图片间隔显现来表现动画 ...
dnbj2010 发表于 2010-3-10 17:16 http://www.autoitx.com/images/common/back.gif
这样行不?#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
$mainwindow = GUICreate("GIF动画", 80, 120, 400, 300, BitOR($WS_POPUP, $WS_CLIPSIBLINGS), $WS_EX_LAYERED)
$Label = GUICtrlCreateLabel("标签", 0, 0, 80, 120, $SS_BLACKFRAME, $GUI_WS_EX_PARENTDRAG) ;右键菜单-退出-拖拽
FileInstall("tuzuo.gif", @TempDir & "\") ;编译图片
FileInstall("tuyou.gif", @TempDir & "\")
$Pic1 = GUICtrlCreatePic(@TempDir & "\tuzuo.gif", 0, 0, 80, 120)
$contextmenu = GUICtrlCreateContextMenu(3); 创建右键主菜单
$infoitem = GUICtrlCreateMenuItem("退出", $contextmenu) ; 退出
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case 0
dongzuo() ;运行动作事件
Case $infoitem ; 退出
infoitem()
EndSwitch
WEnd
Func dongzuo()
While 1
GUICtrlSetImage($Pic1, @TempDir & "\tuyou.gif")
Sleep(500)
GUICtrlSetImage($Pic1, @TempDir & "\tuzuo.gif")
Sleep(500)
If $infoitem Then ExitLoop ;发生退出事件时停止循环
WEnd
EndFunc ;==>dongzuo
Func infoitem()
FileDelete(@TempDir & "\tuzuo.gif") ;删除图片
FileDelete(@TempDir & "\tuyou.gif")
Exit
EndFunc ;==>infoitem 呵呵,QQ透明菜单也是如此 谢谢6楼的超级版主!
效果很好。居然从来没想到用这个GUICtrlSetImage这个控件。为一个图片控件来指定图标,还真是有点绕。不过事实证明这招很管用。
自已排查,可能是每次控件显隐时,窗体都会重新进行背景抠底。这种闪烁可能是来于系统处理透明的机制,结果呢看到很多关于GDI与双缓冲的说法。对这个GDI的双缓冲不是太了解,而且也不太清楚AU3有关这部份的语法。还专门在论坛下了一个关于GDI双缓冲的AU3的代码,就是想参考一下是怎么写的,不过呢也没解决闪的问题,也许这是GDI不可以解决的了。呵呵,再来DirectDraw,那可真是苦海无涯了。所以来论坛发贴,就是想引高手出来,指点一下是不是GDI双缓冲的问题。
没想到这一个GUICtrlSetImage控件,就解决了闪的问题,难道说在为控件指定图标时,不用窗体对位图图标进行透明处理吗?我想关键应该是图片控件并没有重载。
这个小人很好玩的,有兴趣的人还可以自已设计别的动作。再把例子扩展一下,做什么样的异形窗口应该都可以了。 还是不怎么懂在看看 :face (29):楼主具体是做什么用呢? 收藏了...... 支持楼主,如果能用到系统部署时的标题就更好了,呵呵 回复 11# lxz
你是不是也该贡献点了? 本帖最后由 cvwyg 于 2010-8-9 14:29 编辑
其实也闪的~!不信你在$Pic1 = GUICtrlCreatePic(@TempDir & "\tuzuo.gif", 0, 0, 80, 120)后面
再加上$Pic1 = GUICtrlCreatePic(@TempDir & "\tuyou.gif", 0, 0, 80, 120)
多加几个效果更明显~~
不过如果把后面的GUICtrlSetImage($Pic1, @TempDir & "\tuyou.gif")中tuyou.gif与前面的¥Pic1一致的话,闪的就几乎看不见了~~
=========================
实践得来~原因不知~~ 这个问题是,本来会动的GIF图片会变成不动的.要添加多几张图片不同视觉的才能有效果吧.
页:
[1]
2