Jump to content

Recommended Posts

Posted

ButtonHover.zip

Static_ButtonHover.au3

#Include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>

Global $CtrlhWnd_Array[1][6] , $TEST_WM_MOUSEFIRST = 0 , $HoverProcPtr = 0 , $HoverRegister = ""
Global $HOVER_HWND = 0 , $hHook_HOVER , $TEST_WM_LBUTTONDOWN = 0
OnAutoItExitRegister("Cleanup")


Func CreateButtonHover($Text,$L,$T,$W,$H,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR = 0)
Local $STM_SETIMAGE_HOVER = 0x0172 , $SS_BITMAP_HOVER = 0x0000000E _ 
, $SS_REALSIZECONTROL_HOVER = 0x00000040 , $iPID_HOVER = 0 , $hmod = _WinAPI_GetModuleHandle(0)
 
$controlID1 = GUICtrlCreateLabel("",$L,$T,$W,$H,$SS_REALSIZECONTROL_HOVER + $SS_BITMAP_HOVER)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$hWnd1 = GUICtrlGetHandle($controlID1)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][0] = $hWnd1
$user = GUICtrlCreateDummy()
$controlID2 = GUICtrlCreateLabel($Text,$L,$T,$W,$H, $SS_CENTERIMAGE + $SS_NOTIFY + $SS_CENTER)
if ($TEXTCOLOOR) Then GUICtrlSetColor(-1,$TEXTCOLOOR)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$hWnd2 = GUICtrlGetHandle($controlID2)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][1] = $hWnd2
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][2] = $user
if Not ($HoverProcPtr) Then
$HoverRegister = DllCallbackRegister("ButtonHoverProc", "long", "int;wparam;lparam")
$HoverProcPtr = DllCallbackGetPtr($HoverRegister)
$hHook_HOVER = _WinAPI_SetWindowsHookEx($WH_MOUSE ,$HoverProcPtr, $hmod , _ 
_WinAPI_GetWindowThreadProcessId(_WinAPI_GetParent($hWnd1),$iPID_HOVER))
EndIf
_SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$NORMAL_hBMP)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][3] = $NORMAL_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][4] = $PRESS_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][5] = $OVER_hBMP
ReDim $CtrlhWnd_Array[UBound($CtrlhWnd_Array) + 1][6]
Return SetError (0, $controlID2,$user)
EndFunc

Func ArraySearch($hWnd)
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == $hWnd Then Return $Element
Next
Return -1
EndFunc

Func ButtonHoverDelete($controlID)
Local $Temp_Array[1][6] , $Test = False
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][2] == $controlID Then 
GUICtrlDelete(_WinAPI_GetDlgCtrlID($CtrlhWnd_Array[$Element][0]))
GUICtrlDelete(_WinAPI_GetDlgCtrlID($CtrlhWnd_Array[$Element][1]))
GUICtrlDelete($CtrlhWnd_Array[$Element][2])
$Test = True
Else
$Temp_Array[UBound($Temp_Array) - 1][0] = $CtrlhWnd_Array[$Element][0]
$Temp_Array[UBound($Temp_Array) - 1][1] = $CtrlhWnd_Array[$Element][1]
$Temp_Array[UBound($Temp_Array) - 1][2] = $CtrlhWnd_Array[$Element][2]
$Temp_Array[UBound($Temp_Array) - 1][3] = $CtrlhWnd_Array[$Element][3]
$Temp_Array[UBound($Temp_Array) - 1][4] = $CtrlhWnd_Array[$Element][4]
$Temp_Array[UBound($Temp_Array) - 1][5] = $CtrlhWnd_Array[$Element][5]
ReDim $Temp_Array[UBound($Temp_Array) + 1][6]
EndIf
Next
ReDim $Temp_Array[UBound($Temp_Array) - 1][6]
$CtrlhWnd_Array = $Temp_Array
Return $Test
EndFunc

Func ButtonHoverProc($nCode, $wParam, $lParam)
If $nCode < 0 Then _ 
Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
Local _
    $WM_MOUSEFIRST_HOVER = 0x0200 , _
    $WM_LBUTTONDOWN_HOVER = 0x0201 , _
    $WM_LBUTTONUP_HOVER = 0x0202 , _
    $STM_SETIMAGE_HOVER = 0x0172 , _ 
    $Tag_struct ="LONG x;LONG y;HWND hwnd;UINT wHitTestCode;ULONG_PTR dwExtraInfo"
    $MOUSEHOOKSTRUCT = DllStructCreate($Tag_struct,$lParam)
    $hWnd = DllStructGetData($MOUSEHOOKSTRUCT,3)
    $uiMsg = $wParam
    $Element = ArraySearch($hWnd)
    If $Element <> -1 Then
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    
    If $uiMsg = $WM_MOUSEFIRST_HOVER And $TEST_WM_MOUSEFIRST = 0 Then
    $HOVER_HWND = $hWnd1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 1
    Else
    
    If $HOVER_HWND = $hWnd1 Then
    Select
    Case $uiMsg = $WM_LBUTTONDOWN_HOVER And $TEST_WM_LBUTTONDOWN = 0
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][4])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 1
    Case $uiMsg = $WM_LBUTTONUP_HOVER And $TEST_WM_LBUTTONDOWN = 1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    GUICtrlSendToDummy($CtrlhWnd_Array[$Element][2])
    $TEST_WM_LBUTTONDOWN = 0
    EndSelect
    Else
    
    If $uiMsg = $WM_LBUTTONUP_HOVER And $TEST_WM_LBUTTONDOWN = 1 Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 0
    $Element = ArraySearch($hWnd)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    $HOVER_HWND = $hWnd1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 1
    EndIf
    EndIf
    EndIf
    
    Else
    If $TEST_WM_LBUTTONDOWN = 1 Then
    
    If $uiMsg = $WM_LBUTTONUP_HOVER Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 0
    EndIf
    
    Else
    
    If $TEST_WM_MOUSEFIRST = 1 Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 0
    EndIf
    
    
    EndIf
    EndIf
    Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
EndFunc



Func LoadBitmap_FromFile($sFileName)
Return _WinAPI_LoadImage(_WinAPI_GetModuleHandle(0),$sFileName,0 ,0,0,0x0010)
EndFunc

Func LoadBitmap_FromResources($resource_Name)
Return _WinAPI_LoadBitmap(_WinAPI_GetModuleHandle(0), $resource_Name)
EndFunc

Func GetBmpWidth($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biWidth")
EndFunc

Func GetBmpHeight($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biHeight")
EndFunc

Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook_HOVER)
DllCallbackFree($HoverRegister)
EndFunc

Static_Example.au3

#include <Static_ButtonHover.au3>
$NORMAL_hBMP = LoadBitmap_FromFile("NORMAL1.bmp")
$PRESS_hBMP = LoadBitmap_FromFile("PRESS1.bmp")
$OVER_hBMP = LoadBitmap_FromFile("OVER1.bmp")
$TEXTCOLOOR = 0xFFFFFF
$GUI = GUICreate("Static_ButtonHover")
$Button_SM = CreateButtonHover ("Small", 180, 80, 70, 15,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR)
GUICtrlSetFont(@extended, 8, 800, 0,  "Arial") ; @extended oR -1
$Button_ME = CreateButtonHover ("Medium", 180, 120, 90, 30,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR)
GUICtrlSetFont(-1, 12, 800, 0,  "Arial") ; @extended oR -1
$Button_LO = CreateButtonHover ("Long", 180, 180, 190, 30,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR)
GUICtrlSetFont(@extended, 16, 800, 0,  "Arial") ; @extended oR -1
$Button_LA = CreateButtonHover ("Large", 180, 240, 190, 60, $NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR)
GUICtrlSetFont(-1, 20, 800, 0,  "Arial") ; @extended oR -1
GUISetState(@SW_SHOW)

While 1
$MSG = GUIGetMsg()
Switch $MSG
Case $GUI_EVENT_CLOSE
Exit
Case $Button_SM
MsgBox(0,"MSG","Small Button")
Case $Button_ME
MsgBox(0,"MSG","Medium Button")
Case $Button_LO
MsgBox(0,"MSG","Long Button")
Case $Button_LA
MsgBox(0,"MSG","Large Button")
EndSwitch
WEnd

Button_ButtonHover.au3

#Include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>
Global $CtrlhWnd_Array[1][4] , $HoverProcPtr = 0 , $HoverRegister = "" , $hHook_HOVER
OnAutoItExitRegister("Cleanup")

Func CreateButtonHover($L,$T,$W,$H,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$style = 0,$exStyle = 0)
Local $BM_SETIMAGE_HOVER = 0x00F7 , $BS_BITMAP_HOVER = 0x00000080, $BS_ICON_HOVER = 0x00000040 , _ 
$iPID_HOVER = 0 , $hmod = _WinAPI_GetModuleHandle(0)
$controlID = GUICtrlCreateButton("",$L,$T,$W,$H,$style,$exStyle)
$hWnd = GUICtrlGetHandle($controlID)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][0] = $hWnd
if Not ($HoverProcPtr) Then
$HoverRegister = DllCallbackRegister("ButtonHoverProc", "long", "int;wparam;lparam")
$HoverProcPtr = DllCallbackGetPtr($HoverRegister)
$hHook_HOVER = _WinAPI_SetWindowsHookEx($WH_GETMESSAGE ,$HoverProcPtr, $hmod , _ 
_WinAPI_GetWindowThreadProcessId(_WinAPI_GetParent($hWnd),$iPID_HOVER))
EndIf
if Not BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $BS_BITMAP_HOVER ) = $BS_BITMAP_HOVER  Then
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE) + $BS_BITMAP_HOVER  )
ElseIf  BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $BS_ICON_HOVER ) = $BS_ICON_HOVER  Then
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE) - $BS_ICON_HOVER )
EndIf
_SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$NORMAL_hBMP)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][1] = $NORMAL_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][2] = $PRESS_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][3] = $OVER_hBMP
ReDim $CtrlhWnd_Array[UBound($CtrlhWnd_Array) + 1][4]
Return $controlID
EndFunc

Func ArraySearch($hWnd)
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == $hWnd Then Return $Element
Next
Return -1
EndFunc

Func ButtonHoverDelete($controlID)
Local $Temp_Array[1][4] , $Test = False
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == GUICtrlGetHandle($controlID) Then 
GUICtrlDelete($controlID)
$Test = True
Else
$Temp_Array[UBound($Temp_Array) - 1][0] = $CtrlhWnd_Array[$Element][0]
$Temp_Array[UBound($Temp_Array) - 1][1] = $CtrlhWnd_Array[$Element][1]
$Temp_Array[UBound($Temp_Array) - 1][2] = $CtrlhWnd_Array[$Element][2]
$Temp_Array[UBound($Temp_Array) - 1][3] = $CtrlhWnd_Array[$Element][3]
ReDim $Temp_Array[UBound($Temp_Array) + 1][4]
EndIf
Next
ReDim $Temp_Array[UBound($Temp_Array) - 1][4]
$CtrlhWnd_Array = $Temp_Array
Return $Test
EndFunc

Func ButtonHoverProc($nCode, $wParam, $lParam)
If $nCode < 0 Then _ 
Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
Local _
    $WM_MOUSEFIRST_HOVER = 0x0200 , _
    $WM_MOUSELEAVE_HOVER = 0x02A3 , _
    $WM_LBUTTONDOWN_HOVER = 0x0201 , _
    $WM_LBUTTONUP_HOVER = 0x0202 , _
    $BM_SETIMAGE_HOVER = 0x00F7
    $Tag_struct ="HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;" & _ 
    "DWORD time;LONG y;LONG x"
    $MSG = DllStructCreate($Tag_struct,$lParam)
    $hWnd = DllStructGetData($MSG,1)
    $uiMsg = DllStructGetData($MSG,2)
    $Element = ArraySearch($hWnd)
    if $Element <> -1 Then
    Select
    Case $uiMsg = $WM_MOUSEFIRST_HOVER 
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    Case $uiMsg = $WM_MOUSELEAVE_HOVER 
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][1])
    Case $uiMsg = $WM_LBUTTONDOWN_HOVER
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][2])
    Case $uiMsg = $WM_LBUTTONUP_HOVER
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    EndSelect
    EndIf
    Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
EndFunc


Func LoadBitmap_FromFile($sFileName)
Return _WinAPI_LoadImage(_WinAPI_GetModuleHandle(0),$sFileName,0 ,0,0,0x0010)
EndFunc

Func LoadBitmap_FromResources($resource_Name)
Return _WinAPI_LoadBitmap(_WinAPI_GetModuleHandle(0), $resource_Name)
EndFunc

Func GetBmpWidth($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biWidth")
EndFunc

Func GetBmpHeight($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biHeight")
EndFunc

Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook_HOVER)
DllCallbackFree($HoverRegister)
EndFunc

ButtonHover_Example.au3

#include <Button_ButtonHover.au3>

$GUI = GUICreate("Button_ButtonHover")

$NORMAL_hBMP = LoadBitmap_FromFile("NORMAL1.bmp")
$PRESS_hBMP = LoadBitmap_FromFile("PRESS1.bmp")
$OVER_hBMP = LoadBitmap_FromFile("OVER1.bmp")
$Width = GetBmpWidth($NORMAL_hBMP)
$Height = GetBmpHeight($NORMAL_hBMP)
$Button1 = CreateButtonHover (160,50,$Width,$Height,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP)

$NORMAL_hBMP = LoadBitmap_FromFile("NORMAL2.bmp")
$PRESS_hBMP = LoadBitmap_FromFile("PRESS2.bmp")
$OVER_hBMP = LoadBitmap_FromFile("OVER2.bmp")
$Width = GetBmpWidth($NORMAL_hBMP)
$Height = GetBmpHeight($NORMAL_hBMP)
$Button2 = CreateButtonHover (160,120,$Width,$Height,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP)

$NORMAL_hBMP = LoadBitmap_FromFile("NORMAL3.bmp")
$PRESS_hBMP = LoadBitmap_FromFile("PRESS3.bmp")
$OVER_hBMP = LoadBitmap_FromFile("OVER3.bmp")
$Width = GetBmpWidth($NORMAL_hBMP)
$Height = GetBmpHeight($NORMAL_hBMP)
$Button3 = CreateButtonHover (160,180,$Width,$Height,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP)

$NORMAL_hBMP = LoadBitmap_FromFile("NORMAL4.bmp")
$PRESS_hBMP = LoadBitmap_FromFile("PRESS4.bmp")
$OVER_hBMP = LoadBitmap_FromFile("OVER4.bmp")
$Width = GetBmpWidth($NORMAL_hBMP)
$Height = GetBmpHeight($NORMAL_hBMP)
$Button4 = CreateButtonHover (160,240,$Width,$Height,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP)
GUISetState(@SW_SHOW)

While 1
$MSG = GUIGetMsg()
Switch $MSG
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
MsgBox(0,"MSG","Button1")
Case $Button2
MsgBox(0,"MSG","Button2")
Case $Button3
MsgBox(0,"MSG","Button3")
Case $Button4
MsgBox(0,"MSG","Button4")
EndSwitch
WEnd

صرح السماء كان هنا

 

Posted (edited)

ButtonHover_Example.au3

Nice, but here is the same example using my GUICtrlOnHover.au3:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

#include "GUICtrlOnHover.au3"

$GUI = GUICreate("Button_ButtonHover")

$Button1 = GUICtrlCreateButton("", 160, 50, 77, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button2 = GUICtrlCreateButton("", 160, 120, 76, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button3 = GUICtrlCreateButton("", 160, 180, 76, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button4 = GUICtrlCreateButton("", 160, 240, 77, 31, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))

GUICtrlSetImage($Button1, "NORMAL1.bmp")
GUICtrlSetImage($Button2, "NORMAL2.bmp")
GUICtrlSetImage($Button3, "NORMAL3.bmp")
GUICtrlSetImage($Button4, "NORMAL4.bmp")

_GUICtrl_OnHoverRegister($Button1, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button2, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button3, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button4, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")

GUISetState(@SW_SHOW)

While 1
    $MSG = GUIGetMsg()
    
    Switch $MSG
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            MsgBox(0, "MSG", "Button1")
        Case $Button2
            MsgBox(0, "MSG", "Button2")
        Case $Button3
            MsgBox(0, "MSG", "Button3")
        Case $Button4
            MsgBox(0, "MSG", "Button4")
    EndSwitch
WEnd

Func _Button_Hover($iCtrlID, $iHoverMode)
    Local $sImageName = "OVER"
    Local $sImageIndex = "1"
    
    Switch $iHoverMode
        Case 1 ;Hover
            $sImageName = "OVER"
        Case 2 ;Leave hover
            $sImageName = "NORMAL"
    EndSwitch
    
    Switch $iCtrlID
        Case $Button1
            $sImageIndex = "1"
        Case $Button2
            $sImageIndex = "2"
        Case $Button3
            $sImageIndex = "3"
        Case $Button4
            $sImageIndex = "4"
    EndSwitch
    
    GUICtrlSetImage($iCtrlID, $sImageName & $sImageIndex & ".bmp")
EndFunc

Func _Button_Click($iCtrlID, $iClickMode)
    Local $sImageName = "PRESS"
    Local $sImageIndex = "1"
    
    Switch $iClickMode
        Case 1 ;Hover
            $sImageName = "PRESS"
        Case 2 ;Leave hover
            $sImageName = "OVER"
    EndSwitch
    
    Switch $iCtrlID
        Case $Button1
            $sImageIndex = "1"
        Case $Button2
            $sImageIndex = "2"
        Case $Button3
            $sImageIndex = "3"
        Case $Button4
            $sImageIndex = "4"
    EndSwitch
    
    GUICtrlSetImage($iCtrlID, $sImageName & $sImageIndex & ".bmp")
EndFunc
Edited by MrCreatoR

 

Spoiler

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

Spoiler

AutoIt_Icon_small.pngProjects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize Program

AutoIt_Icon_small.pngUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF
 
AutoIt_Icon_small.pngExamples: 
ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo

Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

 

 

 

AutoIt is simple, subtle, elegant. © AutoIt Team

Posted (edited)

Nice, but here is the same example using my GUICtrlOnHover.au3:

#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

#include "GUICtrlOnHover.au3"

$GUI = GUICreate("Button_ButtonHover")

$Button1 = GUICtrlCreateButton("", 160, 50, 77, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button2 = GUICtrlCreateButton("", 160, 120, 76, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button3 = GUICtrlCreateButton("", 160, 180, 76, 30, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))
$Button4 = GUICtrlCreateButton("", 160, 240, 77, 31, BitOR($GUI_SS_DEFAULT_BUTTON, $BS_BITMAP))

GUICtrlSetImage($Button1, "NORMAL1.bmp")
GUICtrlSetImage($Button2, "NORMAL2.bmp")
GUICtrlSetImage($Button3, "NORMAL3.bmp")
GUICtrlSetImage($Button4, "NORMAL4.bmp")

_GUICtrl_OnHoverRegister($Button1, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button2, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button3, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")
_GUICtrl_OnHoverRegister($Button4, "_Button_Hover", "_Button_Hover", "_Button_Click", "_Button_Click")

GUISetState(@SW_SHOW)

While 1
    $MSG = GUIGetMsg()
    
    Switch $MSG
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            MsgBox(0, "MSG", "Button1")
        Case $Button2
            MsgBox(0, "MSG", "Button2")
        Case $Button3
            MsgBox(0, "MSG", "Button3")
        Case $Button4
            MsgBox(0, "MSG", "Button4")
    EndSwitch
WEnd

Func _Button_Hover($iCtrlID, $iHoverMode)
    Local $sImageName = "OVER"
    Local $sImageIndex = "1"
    
    Switch $iHoverMode
        Case 1 ;Hover
            $sImageName = "OVER"
        Case 2 ;Leave hover
            $sImageName = "NORMAL"
    EndSwitch
    
    Switch $iCtrlID
        Case $Button1
            $sImageIndex = "1"
        Case $Button2
            $sImageIndex = "2"
        Case $Button3
            $sImageIndex = "3"
        Case $Button4
            $sImageIndex = "4"
    EndSwitch
    
    GUICtrlSetImage($iCtrlID, $sImageName & $sImageIndex & ".bmp")
EndFunc

Func _Button_Click($iCtrlID, $iClickMode)
    Local $sImageName = "PRESS"
    Local $sImageIndex = "1"
    
    Switch $iClickMode
        Case 1 ;Hover
            $sImageName = "PRESS"
        Case 2 ;Leave hover
            $sImageName = "OVER"
    EndSwitch
    
    Switch $iCtrlID
        Case $Button1
            $sImageIndex = "1"
        Case $Button2
            $sImageIndex = "2"
        Case $Button3
            $sImageIndex = "3"
        Case $Button4
            $sImageIndex = "4"
    EndSwitch
    
    GUICtrlSetImage($iCtrlID, $sImageName & $sImageIndex & ".bmp")
EndFunc

Thank you :idea:

SetWindowsHookEx Function

http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx

SetTimer Function

http://msdn.microsoft.com/en-us/library/ms644906(VS.85).aspx

Edited by wolf9228

صرح السماء كان هنا

 

Posted (edited)

Using the hook seems to me redundant.

Thank you :idea:

Edited by wolf9228

صرح السماء كان هنا

 

Posted (edited)

This MrCreatoR code

#include-once

;_GUICtrl_SetOnHover Global Variables
Global $aHOVER_CONTROLS_ARRAY[1][1]
Global $aLAST_HOVERED_ELEMENT[2]    = [-1, -1]
Global $aLAST_HOVERED_ELEMENT_MARK  = -1
Global $hLAST_CLICKED_ELEMENT_MARK  = -1
Global $pTimerProc                  = 0
Global $uiTimer                     = 0

#Region =================== UDF Info ===================
; UDF Name:    _GUICtrl_SetOnHover
; Forum link:  http://www.autoitscript.com/forum/index.php?s=&showtopic=55120
; Author:      G.Sandler a.k.a MrCreatoR (CreatoR's Lab, http://creator-lab.ucoz.ru)
;
; 
; {Version History}:
; [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.
#EndRegion =================== UDF Info ===================
;

;===============================================================================
;
; Function Name:    _GUICtrl_SetOnHover()
; Description:      Set function(s) to call when hovering/leave hovering GUI elements.
;
; Parameter(s):     $iCtrlID              - The Ctrl ID to set hovering for (can be a -1 as indication to the last item created).
;
;                   $sHover_FuncName      - [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_FuncName - [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).
;
;                   $sPrimDwnFuncName     - [Optional] Function to call when Primary mouse button is *clicked* on the control.
;                       (-1 -> function is not called).
;
;                   $sPrimUpFuncName      - [Optional] Function to call when Primary mouse button is *released* the control.
;                       (-1 -> function is not called).
;
;                   $iKeepCallFnc         - [Optional] If this parameter < 1,
;                                            then the $sPrimDwnFuncName function will *Not* be called constantly untill
;                                            the primary mouse button is released (default behaviour, $iKeepCallFunc = 1).
;
; Return Value(s):  Always returns 1 regardless of success.
;
; Requirement(s):   AutoIt 3.2.10.0 +
;
; Note(s):          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) It is not recommended to block the HoverFunc by calling functions like Sleep() or MsgBox().
;
; Author(s):        G.Sandler (a.k.a CreatoR).
;
;===============================================================================
Func _GUICtrl_SetOnHover($iCtrlID,$sHover_Func="",$sLeaveHover_Func=-1,$sPrimaryDownFunc=-1,$sPrimaryUpFunc=-1,$iKeepCallFunc=1)
    Local $hCtrlID = GUICtrlGetHandle($iCtrlID)
    
    If $pTimerProc = 0 Then
        $pTimerProc = DllCallbackRegister("__MAIN_CALLBACK_ONHOVER_PROC", "none", "hwnd;int;int;dword")
        
        $uiTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, _
            "int", TimerInit(), "int", 10, "ptr", DllCallbackGetPtr($pTimerProc))
        
        If IsArray($uiTimer) Then $uiTimer = $uiTimer[0]
    EndIf
    
    ;UnSet Hovering for specified control (remove control id from hovering checking process)
    If $sHover_Func = "" Then
        Local $aHOVER_CONTROLS_Tmp[1][1]
        
        For $i = 1 To $aHOVER_CONTROLS_ARRAY[0][0]
            If $hCtrlID <> $aHOVER_CONTROLS_ARRAY[$i][0] Then
                $aHOVER_CONTROLS_Tmp[0][0] += 1
                ReDim $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]+1][6]
                
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][0] = $aHOVER_CONTROLS_ARRAY[$i][0]
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][1] = $aHOVER_CONTROLS_ARRAY[$i][1]
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][2] = $aHOVER_CONTROLS_ARRAY[$i][2]
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][3] = $aHOVER_CONTROLS_ARRAY[$i][3]
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][4] = $aHOVER_CONTROLS_ARRAY[$i][4]
                $aHOVER_CONTROLS_Tmp[$aHOVER_CONTROLS_Tmp[0][0]][5] = $aHOVER_CONTROLS_ARRAY[$i][5]
            EndIf
        Next
        
        If $aHOVER_CONTROLS_Tmp[0][0] < 1 Then
            OnAutoItExit() ;Release the callbacks
        Else
            $aHOVER_CONTROLS_ARRAY = $aHOVER_CONTROLS_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 $aHOVER_CONTROLS_ARRAY[0][0]
        If $hCtrlID = $aHOVER_CONTROLS_ARRAY[$i][0] Then
            $aHOVER_CONTROLS_ARRAY[$i][0] = $hCtrlID
            $aHOVER_CONTROLS_ARRAY[$i][1] = $sHover_Func
            $aHOVER_CONTROLS_ARRAY[$i][2] = $sLeaveHover_Func
            $aHOVER_CONTROLS_ARRAY[$i][3] = $sPrimaryDownFunc
            $aHOVER_CONTROLS_ARRAY[$i][4] = $sPrimaryUpFunc
            $aHOVER_CONTROLS_ARRAY[$i][5] = $iKeepCallFunc
            
            Return 1
        EndIf
    Next
    
    $aHOVER_CONTROLS_ARRAY[0][0] += 1
    ReDim $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]+1][6]
    
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][0] = $hCtrlID
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][1] = $sHover_Func
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][2] = $sLeaveHover_Func
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][3] = $sPrimaryDownFunc
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][4] = $sPrimaryUpFunc
    $aHOVER_CONTROLS_ARRAY[$aHOVER_CONTROLS_ARRAY[0][0]][5] = $iKeepCallFunc
    
    Return 1
EndFunc

;CallBack function to handle the hovering process
Func __MAIN_CALLBACK_ONHOVER_PROC($hWnd, $uiMsg, $idEvent, $dwTime)
    If $aHOVER_CONTROLS_ARRAY[0][0] < 1 Then Return
    
    Local $iControl_Hovered = _ControlGetHovered()
    Local $sCheck_LHE = $aLAST_HOVERED_ELEMENT[1]
    Local $iCheck_LCEM = $hLAST_CLICKED_ELEMENT_MARK
    Local $iCtrlID
    
    ;Leave Hovering Process and reset variables
    If Not $iControl_Hovered Or ($sCheck_LHE <> -1 And $iControl_Hovered <> $sCheck_LHE) Then
        If $aLAST_HOVERED_ELEMENT_MARK = -1 Then Return
        
        If $aLAST_HOVERED_ELEMENT[0] <> -1 Then
            $iCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $aLAST_HOVERED_ELEMENT[1])
            If IsArray($iCtrlID) Then $iCtrlID = $iCtrlID[0]
            
            Call($aLAST_HOVERED_ELEMENT[0], $iCtrlID, 2, $iControl_Hovered) ;2 is the indicator of OnLeavHover process
            If @error Then Call($aLAST_HOVERED_ELEMENT[0], $iCtrlID, 2)
            If @error Then Call($aLAST_HOVERED_ELEMENT[0], $iCtrlID)
            If @error Then Call($aLAST_HOVERED_ELEMENT[0])
        EndIf
        
        $aLAST_HOVERED_ELEMENT[0] = -1
        $aLAST_HOVERED_ELEMENT[1] = -1
        $aLAST_HOVERED_ELEMENT_MARK = -1
        $hLAST_CLICKED_ELEMENT_MARK = -1
    Else ;Hovering Process, Primary Down/Up handler, and set LAST_HOVERED_ELEMENT
        For $i = 1 To $aHOVER_CONTROLS_ARRAY[0][0]
            If $aHOVER_CONTROLS_ARRAY[$i][0] = $iControl_Hovered Then
                $iCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $iControl_Hovered)
                If IsArray($iCtrlID) Then $iCtrlID = $iCtrlID[0]
                
                ;Primary Down/Up handler
                If ($aHOVER_CONTROLS_ARRAY[$i][3] <> "" Or $aHOVER_CONTROLS_ARRAY[$i][4] <> "") And _
                    ($iCheck_LCEM = -1 Or $iCheck_LCEM = $iControl_Hovered) Then
                    
                    Local $aCursorInfo = GUIGetCursorInfo()
                    
                    If IsArray($aCursorInfo) Then
                        ;Primary Down. Last condition is to Prevent/Allow multiple function call.
                        If $aCursorInfo[2] = 1 And $aHOVER_CONTROLS_ARRAY[$i][3] <> -1 And _
                            (($aHOVER_CONTROLS_ARRAY[$i][5] < 1 And $iCheck_LCEM <> $iControl_Hovered) Or _
                                $aHOVER_CONTROLS_ARRAY[$i][5] > 0) Then
                            
                            Call($aHOVER_CONTROLS_ARRAY[$i][3], $iCtrlID)
                            If @error Then Call($aHOVER_CONTROLS_ARRAY[$i][3])
                            
                            $hLAST_CLICKED_ELEMENT_MARK = $iControl_Hovered
                        ElseIf $aCursorInfo[2] = 0 And $aHOVER_CONTROLS_ARRAY[$i][4] <> -1 And _ ;Primary Up
                            $iCheck_LCEM = $iControl_Hovered Then
                            
                            Call($aHOVER_CONTROLS_ARRAY[$i][4], $iCtrlID)
                            If @error Then Call($aHOVER_CONTROLS_ARRAY[$i][4])
                            
                            $hLAST_CLICKED_ELEMENT_MARK = -1
                        EndIf
                    EndIf
                EndIf
                
                If $aLAST_HOVERED_ELEMENT_MARK = $aHOVER_CONTROLS_ARRAY[$i][0] Then ExitLoop
                $aLAST_HOVERED_ELEMENT_MARK = $aHOVER_CONTROLS_ARRAY[$i][0]
                
                Call($aHOVER_CONTROLS_ARRAY[$i][1], $iCtrlID, 1, 0) ;1 is the indicator of OnHover process
                If @error Then Call($aHOVER_CONTROLS_ARRAY[$i][1], $iCtrlID, 1)
                If @error Then Call($aHOVER_CONTROLS_ARRAY[$i][1], $iCtrlID)
                If @error Then Call($aHOVER_CONTROLS_ARRAY[$i][1])
                
                If $aHOVER_CONTROLS_ARRAY[$i][2] <> -1 Then
                    $aLAST_HOVERED_ELEMENT[0] = $aHOVER_CONTROLS_ARRAY[$i][2]
                    $aLAST_HOVERED_ELEMENT[1] = $iControl_Hovered
                EndIf
                
                ExitLoop
            EndIf
        Next
    EndIf
EndFunc

;Backwards compatibility function #1
Func GUICtrl_SetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCallFunc=1)
    _GUICtrl_SetOnHover($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCallFunc)
EndFunc

;Backwards compatibility function #2
Func GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCallFunc=1)
    _GUICtrl_SetOnHover($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCallFunc)
EndFunc

;Backwards compatibility function #3
Func _GUICtrlSetOnHover($iCtrlID, $sHover_Func="", $sLeaveHover_Func=-1, $sPrimaryDownFunc=-1, $sPrimaryUpFunc=-1, $iKeepCallFunc=1)
    _GUICtrl_SetOnHover($iCtrlID, $sHover_Func, $sLeaveHover_Func, $sPrimaryDownFunc, $sPrimaryUpFunc, $iKeepCallFunc)
EndFunc

;Thanks to amel27 for that one!!!
Func _ControlGetHovered()
    Local $Old_Opt_MCM = Opt("MouseCoordMode", 1)
    
    Local $aRet = DllCall("User32.dll", "int", "WindowFromPoint", _
        "long", MouseGetPos(0), _
        "long", MouseGetPos(1))
    
    ;$aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $aRet[0])
    
    Opt("MouseCoordMode", $Old_Opt_MCM)
    
    Return $aRet[0]
EndFunc

;Release the CallBack resources
Func OnAutoItExit()
    If $pTimerProc > 0 Then DllCallbackFree($pTimerProc)
    If $uiTimer > 0 Then DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $uiTimer)
    
    $pTimerProc = 0
    $uiTimer = 0
EndFunc

And this is my code

#Include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>
Global $CtrlhWnd_Array[1][4] , $HoverProcPtr = 0 , $HoverRegister = "" , $hHook_HOVER
OnAutoItExitRegister("Cleanup")

Func CreateButtonHover($L,$T,$W,$H,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$style = 0,$exStyle = 0)
Local $BM_SETIMAGE_HOVER = 0x00F7 , $BS_BITMAP_HOVER = 0x00000080, $BS_ICON_HOVER = 0x00000040 , _ 
$iPID_HOVER = 0 , $hmod = _WinAPI_GetModuleHandle(0)
$controlID = GUICtrlCreateButton("",$L,$T,$W,$H,$style,$exStyle)
$hWnd = GUICtrlGetHandle($controlID)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][0] = $hWnd
if Not ($HoverProcPtr) Then
$HoverRegister = DllCallbackRegister("ButtonHoverProc", "long", "int;wparam;lparam")
$HoverProcPtr = DllCallbackGetPtr($HoverRegister)
$hHook_HOVER = _WinAPI_SetWindowsHookEx($WH_GETMESSAGE ,$HoverProcPtr, $hmod , _ 
_WinAPI_GetWindowThreadProcessId(_WinAPI_GetParent($hWnd),$iPID_HOVER))
EndIf
if Not BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $BS_BITMAP_HOVER ) = $BS_BITMAP_HOVER  Then
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE) + $BS_BITMAP_HOVER  )
ElseIf  BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $BS_ICON_HOVER ) = $BS_ICON_HOVER  Then
_WinAPI_SetWindowLong($hWnd, $GWL_STYLE, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE) - $BS_ICON_HOVER )
EndIf
_SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$NORMAL_hBMP)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][1] = $NORMAL_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][2] = $PRESS_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][3] = $OVER_hBMP
ReDim $CtrlhWnd_Array[UBound($CtrlhWnd_Array) + 1][4]
Return $controlID
EndFunc

Func ArraySearch($hWnd)
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == $hWnd Then Return $Element
Next
Return -1
EndFunc

Func ButtonHoverDelete($controlID)
Local $Temp_Array[1][4] , $Test = False
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == GUICtrlGetHandle($controlID) Then 
GUICtrlDelete($controlID)
$Test = True
Else
$Temp_Array[UBound($Temp_Array) - 1][0] = $CtrlhWnd_Array[$Element][0]
$Temp_Array[UBound($Temp_Array) - 1][1] = $CtrlhWnd_Array[$Element][1]
$Temp_Array[UBound($Temp_Array) - 1][2] = $CtrlhWnd_Array[$Element][2]
$Temp_Array[UBound($Temp_Array) - 1][3] = $CtrlhWnd_Array[$Element][3]
ReDim $Temp_Array[UBound($Temp_Array) + 1][4]
EndIf
Next
ReDim $Temp_Array[UBound($Temp_Array) - 1][4]
$CtrlhWnd_Array = $Temp_Array
Return $Test
EndFunc

Func ButtonHoverProc($nCode, $wParam, $lParam)
If $nCode < 0 Then _ 
Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
Local _
    $WM_MOUSEFIRST_HOVER = 0x0200 , _
    $WM_MOUSELEAVE_HOVER = 0x02A3 , _
    $WM_LBUTTONDOWN_HOVER = 0x0201 , _
    $WM_LBUTTONUP_HOVER = 0x0202 , _
    $BM_SETIMAGE_HOVER = 0x00F7
    $Tag_struct ="HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;" & _ 
    "DWORD time;LONG y;LONG x"
    $MSG = DllStructCreate($Tag_struct,$lParam)
    $hWnd = DllStructGetData($MSG,1)
    $uiMsg = DllStructGetData($MSG,2)
    $Element = ArraySearch($hWnd)
    if $Element <> -1 Then
    Select
    Case $uiMsg = $WM_MOUSEFIRST_HOVER 
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    Case $uiMsg = $WM_MOUSELEAVE_HOVER 
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][1])
    Case $uiMsg = $WM_LBUTTONDOWN_HOVER
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][2])
    Case $uiMsg = $WM_LBUTTONUP_HOVER
    _SendMessage($hWnd,$BM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    EndSelect
    EndIf
    Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
EndFunc


Func LoadBitmap_FromFile($sFileName)
Return _WinAPI_LoadImage(_WinAPI_GetModuleHandle(0),$sFileName,0 ,0,0,0x0010)
EndFunc

Func LoadBitmap_FromResources($resource_Name)
Return _WinAPI_LoadBitmap(_WinAPI_GetModuleHandle(0), $resource_Name)
EndFunc

Func GetBmpWidth($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biWidth")
EndFunc

Func GetBmpHeight($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biHeight")
EndFunc

Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook_HOVER)
DllCallbackFree($HoverRegister)
EndFunc

#Include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <Constants.au3>

Global $CtrlhWnd_Array[1][6] , $TEST_WM_MOUSEFIRST = 0 , $HoverProcPtr = 0 , $HoverRegister = ""
Global $HOVER_HWND = 0 , $hHook_HOVER , $TEST_WM_LBUTTONDOWN = 0
OnAutoItExitRegister("Cleanup")


Func CreateButtonHover($Text,$L,$T,$W,$H,$NORMAL_hBMP,$PRESS_hBMP,$OVER_hBMP,$TEXTCOLOOR = 0)
Local $STM_SETIMAGE_HOVER = 0x0172 , $SS_BITMAP_HOVER = 0x0000000E _ 
, $SS_REALSIZECONTROL_HOVER = 0x00000040 , $iPID_HOVER = 0 , $hmod = _WinAPI_GetModuleHandle(0)
 
$controlID1 = GUICtrlCreateLabel("",$L,$T,$W,$H,$SS_REALSIZECONTROL_HOVER + $SS_BITMAP_HOVER)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$hWnd1 = GUICtrlGetHandle($controlID1)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][0] = $hWnd1
$user = GUICtrlCreateDummy()
$controlID2 = GUICtrlCreateLabel($Text,$L,$T,$W,$H, $SS_CENTERIMAGE + $SS_NOTIFY + $SS_CENTER)
if ($TEXTCOLOOR) Then GUICtrlSetColor(-1,$TEXTCOLOOR)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$hWnd2 = GUICtrlGetHandle($controlID2)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][1] = $hWnd2
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][2] = $user
if Not ($HoverProcPtr) Then
$HoverRegister = DllCallbackRegister("ButtonHoverProc", "long", "int;wparam;lparam")
$HoverProcPtr = DllCallbackGetPtr($HoverRegister)
$hHook_HOVER = _WinAPI_SetWindowsHookEx($WH_MOUSE ,$HoverProcPtr, $hmod , _ 
_WinAPI_GetWindowThreadProcessId(_WinAPI_GetParent($hWnd1),$iPID_HOVER))
EndIf
_SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$NORMAL_hBMP)
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][3] = $NORMAL_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][4] = $PRESS_hBMP
$CtrlhWnd_Array[UBound($CtrlhWnd_Array) - 1][5] = $OVER_hBMP
ReDim $CtrlhWnd_Array[UBound($CtrlhWnd_Array) + 1][6]
Return SetError (0, $controlID2,$user)
EndFunc

Func ArraySearch($hWnd)
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][0] == $hWnd Then Return $Element
Next
Return -1
EndFunc

Func ButtonHoverDelete($controlID)
Local $Temp_Array[1][6] , $Test = False
For $Element = 0 To UBound($CtrlhWnd_Array) - 1
if $CtrlhWnd_Array[$Element][2] == $controlID Then 
GUICtrlDelete(_WinAPI_GetDlgCtrlID($CtrlhWnd_Array[$Element][0]))
GUICtrlDelete(_WinAPI_GetDlgCtrlID($CtrlhWnd_Array[$Element][1]))
GUICtrlDelete($CtrlhWnd_Array[$Element][2])
$Test = True
Else
$Temp_Array[UBound($Temp_Array) - 1][0] = $CtrlhWnd_Array[$Element][0]
$Temp_Array[UBound($Temp_Array) - 1][1] = $CtrlhWnd_Array[$Element][1]
$Temp_Array[UBound($Temp_Array) - 1][2] = $CtrlhWnd_Array[$Element][2]
$Temp_Array[UBound($Temp_Array) - 1][3] = $CtrlhWnd_Array[$Element][3]
$Temp_Array[UBound($Temp_Array) - 1][4] = $CtrlhWnd_Array[$Element][4]
$Temp_Array[UBound($Temp_Array) - 1][5] = $CtrlhWnd_Array[$Element][5]
ReDim $Temp_Array[UBound($Temp_Array) + 1][6]
EndIf
Next
ReDim $Temp_Array[UBound($Temp_Array) - 1][6]
$CtrlhWnd_Array = $Temp_Array
Return $Test
EndFunc

Func ButtonHoverProc($nCode, $wParam, $lParam)
If $nCode < 0 Then _ 
Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
Local _
    $WM_MOUSEFIRST_HOVER = 0x0200 , _
    $WM_LBUTTONDOWN_HOVER = 0x0201 , _
    $WM_LBUTTONUP_HOVER = 0x0202 , _
    $STM_SETIMAGE_HOVER = 0x0172 , _ 
    $Tag_struct ="LONG x;LONG y;HWND hwnd;UINT wHitTestCode;ULONG_PTR dwExtraInfo"
    $MOUSEHOOKSTRUCT = DllStructCreate($Tag_struct,$lParam)
    $hWnd = DllStructGetData($MOUSEHOOKSTRUCT,3)
    $uiMsg = $wParam
    $Element = ArraySearch($hWnd)
    If $Element <> -1 Then
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    
    If $uiMsg = $WM_MOUSEFIRST_HOVER And $TEST_WM_MOUSEFIRST = 0 Then
    $HOVER_HWND = $hWnd1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 1
    Else
    
    If $HOVER_HWND = $hWnd1 Then
    Select
    Case $uiMsg = $WM_LBUTTONDOWN_HOVER And $TEST_WM_LBUTTONDOWN = 0
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][4])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 1
    Case $uiMsg = $WM_LBUTTONUP_HOVER And $TEST_WM_LBUTTONDOWN = 1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    GUICtrlSendToDummy($CtrlhWnd_Array[$Element][2])
    $TEST_WM_LBUTTONDOWN = 0
    EndSelect
    Else
    
    If $uiMsg = $WM_LBUTTONUP_HOVER And $TEST_WM_LBUTTONDOWN = 1 Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 0
    $Element = ArraySearch($hWnd)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    $HOVER_HWND = $hWnd1
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][5])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 1
    EndIf
    EndIf
    EndIf
    
    Else
    If $TEST_WM_LBUTTONDOWN = 1 Then
    
    If $uiMsg = $WM_LBUTTONUP_HOVER Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_LBUTTONDOWN = 0
    EndIf
    
    Else
    
    If $TEST_WM_MOUSEFIRST = 1 Then
    $Element = ArraySearch($HOVER_HWND)
    $hWnd1 = $CtrlhWnd_Array[$Element][0]
    $hWnd2 = $CtrlhWnd_Array[$Element][1]
    _SendMessage($hWnd1,$STM_SETIMAGE_HOVER,0,$CtrlhWnd_Array[$Element][3])
    _WinAPI_RedrawWindow($hWnd2,0,0, $RDW_INVALIDATE )
    $TEST_WM_MOUSEFIRST = 0
    EndIf
    
    
    EndIf
    EndIf
    Return _WinAPI_CallNextHookEx($hHook_HOVER, $nCode, $wParam, $lParam)
EndFunc



Func LoadBitmap_FromFile($sFileName)
Return _WinAPI_LoadImage(_WinAPI_GetModuleHandle(0),$sFileName,0 ,0,0,0x0010)
EndFunc

Func LoadBitmap_FromResources($resource_Name)
Return _WinAPI_LoadBitmap(_WinAPI_GetModuleHandle(0), $resource_Name)
EndFunc

Func GetBmpWidth($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biWidth")
EndFunc

Func GetBmpHeight($hBMP)
$tagBITMAPINFO_HOVER = "DWORD biSize;LONG biWidth;LONG biHeight;USHORT biPlanes;" & _ 
"USHORT biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;" & _ 
"LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BYTE rgbBlueElement1;" & _ 
"BYTE rgbGreenElement1;BYTE rgbRedElement1;BYTE rgbReservedElement1"
$BITMAPINFO = DllStructCreate($tagBITMAPINFO_HOVER)
DllStructSetData($BITMAPINFO,"biSize",DllStructGetSize($BITMAPINFO))
$hDC = _WinAPI_CreateCompatibleDC(0)
_WinAPI_GetDIBits($hDC,$hBmp,0,0,0,DllStructGetPtr($BITMAPINFO),0)
Return DllStructGetData($BITMAPINFO,"biHeight")
EndFunc

Func Cleanup()
_WinAPI_UnhookWindowsHookEx($hHook_HOVER)
DllCallbackFree($HoverRegister)
EndFunc

Which is better, my code Or MrCreatoR Code ... I think there is

a big difference in these two Code

Edited by wolf9228

صرح السماء كان هنا

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...