找回密码
 加入
搜索
查看: 7131|回复: 9

[GUI管理] 窗口动画效果有拖影现象,求助(有例子和截图)[已解决]

  [复制链接]
发表于 2013-4-17 02:26:22 | 显示全部楼层 |阅读模式
本帖最后由 茫然 于 2013-4-21 14:03 编辑

弄了好几天了也没搞好,特此请教,谢谢了。
窗口从下到上显示时没有问题,从上到下关闭时就有拖影现象(一个窗口正常,当有好几个时就拖影了,还有如果主窗口在这个动画窗口的下面时也会有这现象)
试过好几台XP的电脑都这现象,win7下正常。
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>

Opt("MustDEClareVars", 1)
Opt("GUIOnEventMode", 1)

Local $MSGWIN, $Lbl[5]
Local $GetPos = WinGetPos("[class:Shell_TrayWnd]") ;获取任务栏的信息

Local $gu_Main = GUICreate("测试窗口", 520, 522, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Gui")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "_Gui")
Local $gu_Main_But1 = GUICtrlCreateButton("多点几次 ", 200, 200, 100, 32)
GUICtrlSetOnEvent($gu_Main_But1, "_Gui")

GUISetState(@SW_SHOW)

While 1
        Sleep(100)
WEnd


Func _Gui()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        Switch @GUI_WinHandle
                                Case $gu_Main
                                        Exit
                                Case Else
                                        GUIDelete(@GUI_WinHandle)
                        EndSwitch
                Case $gu_Main_But1
                        _GETMSG("XP下有拖影现象,win7下没有,各位大侠有没有好的解决办法啊,拜托了!", "动画窗口")
        EndSwitch
EndFunc   ;==>_Gui


Func _GETMSG($sText, $sTitle);加载通知窗口
        If $sTitle = "" Then $sTitle = "系统消息";默认消息标题
        FileInstall("Msgbg.jpg", @TempDir & "\Msgbg.jpg");载入公告板背景图片
        $MSGWIN = GUICreate("", 256, 111, @DesktopWidth - 256, @DesktopHeight - 111 - $GetPos[3], _
                        $WS_POPUP, $WS_EX_TOPMOST, WinGetHandle(AutoItWinGetTitle()));窗体在托盘栏上
        GUICtrlCreatePic(@TempDir & "\Msgbg.jpg", 0, 0, 0, 0)
        GUICtrlSetState(-1, $GUI_DISABLE) ;设置为背景图片
        FileDelete(@TempDir & "\Msgbg.jpg");删除背景图
        $Lbl[1] = GUICtrlCreateLabel("", 240, 5, 10, 10);关闭按钮
        GUICtrlSetOnEvent(-1, "_MSGWIN_Close")
        GUICtrlSetCursor(-1, 0)
        $Lbl[2] = GUICtrlCreateLabel($sTitle, 14, 32, 228, 12);标题栏
        GUICtrlSetColor(-1, 0x1E5883)
        $Lbl[3] = GUICtrlCreateLabel($sText, 14, 52, 228, 24);信息栏
        GUICtrlSetColor(-1, 0x3A90D9)
        $Lbl[4] = GUICtrlCreateLabel("", 50, 88, 228, 12);倒计时栏
        GUICtrlSetColor(-1, 0x1E5883)
        For $i = 1 To 3
                GUICtrlSetBkColor($Lbl[$i], $GUI_BKCOLOR_TRANSPARENT)
        Next
        
        DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $MSGWIN, "int", 1000, "long", 0x00040008);窗体下进
        GUISetState(@SW_SHOWNA)
        _RoundGUI($MSGWIN, 0, 0, 5, 5) ;窗体圆角
        
EndFunc   ;==>_GETMSG

Func _MSGWIN_Close()
        DllCall("user32.dll", "int", "AnimateWindow", "hwnd", @GUI_WinHandle, "int", 500, "long", 0x00050004);窗体下出
        GUIDelete(@GUI_WinHandle)
        
EndFunc   ;==>_MSGWIN_Close


Func _RoundGUI($h_win, $i_x1, $i_y1, $i_x3, $i_y3) ;窗体圆角API
        Local $pos, $ret, $ret2
        $pos = WinGetPos($h_win)
        $ret = DllCall("gdi32.dll", "long", "CreateRoundRectRgn", "long", $i_x1, "long", $i_y1, "long", $pos[2], "long", $pos[3], "long", $i_x3, "long", $i_y3)
        If $ret[0] Then
                $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret[0], "int", 1)
                If $ret2[0] Then
                        Return 1
                Else
                        Return 0
                EndIf
        Else
                Return 0
        EndIf
EndFunc   ;==>_RoundGUI

本帖子中包含更多资源

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

×
发表于 2013-4-17 12:15:18 | 显示全部楼层
窗体下出那个间隔时间调节到100以下试试
发表于 2013-4-17 12:56:50 | 显示全部楼层
试试改为以下
Func _MSGWIN_Close()
        Local $aWPos = WinGetPos(@GUI_WinHandle), $i, $ts
        For $i = $aWPos[1] + 10 to @DesktopHeight
                WinMove(@GUI_WinHandle, '', DeFault, $i)
                $ts = TimerInIt()
                Do
                Until TimerDiff($ts) > 5
        Next
        GUIDelete(@GUI_WinHandle)
EndFunc   ;==>_MSGWIN_Close
 楼主| 发表于 2013-4-17 13:38:55 | 显示全部楼层
本帖最后由 茫然 于 2013-4-17 13:49 编辑

回复 3# afan


  谢谢版主:
经测试拖影没有了,谢谢了 高手就是高手
只是还有一点瑕疵:
当一个窗口还没有完全消失时,就点击下面的一个窗口的关闭按钮 有时程序会报错,有时主窗口也被关闭了。
如果等着一个窗口消失了,再点击另一个窗口的关闭按钮,这样正常。


本帖子中包含更多资源

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

×
发表于 2013-4-17 13:53:45 | 显示全部楼层
回复  afan


  谢谢版主:
经测试拖影没有了,谢谢了 高手就是高手
只是还有一点瑕疵 ...
茫然 发表于 2013-4-17 13:38



    你说的问题我测试都没有出现……
“Line 4228……” 你的脚本不小啊,问题应该出现在你测试的脚本,而非1#的~

当然也可以加入判断排错。3#第3行前插入以下行
        If Not IsArray($aWPos) Then Return
 楼主| 发表于 2013-4-17 14:00:41 | 显示全部楼层
你说的问题我测试都没有出现……
“Line 4228……” 你的脚本不小啊,问题应该出现在你测试的脚 ...
afan 发表于 2013-4-17 13:53


实际脚本没这么多行,可能是#include多了的原因吧,我是编译好后运行的。

只有4个窗口以上才会出错,就是快速乱点关闭按钮,就出错了。会不会是由于点的快,从而GUIDelete(@GUI_WinHandle) 删成别的窗口了。
 楼主| 发表于 2013-4-17 14:06:43 | 显示全部楼层
If Not IsArray($aWPos) Then Return
加上这行后,貌似正常了,我再多测测看看。
版主你是我的偶像啊!
发表于 2013-4-17 14:10:56 | 显示全部楼层
回复 7# 茫然


    呕像再稳定点
Func _MSGWIN_Close()
        Local $hWin = @GUI_WinHandle, $aWPos = WinGetPos($hWin), $i, $ts
        If Not IsArray($aWPos) Then Return
        For $i = $aWPos[1] + 10 to @DesktopHeight
                WinMove($hWin, '', DeFault, $i)
                $ts = TimerInIt()
                Do
                Until TimerDiff($ts) > 5
        Next
        If IsHWnd($hWin) Then GUIDelete($hWin)
EndFunc   ;==>_MSGWIN_Close
 楼主| 发表于 2013-4-17 14:56:26 | 显示全部楼层
哈哈 是真的偶像不是呕像!
If Not IsArray($aWPos) Then Return 这句让我想我是想不到的,我会理所当然的认为,$aWPos = WinGetPos($hWin) $aWPos肯定是个数组。这就是差距啊。

再次感谢!
发表于 2013-4-23 11:01:03 | 显示全部楼层
我的偶像哈,最近正需要这个呢!谢谢了!参考一下!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-25 07:29 , Processed in 0.080900 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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