返回列表 发帖
支持 顶个 111

TOP

不知道怎么用

TOP

收藏一下

TOP

这个很有用 才1块 太便宜了 感谢分享

TOP

收藏留个脚印备用。。。

TOP

便宜好用,不错

TOP

这个好东西 研究研究

TOP

研究多谢分享

TOP

不错,学习中,发现这软件功能太强大了

TOP

谢谢分享,好东西。

TOP

这个不错支持

TOP

本帖最后由 浪迹红客 于 2013-7-9 13:58 编辑

最近想做一个工具窗口 研究了楼主的代码 发现了几处不太好的地方 老帖了本来不想回复修改 但为了论坛更好交流 还是把它发出来好了 以免后来人苦苦思索浪费时间~~~
1.当你设置窗口收缩边距为0时(也就是完全缩进屏幕)窗口收缩后无法通过鼠标召出窗口
原因:Dim $mouseinwindow1 = MouseContains($winpos);判断鼠标是否在窗口内 是为真 否为假
         当窗口完全缩进屏幕就再也无法将鼠标移到窗口上 也就是说$mouseinwindow $mouseinwindow1都为False 鼠标在窗口外的状态都无法发生改变 下面这条语句也就不会起到重新计时的作用
         无法得到有效_Timer_Init()返回值
  1. If BitXOR($mouseinwindow1, $mouseinwindow) Then $time = _Timer_Init();每一次鼠标状态改变即重新计时
复制代码
而下面语句却要用到_Timer_Init()的返回值才可执行SetAnimationTimer()函数 移出窗口
  1. If Not $show And _Timer_Diff($time) > $showdelay Then;隐藏时且延时时间到执行下列代码(启动DoAnimation 每5ms执行一次)
  2.                         $show = True
  3.                         SetAnimationTimer()
  4.                 EndIf
复制代码
解决:楼主代码中MouseContains函数应该为
  1. Func MouseContains($winpos)
  2.         $pos = MouseGetPos()
  3.         If $hidevalue = 0 Then
  4.                 Switch $dock
  5.                         Case 1
  6.                                 If $pos[0] = 0 Then Return True
  7.                         Case 2
  8.                                 If $pos[1] = 0 Then Return True
  9.                         Case 3
  10.                                 If $pos[0]<=@DesktopWidth And $pos[0]>=@DesktopWidth-2 Then Return True
  11.                         Case 4
  12.                                 If $pos[1] <= @DesktopHeight And $pos[1]>=@DesktopWidth-2 Then Return True
  13.                 EndSwitch
  14.                
  15.         EndIf

  16.         Return $pos[0] >= $winpos[0] And $pos[0] <= $winpos[0] + $winpos[2] And $pos[1] >= $winpos[1] And $pos[1] <= $winpos[1] + $winpos[3]
  17. EndFunc   ;==>MouseContains
复制代码
增加鼠标移到屏幕边缘的判断
2.程序本来好好的 假设窗口缩进了屏幕左边 当你靠近屏幕边缘 程序移出窗口后(注意此时$x=0) 在窗口上只是左击 情况发生了 将鼠标移出窗口后 窗口却不能自动缩进屏幕停在了那儿
原因:当你左击窗口时 不知为什么系统会发送WM_WINDOWPOSCHANGING消息重设$dock 不合情理
      由于程序用GUIRegisterMsg注册了此消息并执行WM_WINDOWPOSCHANGING函数 在此函数中会设置$dock为0(此值用于判断此时位于哪一停靠栏 如1为屏幕左边)
      而下面语句却需要$x不等于0 因此也就不能正常设置$dock为1了
  1. If BitAND($allowdock, 1) And $x <= $dockvalue And $x <> 0 Then
  2.                 $x = 0
  3.                 $dock = 1
  4.                 $move = 1
  5.       EndIf
复制代码
解决:楼主代码中WM_WINDOWPOSCHANGING函数应该为
  1. Func WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam);当位置移动 判断停靠栏符合一定距离条件自动吸收靠边 并设置$dock值为1或2或3获或4
  2.         If $timer <> 0 Then Return
  3.         Global $rect = DllStructCreate($tagWINDOWPOS, $lParam)
  4.         $x = DllStructGetData($rect, "X")
  5.         $y = DllStructGetData($rect, "Y")
  6.         $width = DllStructGetData($rect, "CX")
  7.         $height = DllStructGetData($rect, "CY")
  8.         Local $move = 0
  9.         $dock = 0
  10.         $workarea = _GetWorkArea()
  11.         If $x=0 And $y=0 And $width=0 And $height=0 Then
  12.                 $newpos=WinGetPos($Form1)
  13.                 $x=$newpos[0]
  14.                 $y=$newpos[1]
  15.                 $width=$newpos[2]
  16.                 $height=$newpos[3]
  17.         EndIf
  18.        

  19.         If BitAND($allowdock, 1) And $x <= $dockvalue Then
  20.                 $x = 0
  21.                 $dock = 1
  22.                 $move = 1
  23.         EndIf

  24.         If BitAND($allowdock, 4) And @DesktopWidth - $x - $width <= $dockvalue Then
  25.                 $x = @DesktopWidth - $width
  26.                 $dock = 3
  27.                 $move = 1
  28.         EndIf

  29.         If BitAND($allowdock, 2) And $y <= $dockvalue Then
  30.                 $y = 0
  31.                 $dock = 2
  32.                 $move = 1
  33.         EndIf

  34.         If BitAND($allowdock, 8) And $workarea[3] - $y - $height <= $dockvalue Then
  35.                 $y = $workarea[3] - $height
  36.                 $dock = 4
  37.                 $move = 1
  38.         EndIf
  39.         If $move = 1 Then
  40.                 DllStructSetData($rect, "X", $x)
  41.                 DllStructSetData($rect, "Y", $y)
  42.                 $show = True
  43.         EndIf
  44. EndFunc   ;==>WM_WINDOWPOSCHANGING
复制代码

TOP

很漂亮,谢谢分享。

TOP

不错不错,学习下

TOP

学习 学习~~~~~~~~

TOP

返回列表