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

[AU3基础] 问个绘窗口,只出来一个空窗口的问题

[复制链接]
发表于 2011-5-3 08:11:33 | 显示全部楼层 |阅读模式
本帖最后由 happytc 于 2011-5-3 08:12 编辑

下面的代码,利用附件的IconDock.au3文件,当Dock栏出来后,右键点击,想出来DockConfig()函数绘的窗口,结果出来个空窗口,比较奇怪的事,当把该函数中的下面语句去掉注释后,一切就正常了
                            ;MsgBox(0,0,"0k")

现在我没有想出问题出在那里了





#include <GuiConstantsEx.au3>
#include <GuiConstants.au3>
#include <WindowsConstants.au3>
#Include <Misc.au3>
#include "IconDock.au3"


HotKeySet("{ESC}", "_Exit")

Global $iIconSizeMin = 48
Global $iIconSizeMax = 96

Global $aIcon[8] = [7]
$aIcon[1] = @WindowsDir & "\explorer.exe"
$aIcon[2] = @SystemDir & "\taskmgr.exe"
$aIcon[3] = @SystemDir & "\write.exe"
$aIcon[4] = @SystemDir & "\notepad.exe"
$aIcon[5] = @SystemDir & "\osk.exe"
$aIcon[6] = @SystemDir & "\charmap.exe"
$aIcon[7] = @SystemDir & "\mspaint.exe"

Global $hIconDock = _IconDock_Create(0, @DesktopHeight - $iIconSizeMax - $iIconSizeMin, @DesktopWidth, $iIconSizeMax + $iIconSizeMin, BitOR($IconDock_Align_Horizontal, $IconDock_Center), $IconDock_Up, $iIconSizeMin, $iIconSizeMax, True)

_IconDock_BeginUpdate($hIconDock)

For $i = 1 To $aIcon[0]
        _IconDock_IconAddFile($hIconDock, $aIcon[$i], 0, "_EventFunction", $IconDock_RBUTTONDOWN)
Next
_IconDock_EndUpdate($hIconDock)


While 1
        Sleep(100)
WEnd



Func _EventFunction($hID, $iIconIndex, $iEventMsg)
        Switch $hID
                Case $hIconDock
                        Switch $iEventMsg
                                Case $IconDock_RBUTTONDOWN
                                        Local $moved = DockMoveBar($hIconDock)
                                        If $moved = False Then ; If $moved = true the bar was moved - don't open options.
                                                DockConfig()
                                        EndIf
                        EndSwitch
        EndSwitch
EndFunc

Func DockConfig()
        Local $hwdDock, $HRadio, $VRadio, $OKButton, $CancelButton, $msg
                
        $hwdDock = GUICreate("Dock Config", 280, 150)
        
        GUICtrlCreateLabel("IconSizeMin:", 10, 13, 80, 20)
        
        GUICtrlCreateLabel("IconSizeMax:", 10, 43, 80, 20)
        
        GUICtrlCreateLabel("Orientation:", 10, 83, 80, 20)
        $HRadio = GUICtrlCreateRadio("Horizontal", 100, 80, 100, 20)
        $VRadio = GUICtrlCreateRadio("Vertical", 200, 80, 100, 20)

        $OKButton = GUICtrlCreateButton("OK", 50, 120, 50, 20)
        $CancelButton = GUICtrlCreateButton("Cancel", 160, 120, 50, 20)
        
        GUISetState()
;MsgBox(0,0,"0k")
        While True
                $msg = GUIGetMsg()

                Switch $msg
                        Case $GUI_EVENT_CLOSE, $CancelButton
                                ExitLoop
                        Case $OKButton
                                MsgBox(0,"pressed", "Pressed OK Button")
                                ExitLoop
                EndSwitch

                Sleep(20)
                
        WEnd
        GUIDelete($hwdDock)
EndFunc


Func DockMoveBar($hwdGuiBar)
        Local $PosDiff[2], $WinPos, $WinPos2, $MousePos, $dll, $moved
        
        $dll = DllOpen("user32.dll")
        
        While 1
                $MousePos = MouseGetPos()
                $WinPos = WinGetPos($hwdGuiBar)
                $PosDiff[0] = $WinPos[0] - $MousePos[0]
                $PosDiff[1] = $WinPos[1] - $MousePos[1]

                While _IsPressed("02", $dll)
                        $MousePos = MouseGetPos()
                        WinMove($hwdGuiBar, "", $MousePos[0] + $PosDiff[0], $MousePos[1] + $PosDiff[1])
                WEnd
                Sleep(10)
                ExitLoop
        WEnd
        
        $WinPos2 = WinGetPos($hwdGuiBar, "")
        
        If ($WinPos[0] < $WinPos2[0] - 3) Or ($WinPos[1] < $WinPos2[1] - 3) Or ($WinPos[0] > $WinPos2[0] + 3) Or ($WinPos[1] > $WinPos2[1] + 3) Then
                $moved = True ; If the window was moved, don't run program on return.
        Else
                $moved = False
        EndIf
        
        Sleep(10)
        Return $moved        
EndFunc

Func _Exit()
        _IconDock_Destroy($hIconDock)
        Exit
EndFunc



本帖子中包含更多资源

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

×
发表于 2011-5-3 08:51:18 | 显示全部楼层
我看不出楼主的代码要干什么
 楼主| 发表于 2011-5-3 08:58:31 | 显示全部楼层
只是为了说明这个问题,临时想出来的代码,作用就是显示出标题所说的问题。
 楼主| 发表于 2011-5-10 05:01:27 | 显示全部楼层
这个问题,没有知道为什么吗?

卡在这里了,实在不知道,怎么msgbox()一下,就没有问题了。太奇怪了
 楼主| 发表于 2011-5-10 08:15:07 | 显示全部楼层
出现那个光溜溜的窗口,点x掉后,一会au3就自动退出了,出现下面的信息。本来就是x掉这个窗口,也不应该退回的


!>08:10:05 AutoIT3.exe 完成:[CODE]:1073807364   ---- 这一行代表啥意思?
+>08:10:07 ACNWrapper 完成..
>退出代码: 1073807364        运行时间: 14.160 秒
 楼主| 发表于 2011-5-10 08:26:38 | 显示全部楼层
快被这个问题搞疯了。
连是执行到脚本那一行而卡死都无法找到
 楼主| 发表于 2011-5-10 08:45:33 | 显示全部楼层
又测试了下,脚本一直在下面这个循环里运行,既然执行到这里了,为什在这个循环之前定义的窗口里的Button之类的不出来呢?

        While True
                $msg = GUIGetMsg()

                Switch $msg
                        Case $GUI_EVENT_CLOSE, $CancelButton
                                ExitLoop
                        Case $OKButton
                                MsgBox(0, "pressed", "Pressed OK Button")
                                ExitLoop
                EndSwitch
                Sleep(20)
        WEnd
 楼主| 发表于 2011-5-10 22:12:03 | 显示全部楼层
看来这个问题,没有人知道呀

想问下,绘制窗口的控件的机制是啥?为什么脚本执行过了,但就是不出来窗口里本来有的按纽之类的?若把这个绘窗口的函数单独拿出来,又完全没有问题,百思不得其解,怎么加看起来毫无相关的Msgbox()语句,就正常了,并且这个语句无论放在函数内的那里都可以。

就是不知道原因,大家有没有什么建议,可以不显示对话框msgbox,我现在只想能做就可以了,不了解原因
有没有什么曲线方法?
 楼主| 发表于 2011-5-10 23:03:01 | 显示全部楼层
哎,还是没有找到这个事情的原因
不过,我把它改成事件机制,就没有问题了,
怎么循环里用消息机制,就会出这样奇怪的问题呢?
 楼主| 发表于 2011-5-10 23:07:51 | 显示全部楼层
不过,我一点都不喜欢用事件机制来实现绘制的窗口响应,因为GUICtrlSetOnEvent( 控件ID, "函数名" )里的自定义函数不能带参数,这让你不得不定义全局变量,我很是不喜欢用全局变量,因为这样不利于封装和转到别的地方用
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-13 14:13 , Processed in 0.075245 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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