Trở về
Tham gia nhóm m Autoit đ đưc hưng dn và gii đáp trc tiếp : http://fb.com/groups/autoitscript
Tin tức công nghệ  -  Thủ thuật lập trình

Sunday, September 29, 2013

Giao diện đăng nhập Metro UI cho phần mềm - Autoit


Toàn màn hìnhIn bài viết

Giao diện chương trình :





Mã nguồn : (Các bạn save lại với tên tùy thích)

#region INCLUDES
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include "GUICtrlOnHover.au3"
#endregion

#region RUNTIME OPTIONS
Opt("GUIOnEventMode", 1)
HotKeySet("{ESC}", "close")
#endregion

#region GLOBAL VARIABLES
Global     $appTitle = "LOGIN"
Global     $appSubTitle = "phuchuy_alias@yahoo.com"

;month names strings
Global     $monthNames[13]
        $monthNames[1]="January"
        $monthNames[2]="February"
        $monthNames[3]="March"
        $monthNames[4]="April"
        $monthNames[5]="May"
        $monthNames[6]="June"
        $monthNames[7]="July"
        $monthNames[8]="August"
        $monthNames[9]="September"
        $monthNames[10]="October"
        $monthNames[11]="November"
        $monthNames[12]="December"

;username and password strings
Global    $usernametxt = "Username";"Usuario..."
Global    $passwordtxt = "Password";"Contrase񡮮."


;enter and exit strings
Global    $nexttxt = "Login";"Entrar"
Global    $exittxt = "Exit";"Salir"

;dialog size, this is the gray area.
Global $wsizew = 800 + 224 - 334;you can use any size and the content will adapt unless there is no room left, as far as I have tested...
Global $wsizeh = 600 + 168 - 200

;New [0,0] coordinates, the top left corner of the gray area.
$wdleft = (@DesktopWidth - $wsizew) / 2
$wdtop = (@DesktopHeight - $wsizeh) / 2
#endregion

#region GUI
Global $gui = GUICreate($appTitle, @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
GUISetBkColor(0X101010)


;Dialog Background
GUICtrlCreatePic("gui\grey.bmp", $wdleft + 10, $wdtop + 10, $wsizew - 20, $wsizeh - 20)
GUICtrlSetState(-1, $GUI_DISABLE)


;Title and Subtitle
$title = GUICtrlCreateLabel($appTitle, -430, $wdtop + 10, 370, 150)
GUICtrlSetFont(-1, 84, Default, Default, "Segoe UI Light", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$subtitle = GUICtrlCreateLabel($appSubTitle, -430, $wdtop + 140, 317, 30);297
GUICtrlSetFont(-1, 14, Default, Default, "Segoe UI Light", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)


;Date and Clock
$datemonth= GUICtrlCreateLabel("Enero", $wdleft + $wsizew - 155, $wdtop + 30, 100, 30, 0x0002);+0x1000)
GUICtrlSetFont(-1, 14, Default, Default, "Segoe UI Light", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$dateday = GUICtrlCreateLabel("1", $wdleft + $wsizew - 50, $wdtop + 14, 40, 50);+0x1000)
GUICtrlSetFont(-1, 24, Default, Default, "Segoe UI Light", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$lbhour = GUICtrlCreateLabel("", $wdleft + $wsizew - 135, $wdtop + 50, 100, 50, 0x0002);+0x1000)
GUICtrlSetFont(-1, 24, Default, Default, "Segoe UI", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$lbhourampm = GUICtrlCreateLabel("a", $wdleft + $wsizew - 30, $wdtop + 50, 35, 40);,0x1000)
GUICtrlSetFont(-1, 14, Default, Default, "Segoe UI", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$lbhourampmfix = GUICtrlCreateLabel("m", $wdleft + $wsizew - 30, $wdtop + 70, 35, 40);+0x1000)
GUICtrlSetFont(-1, 12, Default, Default, "Segoe UI", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

UpdateTime()
AdlibRegister("UpdateTime", 1000)


;lockpad picture
GUICtrlCreatePic("gui\lockpad.bmp", $wdleft + ($wsizew / 2) - (120 / 2), $wdtop + 200, 120, 160)
GUICtrlSetState(-1, $GUI_DISABLE)


;Username Input
GUICtrlCreatePic("gui\input.bmp", $wdleft + ($wsizew / 2) - (332 / 2), $wdtop + 380, 332, 45)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreatePic("gui\user.bmp", $wdleft + ($wsizew / 2) - (332 / 2) + 10, $wdtop + 380 + 10, 30, 30)
GUICtrlSetState(-1, $GUI_DISABLE)

$inputUsername = GUICtrlCreateInput("", $wdleft + ($wsizew / 2) - (300 / 2) + 30, $wdtop + 380 + 7, 300 - 30, 30, 0x0001, 0);username...
GUICtrlSetFont(-1, 17, 800, Default, "Segoe UI Bold", 5)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, False, $usernametxt)


;Password Input
GUICtrlCreatePic("gui\input.bmp", $wdleft + ($wsizew / 2) - (332 / 2), $wdtop + 430, 332, 45)
GUICtrlSetState(-1, $GUI_DISABLE)

GUICtrlCreatePic("gui\key.bmp", $wdleft + ($wsizew / 2) - (332 / 2) + 10, $wdtop + 430 + 10, 50, 23)
GUICtrlSetState(-1, $GUI_DISABLE)

$inputPassword = GUICtrlCreateInput("", $wdleft + ($wsizew / 2) - (300 / 2) + 50, $wdtop + 430 + 7, 300 - 50, 30, 0x0001 + $ES_PASSWORD, 0);password...
GUICtrlSetFont(-1, 17, 800, Default, "Segoe UI", 5)
GUICtrlSendMsg(-1, $EM_SETCUEBANNER, False, $passwordtxt)

;Button Next
$ButtonNextimg = GUICtrlCreatePic("gui\blueb1.bmp", $wdleft + ($wsizew / 2) + 20, $wdtop + 500, 144, 51)
GUICtrlSetState(-1, $GUI_DISABLE)

$ButtonNext = GUICtrlCreateLabel($nexttxt, $wdleft + ($wsizew / 2) + 20, $wdtop + 500, 144, 51, 0x0001); enter the system
GUICtrlSetFont(-1, 24, 800, Default, "Segoe UI", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

_GUICtrl_OnHoverRegister(-1, "_Hover_Proc", "_Leave_Hover_Proc", "PrimaryDown_Proc")


;Button Exit
$ButtonExitimg = GUICtrlCreatePic("gui\redb1.bmp", $wdleft + ($wsizew / 2) - 184 + 20, $wdtop + 500, 144, 51)
GUICtrlSetState(-1, $GUI_DISABLE)

$ButtonExit = GUICtrlCreateLabel($exittxt, $wdleft + ($wsizew / 2) - 184 + 20, $wdtop + 500, 144, 51, 0x0001); enter the system
GUICtrlSetFont(-1, 24, 800, Default, "Segoe UI", 5)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

_GUICtrl_OnHoverRegister(-1, "_Hover_Proc", "_Leave_Hover_Proc", "PrimaryDown_Proc")

ControlFocus($gui, "", $ButtonExit)
DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $gui, "int", 1000, "long", 0x00080000);fade-in
GUISetState(@SW_SHOW)
Sleep(500)

#endregion


#region INTRO ANIMATION
For $lp = -430 To 80 Step 8
GUICtrlSetPos($title, $wdleft + $lp)
Next

For $lp = 80 To 20 Step -4
GUICtrlSetPos($title, $wdleft + $lp)
Sleep(10)
Next

Sleep(500)
For $lp = -430 To 80 Step 8
    GUICtrlSetPos($subtitle, $wdleft+$lp)
Next

For $lp = 80 To 25 Step -4
ControlFocus($gui, "", $inputUsername)
GUICtrlSetPos($subtitle, $wdleft + $lp)
Sleep(10)
Next


#endregion

#region LOOP
While 1
Sleep(1000)
WEnd
#endregion
#region ON HOVER FUNCTIONS
Func _Hover_Proc($iCtrlID)
    Switch $iCtrlID
      Case $ButtonNext
       GUICtrlSetImage($ButtonNextimg, "gui\blueb2.bmp")
      Case $ButtonExit
       GUICtrlSetImage($ButtonExitimg, "gui\redb2.bmp")
    EndSwitch
EndFunc   ;==>_Hover_Proc

Func _Leave_Hover_Proc($iCtrlID)
    Switch $iCtrlID
      Case $ButtonNext
       GUICtrlSetImage($ButtonNextimg, "gui\blueb1.bmp")
      Case $ButtonExit
       GUICtrlSetImage($ButtonExitimg, "gui\redb1.bmp")
    EndSwitch
EndFunc   ;==>_Leave_Hover_Proc

Func PrimaryDown_Proc($iCtrlID)
    Switch $iCtrlID
      Case $ButtonNext
       GUICtrlSetImage($ButtonNextimg, "gui\blueb1.bmp")
       if GUICtrlRead($inputUsername)='Yagami Raito' and GUICtrlRead($inputPassword)='bluesky' then
       MsgBox(0, "Ok", "Welcome")
   Else
       MsgBox(0, "Error", "Wrong username or password")
       endif
      Case $ButtonExit
       GUICtrlSetImage($ButtonExitimg, "gui\redb1.bmp")
       DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $gui, "int", 1000, "long", 0x00090000);fade-out
       Exit
    EndSwitch
EndFunc   ;==>PrimaryDown_Proc

#endregion

#region TIME FUNCTION
Func UpdateTime()
    Local $hour = @HOUR
    Local $ampm = "a"

    If Number($hour) > 12 Then
      $hour = "0" & $hour - 12
      $ampm = "p"
    EndIf

    If $hour = "00" Then $hour = 12

    If GUICtrlRead($lbhour) <> $hour & ":" & @MIN Then
      GUICtrlSetData($lbhour, $hour & ":" & @MIN)
      GUICtrlSetData($lbhourampm, $ampm)
    EndIf

    If GUICtrlRead($lbhourampm) <> $ampm Then
      GUICtrlSetData($lbhourampm, $ampm)
    EndIf

    Local $month = $monthNames[Number(@MON)]

    If GUICtrlRead($datemonth) <> $month Then
      GUICtrlSetData($datemonth, $month)
    EndIf

    If GUICtrlRead($dateday) <> @MDAY Then
      GUICtrlSetData($dateday, @MDAY)
    EndIf
EndFunc   ;==>UpdateTime
#endregion

#region OTHER FUNCTIONS
Func close()



DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $gui, "int", 1000, "long", 0x00090000);fade-out

    Exit
EndFunc   ;==>close
#endregion

UDF kèm theo : (Các bạn save lại với tên : GUICtrlOnHover.au3)

#Region Header

#include-once

#CS UDF Info

    Name.........:      GUICtrlOnHover.au3
    Forum link...:      http://www.autoitscript.com/forum/index.php?s=&showtopic=55120
    Author.......:      G.Sandler a.k.a MrCreatoR (CreatoR's Lab, www.creator-lab.ucoz.ru, www.autoit-script.ru)
    Remarks......:     
                        1)    TreeView/ListView Items can not be set :(.
                        2)    When the window is not active, the hover/leave hover functions will still called, but not when the window is disabled.
                        3)    The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox().
                        4)    The $sHover_Func/$sLeaveHover_Func functions should not introduce significant delays in the main script,
                            for example by calling functions like Sleep() or MsgBox().
                        5) IMPORTANT!
                            A)    Do not call _GUICtrl_OnHoverRegister inside $sHover_Func/$sLeaveHover_Func functions, it's not a good idea.
                           
                            B)    This UDF registering WM_COMMAND and WM_LBUTTONDOWN window messages.
                                Please ensure that those messages are not used after including this library,
                                if they do, you will have to call __GUICtrl_SOH_WM_COMMAND and __GUICtrl_SOH_WM_LBUTTONDOWN inside those functions. Example:
                               
                                Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
                                    __GUICtrl_SOH_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
                                     ...
                                EndFunc
   
   
    *** Version History ***
   
    [v2.0] - [09.06.2010]
    * Fixed potential issue with calling $sPrimaryDownFunc function (first call was performed only after recieving WM_COMMAND message, wich is the control event).
    * Fixed an issue with blocking the OnHover function - the OnLeaveHover function was not called untill the OnHover function was blocked.
    * Fixed(?) (again) issue when the UDF is not working under 64-bit OS.
    * Optimized internal "__GUICtrl_SOH_Call" function to work faster when calling parameters functions.
   
    [v1.9] - [21.05.2010]
    * UDF library now compatible with AutoIt 3.3.6.1.
    * UDF library renamed to GUICtrlOnHover.au3.
    * Changed the main function name to _GUICtrl_OnHoverRegister, For backwards compatibility reasons, other (old) function names are still supported:
        _GUICtrl_SetOnHover, GUICtrl_SetOnHover, GUICtrlSetOnHover, _GUICtrlSetOnHover
   
    * Fixed(?) issue when the UDF is not working under 64-bit OS.
    * Global variables and internal functions renaming (for "cosmetic" reasons only).
    * UDF's code is more readable now.
   
   
    [v1.8] - [28.09.2009]
    * Few Global variables now have more unique name.
    * Fixed an issue with false calling of function on PrimaryDown event.
        I.e when the user clicks on other place (not on the hovered control) and drag the cursor to the control, the PrimaryDown function was called.
    * Due to (and as a result of) previous issue, the UDF now registering WM_COMMAND and WM_LBUTTONDOWN messages at first UDF call.
   
   
    [v1.7] - [07.07.2009]
    + Added _GUICtrl_SetHoverOnBackWindow...
        Allows to set the hovering mode:
                $iSetBackWin = 1 (default) hovering process will proceed even when GUI is not active (in background).
                $iSetBackWin <> 1 hovering process will NOT proceed when GUI is not active.
   
   
    [v1.6] - [12.06.2009]
    * Now the UDF compatible with scripts (or other udfs) that uses OnAutoItExit function.
        i.e: "OnAutoItExit" function that was *previously* set by user will be called as well.
   
    + Added new parameter $iKeepCall_Hover_Func. If this parameter = 1,
        then the $sHover_Func function *Will* be called constantly untill the control is no longer been hovered
        (default is 0, do not call the function constantly).
    + Added new arguments to calling function...
        The OnPrimaryDown/Up function now can recieve one more argument:
            $iClickMode - Defines the Click mode (1 - Pressed, 2 - Released)
   
    * Changed return value - function will return 2 when $iCtrlID is redefined (ReSet, already exists in the controls list).
    * Fixed incorrect documentation parts.
    * Fixed "OnClick" handeling. When using multiple GUIs, the active gui was not recognized properly.
    * Fixed(?) bug with "dimension range exceeded" when trying to UnSet a Control.
   
    [v1.5]
    + Added AutoIt 3.2.10.0+ support, but 3.2.8.1 or less is dropped :( (due to lack of native CallBack functions).
    + Added Primary Down and Primary Up support. Helping to handle with the buttons pressing.
    + Added new arguments to calling function...
        The OnHover function now can recieve two more arguments:
            $iHoverMode - Defines the hover mode (1 - Hover, 2 - Leaves Hovering)
            $hWnd_Hovered - Control Handle where the mouse is moved to (after hovering).
   
    * Almost all code of this UDF was rewritted.
    * Now the main function name is _GUICtrl_SetOnHover(),
        but for backwards compatibility reasons, other (old) function names are still supported.
    * Fixed bug with hovering controls in other apps.
    * Improvements in generaly, the UDF working more stable now.
   
    [v1.?]
    * Beta changes, see "Forum link" for more details.
   
    [v1.0]
    * First release.

#CE

#EndRegion Header

#Region Internal Global Variables

Global $a__GUICtrl_SOH_Ctrls[1][1]
Global $a__GUICtrl_SOH_LastHoveredElements[2]         = [-1, -1]
Global $a__GUICtrl_SOH_LastHoveredElementsMark         = -1
Global $h__GUICtrl_SOH_LastClickedElementMark         = -1
Global $i__GUICtrl_SOH_CtrlsModified                = 0
Global $i__GUICtrl_SOH_HoverOnBackWin                = 1
Global $i__GUICtrl_SOH_LastPrimaryDownCtrlID        = 0

Global $p__GUICtrl_SOH_TimerProc                     = 0
Global $i__GUICtrl_SOH_TimerID                         = 0

Global $s__GUICtrl_SOH_User32_Dll                    = @SystemDir & "\User32.dll"
Global $s__GUICtrl_SOH_OnExitFunc                     = ""

If @AutoItVersion < "3.3.2.0" Then
    $s__GUICtrl_SOH_OnExitFunc = Execute('Opt("OnExitFunc", "__GUICtrl_SOH_Exit")')
Else
    Execute('OnAutoItExitRegister("__GUICtrl_SOH_Exit")')
EndIf

Global Const $n__GUICtrl_SOH_WM_COMMAND                = 0x0111
Global Const $n__GUICtrl_SOH_WM_LBUTTONDOWN            = 0x0201

#EndRegion Internal Global Variables

#Region Public Functions

; #FUNCTION# ====================================================================================================
; Name...........:    _GUICtrl_OnHoverRegister
; Description....:    Registers a function to be called when GUI elements been hovered.
; Syntax.........:    _GUICtrl_OnHoverRegister($iCtrlID [, $sHover_Func="" [, $sLeaveHover_Func=-1 [, $sPrimaryDownFunc=-1 [, $sPrimaryUpFunc=-1 [, $iKeepCall_PrDn_Func=1 [, $iKeepCall_Hover_Func=0 ]]]]]])
;
; Parameters.....:    $iCtrlID              - The Ctrl ID to set hovering for (can be a -1 as indication to the last item created).
;
;                   $sHover_Func          - [Optional] Function to call when the mouse is hovering the control.
;                                             If this parameter passed as empty string (""),
;                                             then the specified CtrlID is UnSet from Hovering Handler list.
;
;                   $sLeaveHover_Func     - [Optional] Function to call when the mouse is leaving hovering the control
;                       (-1 no function used).
;                     * For both parameters, $sHover_FuncName and $sLeaveHover_FuncName,
;                       the specified function called with maximum 3 parameters:
;                                                     $iCtrlID      - CtrlID of hovered control.
;                                                     $iHoverMode   - Defines the hover mode (1 - Hover, 2 - Leaves Hovering).
;                                                     $hWnd_Hovered - Control Handle where the mouse is moved to (after hovering).
;
;                   $sPrimaryDownFunc     - [Optional] Function to call when Primary mouse button is *clicked* on the control.
;                       (-1 -> function is not called).
;
;                   $sPrimaryUpFunc       - [Optional] Function to call when Primary mouse button is *released* the control.
;                       (-1 -> function is not called).
;
;                     * For both parameters, $sPrimaryDownFunc and $sPrimaryUpFunc,
;                       the specified function called with maximum 2 parameters:
;                                                     $iCtrlID      - CtrlID of clicked control.
;                                                     $iClickMode   - Defines the click mode (1 - Pressed, 2 - Released).
;
;                   $iKeepCall_PrDn_Func  - [Optional] If this parameter < 1,
;                                            then the $sPrimaryDownFunc function will *Not* be called constantly untill
;                                            the primary mouse button is released (default behaviour - $iKeepCall_PrDn_Func = 1).
;
;                   $iKeepCall_Hover_Func - [Optional] If this parameter = 1,
;                                            then the $sHover_Func function *Will* be called constantly untill
;                                            the control is no longer been hovered (default behaviour - $iKeepCall_Hover_Func = 0).
;                   
; Return values..:    Success               - Returns 1 if the function registered succesefully.
;                                           When $iCtrlID is redefined (ReSet, already exists in the controls list), the return value is 2.
;                    Failure               - Set @error to 1 and return 0 if $iCtrlID is not a GUI Control Identifier.
;
; Author.........:    G.Sandler (a.k.a CreatoR), www.creator-lab.ucoz.ru, www.autoit-script.ru.
; Modified.......:   
; Remarks........:    1) TreeView/ListView Items can not be set :(.
;                   2) When the window is not active, the hover/leave hover functions will still called, but not when the window is disabled.
;                   3) The hover/leave hover functions will be called even if the script is paused by such functions as MsgBox().
;                   4) The $sHover_Func/$sLeaveHover_Func functions should not introduce significant delays in the main script,
;                      for example by calling functions like Sleep() or MsgBox().
;                   5) IMPORTANT!
;                      A) Do not call _GUICtrl_OnHoverRegister inside $sHover_Func/$sLeaveHover_Func functions, it's not a good idea.
;
;                      B) This UDF registering WM_COMMAND and WM_LBUTTONDOWN window messages.
;                      Please ensure that those messages are not used after including this library,
;                      if they do, you will have to call __GUICtrl_SOH_WM_COMMAND and __GUICtrl_SOH_WM_LBUTTONDOWN inside those functions. Example:
;
;                            Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
;                                __GUICtrl_SOH_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
;                                 ...
;                            EndFunc
;
; Related........:   
; Link...........:    http://www.autoitscript.com/forum/index.php?s=&showtopic=55120
; Example........:    Yes.
; ===============================================================================================================
Func _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0)
    Local $hCtrlID = GUICtrlGetHandle($iCtrlID)
   
    If Not $hCtrlID Then
        Return SetError(1, 0, 0)
    EndIf
   
    If $p__GUICtrl_SOH_TimerProc = 0 Then
        $p__GUICtrl_SOH_TimerProc = DllCallbackRegister("__GUICtrl_SOH_CALLBACK", "none", "hwnd;int;uint_ptr;dword")
        $i__GUICtrl_SOH_TimerID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "SetTimer", _
            "hwnd", 0, "uint_ptr", Round(TimerInit()), "uint", 30, "ptr", DllCallbackGetPtr($p__GUICtrl_SOH_TimerProc))
       
        GUIRegisterMsg($n__GUICtrl_SOH_WM_COMMAND, "__GUICtrl_SOH_WM_COMMAND")
        GUIRegisterMsg($n__GUICtrl_SOH_WM_LBUTTONDOWN, "__GUICtrl_SOH_WM_LBUTTONDOWN")
       
        If IsArray($i__GUICtrl_SOH_TimerID) Then
            $i__GUICtrl_SOH_TimerID = $i__GUICtrl_SOH_TimerID[0]
        EndIf
    EndIf
   
    ;UnSet Hovering for specified control (remove control id from hovering checking process)
    If $sHover_Func = "" And @NumParams <= 2 Then
        Local $a__GUICtrl_SOH_Ctrls_Tmp[1][1]
        Local $a__GUICtrl_SOH_Ctrls_Swap = $a__GUICtrl_SOH_Ctrls ;This one prevents a bug with "dimension range exceeded"
       
        For $i = 1 To $a__GUICtrl_SOH_Ctrls_Swap[0][0]
            If $hCtrlID <> $a__GUICtrl_SOH_Ctrls_Swap[$i][0] Then
                $a__GUICtrl_SOH_Ctrls_Tmp[0][0] += 1
                ReDim $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]+1][7]
               
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][0] = $a__GUICtrl_SOH_Ctrls_Swap[$i][0]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][1] = $a__GUICtrl_SOH_Ctrls_Swap[$i][1]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][2] = $a__GUICtrl_SOH_Ctrls_Swap[$i][2]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][3] = $a__GUICtrl_SOH_Ctrls_Swap[$i][3]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][4] = $a__GUICtrl_SOH_Ctrls_Swap[$i][4]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][5] = $a__GUICtrl_SOH_Ctrls_Swap[$i][5]
                $a__GUICtrl_SOH_Ctrls_Tmp[$a__GUICtrl_SOH_Ctrls_Tmp[0][0]][6] = $a__GUICtrl_SOH_Ctrls_Swap[$i][6]
            EndIf
        Next
       
        If $a__GUICtrl_SOH_Ctrls_Tmp[0][0] < 1 Then
            __GUICtrl_SOH_ReleaseResources() ;Release the callbacks
        Else
            $i__GUICtrl_SOH_CtrlsModified = 1
            $a__GUICtrl_SOH_Ctrls = $a__GUICtrl_SOH_Ctrls_Tmp
        EndIf
       
        Return 1
    EndIf
   
    ;Check if the hovering process already handle the passed CtrlID, if so, just assign new values (functions)
    For $i = 1 To $a__GUICtrl_SOH_Ctrls[0][0]
        If $hCtrlID = $a__GUICtrl_SOH_Ctrls[$i][0] Then
            $a__GUICtrl_SOH_Ctrls[$i][0] = $hCtrlID
            $a__GUICtrl_SOH_Ctrls[$i][1] = $sHover_Func
            $a__GUICtrl_SOH_Ctrls[$i][2] = $sLeaveHover_Func
            $a__GUICtrl_SOH_Ctrls[$i][3] = $sPrimaryDownFunc
            $a__GUICtrl_SOH_Ctrls[$i][4] = $sPrimaryUpFunc
            $a__GUICtrl_SOH_Ctrls[$i][5] = $iKeepCall_PrDn_Func
            $a__GUICtrl_SOH_Ctrls[$i][6] = $iKeepCall_Hover_Func
           
            Return 2
        EndIf
    Next
   
    $a__GUICtrl_SOH_Ctrls[0][0] += 1
    ReDim $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]+1][7]
   
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][0] = $hCtrlID
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][1] = $sHover_Func
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][2] = $sLeaveHover_Func
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][3] = $sPrimaryDownFunc
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][4] = $sPrimaryUpFunc
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][5] = $iKeepCall_PrDn_Func
    $a__GUICtrl_SOH_Ctrls[$a__GUICtrl_SOH_Ctrls[0][0]][6] = $iKeepCall_Hover_Func
   
    Return 1
EndFunc

;Set the hovering mode:
;                      $iSetBackWin = 1 (default) hovering process will proceed even when GUI is not active (in background).
;                      $iSetBackWin <> 1 hovering process will NOT proceed when GUI is not active.
Func _GUICtrl_SetHoverOnBackWindow($iSetBackWin)
    $i__GUICtrl_SOH_HoverOnBackWin = Number($iSetBackWin = 1)
EndFunc

#EndRegion Public Functions

#Region Backwards Compatibility Functions

;Backwards compatibility function #1
Func _GUICtrl_SetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0)
    _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func)
EndFunc

;Backwards compatibility function #2
Func GUICtrl_SetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0)
    _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func)
EndFunc

;Backwards compatibility function #3
Func GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0)
    _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func)
EndFunc

;Backwards compatibility function #4
Func _GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCall_PrDn_Func=1, $iKeepCall_Hover_Func=0)
    _GUICtrl_OnHoverRegister($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCall_PrDn_Func, $iKeepCall_Hover_Func)
EndFunc

#EndRegion Backwards Compatibility Functions

#Region Internal Functions

;CallBack function to handle the hovering process
Func __GUICtrl_SOH_CALLBACK($hWnd, $uiMsg, $idEvent, $dwTime)
    $i__GUICtrl_SOH_CtrlsModified = 0
   
    If $a__GUICtrl_SOH_Ctrls[0][0] < 1 Then
        Return
    EndIf
   
    If $i__GUICtrl_SOH_HoverOnBackWin Then
        Local $iControl_Hovered = __GUICtrl_SOH_ControlGetHovered()
    Else
        Local $iControl_Hovered = GUIGetCursorInfo()
       
        If Not IsArray($iControl_Hovered) Then
            Return
        EndIf
       
        $iControl_Hovered = GUICtrlGetHandle($iControl_Hovered[4])
    EndIf
   
    Local $sCheck_LHE = $a__GUICtrl_SOH_LastHoveredElements[1]
    Local $iCheck_LCEM = $h__GUICtrl_SOH_LastClickedElementMark
    Local $iCtrlID
   
    ;Leave Hovering Process and reset variables
    If Not $iControl_Hovered Or ($sCheck_LHE <> -1 And $iControl_Hovered <> $sCheck_LHE) Then
        If $a__GUICtrl_SOH_LastHoveredElementsMark = -1 Then
            Return
        EndIf
       
        Local $a__Tmp_GUICtrl_SOH_LastHoveredElements[2] = [$a__GUICtrl_SOH_LastHoveredElements[0], $a__GUICtrl_SOH_LastHoveredElements[1]]
       
        $a__GUICtrl_SOH_LastHoveredElements[0] = -1
        $a__GUICtrl_SOH_LastHoveredElements[1] = -1
        $a__GUICtrl_SOH_LastHoveredElementsMark = -1
        $h__GUICtrl_SOH_LastClickedElementMark = -1
       
        If $a__Tmp_GUICtrl_SOH_LastHoveredElements[0] <> -1 Then
            $iCtrlID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "GetDlgCtrlID", "hwnd", $a__Tmp_GUICtrl_SOH_LastHoveredElements[1])
           
            If IsArray($iCtrlID) Then
                $iCtrlID = $iCtrlID[0]
            EndIf
           
            ;2 is the indicator of OnLeavHover process
            __GUICtrl_SOH_Call($a__Tmp_GUICtrl_SOH_LastHoveredElements[0], $iCtrlID, 2, $iControl_Hovered)
        EndIf
    Else ;Hovering Process, Primary Down/Up handler, and set $a__GUICtrl_SOH_LastHoveredElements
        If $i__GUICtrl_SOH_CtrlsModified = 1 Then
            $i__GUICtrl_SOH_CtrlsModified = 0
            Return
        EndIf
       
        Local $iUbound = UBound($a__GUICtrl_SOH_Ctrls)-1
       
        For $i = 1 To $a__GUICtrl_SOH_Ctrls[0][0]
            If $i > $iUbound Then
                ExitLoop
            EndIf
           
            If $a__GUICtrl_SOH_Ctrls[$i][0] = $iControl_Hovered Then
                $iCtrlID = DllCall($s__GUICtrl_SOH_User32_Dll, "int", "GetDlgCtrlID", "hwnd", $iControl_Hovered)
               
                If IsArray($iCtrlID) Then
                    $iCtrlID = $iCtrlID[0]
                EndIf
               
                ;Primary Down/Up handler
                If ($a__GUICtrl_SOH_Ctrls[$i][3] <> "" Or $a__GUICtrl_SOH_Ctrls[$i][4] <> "") And ($iCheck_LCEM = -1 Or $iCheck_LCEM = $iControl_Hovered) Then
                    Local $aCursorInfo = 0
                    Local $hParent_Wnd = DllCall($s__GUICtrl_SOH_User32_Dll, "hwnd", "GetParent", "hwnd", $iControl_Hovered)
                   
                    If Not @error And IsArray($hParent_Wnd) Then
                        $hParent_Wnd = $hParent_Wnd[0]
                        $aCursorInfo = GUIGetCursorInfo($hParent_Wnd)
                    Else
                        $aCursorInfo = GUIGetCursorInfo()
                    EndIf
                   
                    If IsArray($aCursorInfo) Then
                        ;Primary Down...
                        ;* First condition is to prevent function call when holding down m.button from other control
                        ;* Last condition is to Prevent/Allow multiple function call
                        ;(depending on $iKeepCall_PrDn_Func param).
                        If ($i__GUICtrl_SOH_LastPrimaryDownCtrlID = $iControl_Hovered Or $i__GUICtrl_SOH_LastPrimaryDownCtrlID = 0) And WinActive($hParent_Wnd) And _
                            $aCursorInfo[2] = 1 And $a__GUICtrl_SOH_Ctrls[$i][3] <> -1 And _
                            (($a__GUICtrl_SOH_Ctrls[$i][5] < 1 And $iCheck_LCEM <> $iControl_Hovered) Or $a__GUICtrl_SOH_Ctrls[$i][5] > 0) Then
                           
                            ;1 is the indicator of Primary*Down* event
                            __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][3], $iCtrlID, 1)
                           
                            $h__GUICtrl_SOH_LastClickedElementMark = $iControl_Hovered
                        ;Primary Up
                        ElseIf $aCursorInfo[2] = 0 And $a__GUICtrl_SOH_Ctrls[$i][4] <> -1 And $iCheck_LCEM = $iControl_Hovered Then
                            ;2 is the indicator of Primary*Up* event
                            __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][4], $iCtrlID, 2)
                           
                            $h__GUICtrl_SOH_LastClickedElementMark = -1
                        EndIf
                    EndIf
                EndIf
               
                If $i__GUICtrl_SOH_CtrlsModified = 1 Then
                    ExitLoop
                EndIf
               
                If $a__GUICtrl_SOH_Ctrls[$i][6] < 1 And $a__GUICtrl_SOH_LastHoveredElementsMark = $a__GUICtrl_SOH_Ctrls[$i][0] Then
                    ExitLoop
                Else
                    $a__GUICtrl_SOH_LastHoveredElementsMark = $a__GUICtrl_SOH_Ctrls[$i][0]
                EndIf
               
                If $a__GUICtrl_SOH_Ctrls[$i][2] <> -1 Then
                    $a__GUICtrl_SOH_LastHoveredElements[0] = $a__GUICtrl_SOH_Ctrls[$i][2]
                    $a__GUICtrl_SOH_LastHoveredElements[1] = $iControl_Hovered
                EndIf
               
                __GUICtrl_SOH_Call($a__GUICtrl_SOH_Ctrls[$i][1], $iCtrlID, 1, 0) ;1 is the indicator of OnHover process
               
                If $i__GUICtrl_SOH_CtrlsModified = 1 Then
                    ExitLoop
                EndIf
               
                ExitLoop
            EndIf
        Next
    EndIf
   
    $i__GUICtrl_SOH_CtrlsModified = 0
EndFunc

Func __GUICtrl_SOH_WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
    $i__GUICtrl_SOH_LastPrimaryDownCtrlID = $LParam
EndFunc

Func __GUICtrl_SOH_WM_LBUTTONDOWN($hWndGUI, $MsgID, $WParam, $LParam)
    $i__GUICtrl_SOH_LastPrimaryDownCtrlID = 0
EndFunc

;Thanks to amel27 for that one!!!
Func __GUICtrl_SOH_ControlGetHovered()
    Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
    Local $tPoint = DllStructCreate("int X;int Y")
    Local $aMPos = MouseGetPos()
   
    DllStructSetData($tPoint, "x", $aMPos[0])
    DllStructSetData($tPoint, "y", $aMPos[1])
   
    Local $tPointCast = DllStructCreate("int64", DllStructGetPtr($tPoint))
    Local $aRet = DllCall($s__GUICtrl_SOH_User32_Dll, "hwnd", "WindowFromPoint", "int64", DllStructGetData($tPointCast, 1))
   
    Opt("MouseCoordMode", $iOld_Opt_MCM)
   
    If @error Then
        Return SetError(@error, @extended, 0)
    EndIf
   
    Return $aRet[0]
EndFunc

;Call() function wrapper
Func __GUICtrl_SOH_Call($sFunction, $sParam1="", $sParam2="", $sParam3="", $sParam4="", $sParam5="")
    Local $iRet = Call($sFunction)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    $iRet = Call($sFunction, $sParam1, $sParam2, $sParam3, $sParam4, $sParam5)
   
    If @error <> 0xDEAD Then
        Return $iRet
    EndIf
   
    Return SetError(1, 0, 0)
EndFunc

;Release resources function
Func __GUICtrl_SOH_ReleaseResources()
    If $p__GUICtrl_SOH_TimerProc > 0 Then
        DllCallbackFree($p__GUICtrl_SOH_TimerProc)
    EndIf
   
    If $i__GUICtrl_SOH_TimerID > 0 Then
        DllCall($s__GUICtrl_SOH_User32_Dll, "int", "KillTimer", "hwnd", 0, "uint_ptr", $i__GUICtrl_SOH_TimerID)
    EndIf
   
    GUIRegisterMsg($n__GUICtrl_SOH_WM_COMMAND, "")
    GUIRegisterMsg($n__GUICtrl_SOH_WM_LBUTTONDOWN, "")
   
    $p__GUICtrl_SOH_TimerProc = 0
    $i__GUICtrl_SOH_TimerID = 0
EndFunc

;Release the CallBack resources when exit
Func __GUICtrl_SOH_Exit()
    If $s__GUICtrl_SOH_OnExitFunc <> "" Then
        Call($s__GUICtrl_SOH_OnExitFunc)
    EndIf
   
    __GUICtrl_SOH_ReleaseResources()
EndFunc

#EndRegion Internal Functions

Images : (Các bạn tạo folder "gui" và thả các hình ảnh này vào , save lại theo đúng tên của hình)