窗口动画效果有拖影现象,求助(有例子和截图)[已解决]
本帖最后由 茫然 于 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
窗体下出那个间隔时间调节到100以下试试 试试改为以下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:49 编辑
回复 3# afan
谢谢版主:
经测试拖影没有了,谢谢了 高手就是高手{:face (88):}
只是还有一点瑕疵:
当一个窗口还没有完全消失时,就点击下面的一个窗口的关闭按钮 有时程序会报错,有时主窗口也被关闭了。
如果等着一个窗口消失了,再点击另一个窗口的关闭按钮,这样正常。
回复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 你说的问题我测试都没有出现……
“Line 4228……” 你的脚本不小啊,问题应该出现在你测试的脚 ...
afan 发表于 2013-4-17 13:53 http://www.autoitx.com/images/common/back.gif
实际脚本没这么多行,可能是#include多了的原因吧,我是编译好后运行的。
只有4个窗口以上才会出错,就是快速乱点关闭按钮,就出错了。会不会是由于点的快,从而GUIDelete(@GUI_WinHandle) 删成别的窗口了。 If Not IsArray($aWPos) Then Return
加上这行后,貌似正常了,我再多测测看看。
版主你是我的偶像啊! 回复 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 哈哈 是真的偶像不是呕像!
If Not IsArray($aWPos) Then Return 这句让我想我是想不到的,我会理所当然的认为,$aWPos = WinGetPos($hWin) $aWPos肯定是个数组。这就是差距啊。
再次感谢! 我的偶像哈,最近正需要这个呢!谢谢了!参考一下!
页:
[1]