本帖最后由 浪迹红客 于 2013-7-9 13:58 编辑
最近想做一个工具窗口 研究了楼主的代码 发现了几处不太好的地方 老帖了本来不想回复修改 但为了论坛更好交流 还是把它发出来好了 以免后来人苦苦思索浪费时间~~~
1.当你设置窗口收缩边距为0时(也就是完全缩进屏幕)窗口收缩后无法通过鼠标召出窗口
原因:Dim $mouseinwindow1 = MouseContains($winpos);判断鼠标是否在窗口内 是为真 否为假
当窗口完全缩进屏幕就再也无法将鼠标移到窗口上 也就是说$mouseinwindow $mouseinwindow1都为False 鼠标在窗口外的状态都无法发生改变 下面这条语句也就不会起到重新计时的作用
无法得到有效_Timer_Init()返回值 If BitXOR($mouseinwindow1, $mouseinwindow) Then $time = _Timer_Init();每一次鼠标状态改变即重新计时
而下面语句却要用到_Timer_Init()的返回值才可执行SetAnimationTimer()函数 移出窗口 If Not $show And _Timer_Diff($time) > $showdelay Then;隐藏时且延时时间到执行下列代码(启动DoAnimation 每5ms执行一次)
$show = True
SetAnimationTimer()
EndIf
解决:楼主代码中MouseContains函数应该为Func MouseContains($winpos)
$pos = MouseGetPos()
If $hidevalue = 0 Then
Switch $dock
Case 1
If $pos[0] = 0 Then Return True
Case 2
If $pos[1] = 0 Then Return True
Case 3
If $pos[0]<=@DesktopWidth And $pos[0]>=@DesktopWidth-2 Then Return True
Case 4
If $pos[1] <= @DesktopHeight And $pos[1]>=@DesktopWidth-2 Then Return True
EndSwitch
EndIf
Return $pos[0] >= $winpos[0] And $pos[0] <= $winpos[0] + $winpos[2] And $pos[1] >= $winpos[1] And $pos[1] <= $winpos[1] + $winpos[3]
EndFunc ;==>MouseContains
增加鼠标移到屏幕边缘的判断
2.程序本来好好的 假设窗口缩进了屏幕左边 当你靠近屏幕边缘 程序移出窗口后(注意此时$x=0) 在窗口上只是左击 情况发生了 将鼠标移出窗口后 窗口却不能自动缩进屏幕停在了那儿
原因:当你左击窗口时 不知为什么系统会发送WM_WINDOWPOSCHANGING消息重设$dock 不合情理
由于程序用GUIRegisterMsg注册了此消息并执行WM_WINDOWPOSCHANGING函数 在此函数中会设置$dock为0(此值用于判断此时位于哪一停靠栏 如1为屏幕左边)
而下面语句却需要$x不等于0 因此也就不能正常设置$dock为1了 If BitAND($allowdock, 1) And $x <= $dockvalue And $x <> 0 Then
$x = 0
$dock = 1
$move = 1
EndIf
解决:楼主代码中WM_WINDOWPOSCHANGING函数应该为Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam);当位置移动 判断停靠栏符合一定距离条件自动吸收靠边 并设置$dock值为1或2或3获或4
If $timer <> 0 Then Return
Global $rect = DllStructCreate($tagWINDOWPOS, $lParam)
$x = DllStructGetData($rect, "X")
$y = DllStructGetData($rect, "Y")
$width = DllStructGetData($rect, "CX")
$height = DllStructGetData($rect, "CY")
Local $move = 0
$dock = 0
$workarea = _GetWorkArea()
If $x=0 And $y=0 And $width=0 And $height=0 Then
$newpos=WinGetPos($Form1)
$x=$newpos[0]
$y=$newpos[1]
$width=$newpos[2]
$height=$newpos[3]
EndIf
If BitAND($allowdock, 1) And $x <= $dockvalue Then
$x = 0
$dock = 1
$move = 1
EndIf
If BitAND($allowdock, 4) And @DesktopWidth - $x - $width <= $dockvalue Then
$x = @DesktopWidth - $width
$dock = 3
$move = 1
EndIf
If BitAND($allowdock, 2) And $y <= $dockvalue Then
$y = 0
$dock = 2
$move = 1
EndIf
If BitAND($allowdock, 8) And $workarea[3] - $y - $height <= $dockvalue Then
$y = $workarea[3] - $height
$dock = 4
$move = 1
EndIf
If $move = 1 Then
DllStructSetData($rect, "X", $x)
DllStructSetData($rect, "Y", $y)
$show = True
EndIf
EndFunc ;==>WM_WINDOWPOSCHANGING
|