茫然 发表于 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
Local $GetPos = WinGetPos("") ;获取任务栏的信息

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, _
                        $WS_POPUP, $WS_EX_TOPMOST, WinGetHandle(AutoItWinGetTitle()));窗体在托盘栏上
        GUICtrlCreatePic(@TempDir & "\Msgbg.jpg", 0, 0, 0, 0)
        GUICtrlSetState(-1, $GUI_DISABLE) ;设置为背景图片
        FileDelete(@TempDir & "\Msgbg.jpg");删除背景图
        $Lbl = GUICtrlCreateLabel("", 240, 5, 10, 10);关闭按钮
        GUICtrlSetOnEvent(-1, "_MSGWIN_Close")
        GUICtrlSetCursor(-1, 0)
        $Lbl = GUICtrlCreateLabel($sTitle, 14, 32, 228, 12);标题栏
        GUICtrlSetColor(-1, 0x1E5883)
        $Lbl = GUICtrlCreateLabel($sText, 14, 52, 228, 24);信息栏
        GUICtrlSetColor(-1, 0x3A90D9)
        $Lbl = 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, "long", $pos, "long", $i_x3, "long", $i_y3)
        If $ret Then
                $ret2 = DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $h_win, "long", $ret, "int", 1)
                If $ret2 Then
                        Return 1
                Else
                        Return 0
                EndIf
        Else
                Return 0
        EndIf
EndFunc   ;==>_RoundGUI



haijie1223 发表于 2013-4-17 12:15:18

窗体下出那个间隔时间调节到100以下试试

afan 发表于 2013-4-17 12:56:50

试试改为以下Func _MSGWIN_Close()
        Local $aWPos = WinGetPos(@GUI_WinHandle), $i, $ts
        For $i = $aWPos + 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


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


afan 发表于 2013-4-17 13:53:45

回复afan


谢谢版主:
经测试拖影没有了,谢谢了 高手就是高手
只是还有一点瑕疵 ...
茫然 发表于 2013-4-17 13:38 http://www.autoitx.com/images/common/back.gif


    你说的问题我测试都没有出现……
“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 http://www.autoitx.com/images/common/back.gif

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

只有4个窗口以上才会出错,就是快速乱点关闭按钮,就出错了。会不会是由于点的快,从而GUIDelete(@GUI_WinHandle) 删成别的窗口了。

茫然 发表于 2013-4-17 14:06:43

If Not IsArray($aWPos) Then Return
加上这行后,貌似正常了,我再多测测看看。
版主你是我的偶像啊!

afan 发表于 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 + 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肯定是个数组。这就是差距啊。

再次感谢!

shoper 发表于 2013-4-23 11:01:03

我的偶像哈,最近正需要这个呢!谢谢了!参考一下!
页: [1]
查看完整版本: 窗口动画效果有拖影现象,求助(有例子和截图)[已解决]