請選擇 進入手機版 | 繼續訪問電腦版

微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索
回覆 7則 瀏覽 16721篇
Line

[碼源] Autoit 伸縮視窗演示

簽到天數: 13

該用戶今日未簽到

升級   100%

發表於 2013-2-14 00:27 | 顯示全部樓層 |閱讀模式
本帖最後由 rictirse 於 2014-12-24 08:36 編輯

我自己也寫了一個伸縮窗口,
窗口是從上方往下滑出.


<滑出前>

<已滑出>

----------------------------------------------------------------------------------
  1. HotKeySet("{ESC}", "_Ex")
  2. #include <WindowsConstants.au3>
  3. #include <GUIConstantsEx.au3>
  4. #include <EditConstants.au3>
  5. #include <GUIStatusBar.au3>
  6. #include <Array.au3>

  7. $wait = 1 * Sleep(10)
  8. $dll = DllOpen("user32.dll")
  9. $topWin = GUICreate("我是伸縮視窗", 200, 255, -1, -1, -1, $WS_EX_TOPMOST)
  10. Global $LEFT_in = False
  11. Global $RIGHT_in = False
  12. Global $BOTTOM_in = False
  13. Global $topWin_in = False
  14. _winOut($topWin, "out", "top")
  15. $editWin = GUICtrlCreateEdit("", 0, 0, 200, 235, $ES_READONLY)
  16. GUICtrlSetBkColor(-1, 0xFFE0E8)
  17. GUICtrlSetData(-1, "I" & @CRLF &"Love" & @CRLF &"Microduo!!")

  18. GUICtrlSetFont(-1, 14, 800, 0, "Comic Sans MS")
  19. GUICtrlSetColor(-1, 0xff0000)
  20. Local $sTxt[1] = ["By Bunnie"]
  21. $byMe = _GUICtrlStatusBar_Create($topWin, 522, $sTxt)
  22. GUISetState(@SW_SHOWNOACTIVATE, $topWin)

  23. While $wait
  24.     $nMsg = GUIGetMsg(1)
  25.     Select
  26.         Case $nMsg[0] = -3
  27.             _Ex()

  28.         Case _mouseToHovered($topWin, $dll)
  29.             If Not $topWin_in Then
  30.                 _winOut($topWin, "in", "top")
  31.                 $topWin_in = True
  32.             EndIf

  33.         Case Else
  34.             Select
  35.                 Case $topWin_in
  36.                     _winOut($topWin, "out", "top")
  37.                     $topWin_in = False
  38.             EndSelect
  39.     EndSelect
  40. WEnd

  41. Func _mouseToHovered($hWnd, $vDLL = "User32.dll") ;==>滑鼠碰到就滑出
  42.     Local $result
  43.     Local $wPos = WinGetPos($hWnd)
  44.     Local $mPos = MouseGetPos()
  45.     Local $rect = DllStructCreate("int Left;int Top;int Right;int Bottom")
  46.     Local $left = $wPos[0], $top = $wPos[1], $iWidth = $wPos[2], $iHeight = $wPos[3]

  47.     Local $iX = $mPos[0], $iY = $mPos[1]
  48.     DllStructSetData($rect, "Left", $left)
  49.     DllStructSetData($rect, "Top", $top)
  50.     DllStructSetData($rect, "Right", $left + $iWidth)
  51.     DllStructSetData($rect, "Bottom", $top + $iHeight)
  52.     $result = DllCall($vDLL, "int", "PtInRect", "ptr", DllStructGetPtr($rect), "int", $iX, "int", $iY)
  53.     If @error Then
  54.         Return SetError(@error, 0, False)
  55.     EndIf
  56.     Return $result[0] <> 0
  57. EndFunc

  58. Func _winOut($hWnd, $mode, $side) ;==>視窗滑出
  59.     Local $h = 0 - ($side = "left") + ($side = "right"), $v = 0 - ($side = "top") + ($side = "bottom")
  60.     Local $wPos = WinGetPos($hWnd), $m = 0 - ($mode = "in") + ($mode = "out")
  61.     Local $screen_Rs = WinGetPos(WinGetHandle("Program Manager"))

  62.     WinMove($hWnd, "", _
  63.             $screen_Rs[0] - (($h = -1) * ($m = -1) * ($wPos[2] - 10)) _
  64.              + (($h = 1) * (($h = 1) * $screen_Rs[2] - (10 * ($m = -1)) - ($m <> -1) * $wPos[2])) _
  65.              + (($h = 0) * (($h = 0) * ($screen_Rs[2] / 2) - ($wPos[2] / 2))) _
  66.             , _
  67.         $screen_Rs[1] - (($v = -1) * ($m = -1) * ($wPos[3] - 10)) _
  68.              + (($v = 1) * (($v = 1) * $screen_Rs[3] - (10 * ($m = -1)) - ($m <> -1) * $wPos[3])) _

  69.              + (($v = 0) * (($v = 0) * ($screen_Rs[3] / 2) - ($wPos[3] / 2))) _
  70.             )
  71.     $wPos = WinGetPos($hWnd)

  72.     Switch $side
  73.         Case "top", "bottom"
  74.             Local $STEP = (((($v = 1) And ($m = 1)) Or (($v = -1) And ($m = -1))) _
  75.                      - ((($v = -1) And ($m = 1)) Or (($v = 1) And ($m = -1)))) * 10
  76.             Local $FROM = $wPos[1], $TO = $wPos[1] _
  77.                      + (((($v = 1) And ($m = 1)) Or (($v = -1) And ($m = -1))) * ($wPos[3])) _
  78.                      - (((($v = 1) And ($m = -1)) Or (($v = -1) And ($m = 1))) * ($wPos[3])) - $STEP
  79.             For $i = $wPos[1] To $TO Step $STEP
  80.                 WinMove($hWnd, "", $wPos[0], $i)
  81.                 Sleep(10)
  82.             Next

  83.         Case "right", "left"
  84.             Local $STEP = (((($h = 1) And ($m = 1)) Or (($h = -1) And ($m = -1))) _
  85.                      - ((($h = -1) And ($m = 1)) Or (($h = 1) And ($m = -1)))) * 10
  86.             Local $FROM = $wPos[0], $TO = $wPos[0] _

  87.                      + (((($h = 1) And ($m = 1)) Or (($h = -1) And ($m = -1))) * ($wPos[2])) _
  88.                      - (((($h = 1) And ($m = -1)) Or (($h = -1) And ($m = 1))) * ($wPos[2])) - $STEP
  89.             For $i = $wPos[0] To $TO Step $STEP
  90.                 WinMove($hWnd, "", $i, $wPos[1])
  91.                 Sleep(10)
  92.             Next
  93.     EndSwitch
  94. EndFunc

  95. Func _Ex() ;==>離開
  96.     DllClose($dll)
  97.     Exit
  98. EndFunc
複製代碼

  • dll 不失為一個好方法qq

    rictirse 貢獻度 +10

  • 經典美文,原創內容

    gary8349 貢獻度 +10

樓主熱門主題

簽到天數: 189

該用戶今日未簽到

升級   100%

發表於 2013-2-14 09:26 | 顯示全部樓層
本帖最後由 gary8349 於 2013-2-14 09:28 編輯

原來您也通此道~
真是厲害啊~!!
小弟佩服

使用道具

簽到天數: 13

該用戶今日未簽到

升級   100%

 樓主| 發表於 2013-2-14 09:51 | 顯示全部樓層
gary8349 發表於 2013-2-14 09:26
原來您也通此道~
真是厲害啊~!!
小弟佩服

小妹的程式能力還很菜..
還要跟噹噹板主學習呢...



使用道具

該用戶從未簽到

升級   0%

發表於 2013-2-14 14:22 | 顯示全部樓層
本帖最後由 rictirse 於 2013-2-14 14:33 編輯
bunnie 發表於 2013-2-14 09:51
小妹的程式能力還很菜..
還要跟噹噹板主學習呢...

您太抬舉我了
我都快看不懂你在寫什麼了 Orz

我只會簡單的程式撰寫而已..太複雜的沒辦法xd

這是兩段式的,滑鼠移動過去會先露出一部份
如果滑鼠沒移動走250ms後才會彈出全部視窗
減少錯誤觸發



[code=autoit]#include <GUIConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

Dim $FormName = "伸縮視窗"
Dim $Float_FormWidth = 130
Dim $Float_FormHeight = 115

$WinForm1 = GUICreate ( "", $Float_FormWidth, $Float_FormHeight, @DeskTopWidth, 20, $WS_POPUP, $WS_EX_TOOLWINDOW)

GUISetOnEvent ( $GUI_EVENT_CLOSE, "_Exit")

GUISetState (@SW_SHOW, $WinForm1)

WinSetOnTop ( $WinForm1, "", 1)

While True
  _GetPos($WinForm1)
  Sleep (50)
WEnd

Func _GetPos($Form)
  $FormPos = WinGetPos($Form)
  $MousePos = MouseGetPos()

  If $MousePos[0] >= (@DeskTopWidth-2) And $MousePos[1] >= $FormPos[1] And ($FormPos[1]+$FormPos[3]) >= $MousePos[1] Then
    Sleep (250)
    If $MousePos[0] >= $FormPos[0] And $MousePos[1] >= $FormPos[1] And ($FormPos[1]+$FormPos[3]) >= $MousePos[1] Then
      WinMove ($Form,"", @DeskTopWidth-$Float_FormWidth-1, 20,Default,Default,2)
    Else
      WinMove ($Form,"", @DeskTopWidth-5, 20,Default,Default,2)
    EndIf
  ElseIf $MousePos[0] < $FormPos[0] Or $MousePos[1] < $FormPos[1] Or ($FormPos[1]+$FormPos[3]) < $MousePos[1] Then
    WinMove ($Form,"", @DeskTopWidth, 20,Default,Default,2)
  EndIf
EndFunc

Func _Exit()
  Exit
EndFunc[/code]

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x

使用道具

簽到天數: 13

該用戶今日未簽到

升級   100%

 樓主| 發表於 2013-2-14 20:10 | 顯示全部樓層
本帖最後由 bunnie 於 2013-2-14 23:16 編輯
rictirse 發表於 2013-2-14 14:22
您太抬舉我了
我都快看不懂你在寫什麼了 Orz

我的技術還很菜,
我很喜歡噹噹的教學,
我很多東西還是必須要向你學習的,
有一次無意間在網上被我發現這個地方,
台灣難得有一個這麼漂亮,
這麼有制度的論壇,

可以讓我好好學習,

這真是我的榮幸,
我真的很開心 :-)
彼此多多交流,
教學相長嘛~


使用道具

簽到天數: 189

該用戶今日未簽到

升級   100%

發表於 2013-2-14 20:17 | 顯示全部樓層
rictirse 發表於 2013-2-14 14:22
您太抬舉我了
我都快看不懂你在寫什麼了 Orz

疑 (?
這個好像可以整人耶 (嘿嘿...
謝謝噹噹~!!

使用道具

該用戶從未簽到

升級   0%

發表於 2013-2-14 22:19 | 顯示全部樓層
gary8349 發表於 2013-2-14 20:17
疑 (?
這個好像可以整人耶 (嘿嘿...
謝謝噹噹~!!

整人QQ 怎麼說XDD?

使用道具

簽到天數: 189

該用戶今日未簽到

升級   100%

發表於 2013-2-14 22:55 | 顯示全部樓層
rictirse 發表於 2013-2-14 22:19
整人QQ 怎麼說XDD?

哈哈
阿就設計一下
就可以把對電腦不熟的朋友整得團團轉啦~XDDD

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2024-3-28 22:14

Discuz! X

© 2009-2023 Microduo

快速回覆 返回頂部 返回列表