woeiwoei 发表于 2010-5-7 16:21:58

关于ControlMove的移动问题

在一个GUI窗口。。
如何让一个 文本 通过ControlMove命令 慢速像上移动??
我设置后 文本都是一下子 就移动到制定坐标了。我想让它慢慢移动。也就是动态的移动。。
大大们能给个例子么??

C.L 发表于 2010-5-7 19:30:37

论坛上面有很多这种例子啊
写个简单一点的例子。
#include <GUIConstantsEx.au3>
Opt ("GUIOnEventMode",1)
$GUI = GUICreate("test", @DesktopWidth-100, @DesktopHeight-100, -1, -1);, 0x80000000, 0x00080088
GUISetOnEvent ($GUI_EVENT_CLOSE,"_exit")
$lable1 = GUICtrlCreateLabel("移动的文字",500,500, 300, 100)
GUICtrlSetFont(-1, 30, 800, 0, "楷体_GB2312")
GUISetState(@SW_SHOW)
$pos = ControlGetPos($GUI,"",$lable1)
$y = $pos
$move = 1
While 1
        If $move Then
                ControlMove ("test","",$lable1,Default,$y)
                $y -= $move
        EndIf
        If $y<1 Then $move = -1
        If $y>500 Then $move = 1
        Sleep (10)
WEnd

Func _exit ()
        Exit
EndFunc

水木子 发表于 2010-5-7 20:34:13

传送门:http://www.autoitx.com/forum.php?mod=viewthread&tid=13634&extra=&highlight=%B9%F6%B6%AF%D7%D6%C4%BB&page=2

woeiwoei 发表于 2010-5-8 09:42:11

本帖最后由 woeiwoei 于 2010-5-8 10:02 编辑

#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <File.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <SliderConstants.au3>
#include <Date.au3>
Global $Label,$controlGui, $text
$ini =@ScriptDir&"\config.ini"
$txt = IniRead($ini, "设置", "网吧公告", "")
Opt("MustDeclareVars", 0)
Global Const $AC_SRC_ALPHA = 1
_GDIPlus_Startup()
$Src = @scriptdir&"\beijing.png"
$hImage =_GDIPlus_ImageLoadFromFile($Src)
$width =_GDIPlus_ImageGetWidth ($hImage)
$height = _GDIPlus_ImageGetHeight($hImage)
$GUI = GUICreate("Chat Tools", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
SetBitMap($GUI, $hImage, 0)
$Label1 = GUICtrlCreateLabel("", 360, 8, 30, 30)
$Label2 = GUICtrlCreateLabel("", 330, 8, 30, 30)
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState()
WinSetOnTop($gui,"",1)
for $i = 0 to 255 step 10
SetBitMap($GUI, $hImage, $i)
next
$font="方正粗活意简体"
$controlGui = GUICreate("ControlGUI", $width, $height, 0,0,$WS_POPUP,BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$gui)
GUICtrlCreatePic(@ScriptDir & "\grey.gif",0,0,$width,$height)
GuiCtrlSetState(-1,$GUI_DISABLE)
GUICtrlCreateLabel("梦幻王国网吧公告", 25, 25, 140, 50)
GUICtrlSetFont(-1,12,'','',$font)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0x123456)
$clock=GUICtrlCreateLabel("",200,30,200,20)
GUICtrlSetFont(-1,10)
GUICtrlSetColor(-1, 0x000000)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUISetState(@SW_SHOW)
$text=GUICtrlCreateLabel($txt,60, 240, 400, 15)
GuiCtrlSetFont(-1, 10)
GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1,0x000000)



_WinAPI_DeleteObject($hImage)
_GDIPlus_Shutdown()
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
if ($hWnd = $GUI) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
EndFunc
$num=0
$b=1

While $num <= 2500
      If $b = 240 Then $b = 10
                Sleep(100)
                ControlMove ('',$txt,$text,60,240-$b,400,15)
                $b += 1
      $num = $num + 1
_ReduceMemory(@AutoItPID)
$LbR = GUICtrlRead($clock)
$Nw = _Now()
If $Nw <> $LbR Then GUICtrlSetData($clock, $Nw)
$nMsg = GUIGetMsg()
Switch $nMsg
        Case $GUI_EVENT_CLOSE
                Exit
        Case $Label1
                Exit
        Case $Label2
        WinSetState($GUI,"",@SW_MINIMIZE)
EndSwitch
        WEnd

Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc

Func _ReduceMemory($i_PID = -1)
      If $i_PID <> -1 Then
                        Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
                        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle)
                        DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle)
      Else
                        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
      EndIf
      Return $ai_Return
EndFunc

        我看了 afan大大的 文字向上移动.Afan那个程序。我想应该是 png做背景的问题把?
测试了 Controlmove() 和GUICtrlsetpos()一样 存在闪屏问题。。我的神啊。
这个闪屏问题还没人能解决了??

woeiwoei 发表于 2010-5-8 10:07:09

传送门:
水木子 发表于 2010-5-7 20:34 http://www.autoitx.com/images/common/back.gif

谢谢 水木子大大~~但是闪屏还是依旧存在。。时间显示还好点。偶尔闪一下。
文字滚动闪的人恼火!!사람살려!!!!!

水木子 发表于 2010-5-8 10:47:55

本帖最后由 水木子 于 2010-5-8 10:50 编辑

在XP里是有点抖,Win7里感觉还比较平滑。
建议还是用 AdlibRegister 调用,做到循环里确实抖动很严重。

woeiwoei 发表于 2010-5-8 15:20:02

在XP里是有点抖,Win7里感觉还比较平滑。
建议还是用 AdlibRegister 调用,做到循环里确实抖动很严重。
水木子 发表于 2010-5-8 10:47 http://www.autoitx.com/images/common/back.gif


   AdlibRegister调用稍微 好了点。。没解决根本问题呀。。
我继续研究~~~:face (36):
页: [1]
查看完整版本: 关于ControlMove的移动问题