找回密码
 加入
搜索
查看: 14052|回复: 24

[AU3基础] 『 已解决』 用AU3加载透明GIF图片的疑问

[复制链接]
发表于 2010-3-10 17:12:12 | 显示全部楼层 |阅读模式
本帖最后由 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
一个透明背景可随意拖拽的窗体运行成功

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-3-10 17:16:17 | 显示全部楼层
既然这样一个单张图片的窗体可以,于是想到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
但是图片动画会有闪动,请高手帮忙解决!
但是图片动画会有闪动,请高手帮忙解决!
 楼主| 发表于 2010-3-10 18:03:38 | 显示全部楼层
忘了图片了,现在把图片也传上来,方便大家测试。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2010-3-10 18:08:28 | 显示全部楼层
把编译好的EXE文件也发上来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
itljl + 10 + 1

查看全部评分

发表于 2010-3-10 18:54:12 | 显示全部楼层
谢谢。
另餐,透明的话建议用PNG那个函数。PNG比GIF透明更好看。
发表于 2010-3-10 20:26:46 | 显示全部楼层
既然这样一个单张图片的窗体可以,于是想到GIF动画无非是多几帧而已,于是我想用两张图片间隔显现来表现动画 ...
dnbj2010 发表于 2010-3-10 17:16



    这样行不?
#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
发表于 2010-3-10 21:38:10 | 显示全部楼层
呵呵,QQ透明菜单也是如此
 楼主| 发表于 2010-3-10 21:55:34 | 显示全部楼层
谢谢6楼的超级版主!
效果很好。居然从来没想到用这个GUICtrlSetImage这个控件。为一个图片控件来指定图标,还真是有点绕。不过事实证明这招很管用。
自已排查,可能是每次控件显隐时,窗体都会重新进行背景抠底。这种闪烁可能是来于系统处理透明的机制,结果呢看到很多关于GDI与双缓冲的说法。对这个GDI的双缓冲不是太了解,而且也不太清楚AU3有关这部份的语法。还专门在论坛下了一个关于GDI双缓冲的AU3的代码,就是想参考一下是怎么写的,不过呢也没解决闪的问题,也许这是GDI不可以解决的了。呵呵,再来DirectDraw,那可真是苦海无涯了。所以来论坛发贴,就是想引高手出来,指点一下是不是GDI双缓冲的问题。
没想到这一个GUICtrlSetImage控件,就解决了闪的问题,难道说在为控件指定图标时,不用窗体对位图图标进行透明处理吗?我想关键应该是图片控件并没有重载。
这个小人很好玩的,有兴趣的人还可以自已设计别的动作。再把例子扩展一下,做什么样的异形窗口应该都可以了。
发表于 2010-3-11 04:03:13 | 显示全部楼层
还是不怎么懂  在看看
发表于 2010-3-11 10:35:48 | 显示全部楼层
楼主具体是做什么用呢?
发表于 2010-3-11 12:05:26 | 显示全部楼层
收藏了......
发表于 2010-7-19 22:28:12 | 显示全部楼层
支持楼主,如果能用到系统部署时的标题就更好了,呵呵
发表于 2010-8-9 10:35:57 | 显示全部楼层
回复 11# lxz


    你是不是也该贡献点了?
发表于 2010-8-9 14:26:04 | 显示全部楼层
本帖最后由 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一致的话,闪的就几乎看不见了~~
=========================
实践得来~原因不知~~
发表于 2011-4-16 09:15:22 | 显示全部楼层
这个问题是,本来会动的GIF图片会变成不动的.要添加多几张图片不同视觉的才能有效果吧.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 08:52 , Processed in 0.082462 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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