找回密码  加入

AUTOIT CN

搜索
楼主: weiyun

[特效] 窗口自动停靠屏幕边缘+自动收起(类似Windows边栏和QQ的效果)

[复制链接]
发表于 2012-9-30 22:20:33 | 显示全部楼层
支持 顶个 111
发表于 2012-10-6 10:42:57 | 显示全部楼层
不知道怎么用
发表于 2012-10-30 09:28:00 | 显示全部楼层
收藏一下
发表于 2012-11-23 11:31:36 | 显示全部楼层
这个很有用 才1块 太便宜了 感谢分享
发表于 2012-11-23 14:40:31 | 显示全部楼层
收藏留个脚印备用。。。
发表于 2012-12-31 22:29:07 | 显示全部楼层
便宜好用,不错
发表于 2013-1-11 09:20:36 | 显示全部楼层
这个好东西 研究研究
发表于 2013-1-31 02:50:19 | 显示全部楼层
研究多谢分享
发表于 2013-2-14 10:00:17 | 显示全部楼层
不错,学习中,发现这软件功能太强大了
发表于 2013-3-16 00:19:07 | 显示全部楼层
谢谢分享,好东西。
发表于 2013-4-6 19:59:48 | 显示全部楼层
这个不错支持
发表于 2013-7-8 13:04:23 | 显示全部楼层
本帖最后由 浪迹红客 于 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
复制代码
发表于 2013-7-25 09:19:16 | 显示全部楼层
很漂亮,谢谢分享。
发表于 2013-10-16 09:33:03 | 显示全部楼层
不错不错,学习下
发表于 2013-10-20 22:30:17 | 显示全部楼层
学习 学习~~~~~~~~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2021-3-1 15:52 , Processed in 0.187500 second(s), 13 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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