Another way to toggle the button (similar with secondary GUIs) :
Global $pOldBtnProc
...
Local $hGUI4 = GUICreate("", 52, 51, 300, 300, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)
Local $idBtn = GUICtrlCreateButton("Test", 0, 0, 52, 51, $BS_BITMAP)
GUICtrlSetImage($idBtn, "Cancel 52-51.bmp")
Local $hBtnProc = DllCallbackRegister(WinBtnProc, "long", "hwnd;uint;wparam;lparam")
$pOldBtnProc = _WinAPI_SetWindowLong(GUICtrlGetHandle($idBtn), $GWL_WNDPROC, DllCallbackGetPtr($hBtnProc))
...
Func WinBtnProc($hWnd, $iMsg, $wParam, $lParam)
Local Static $bHover = False
Switch $iMsg
Case $WM_MOUSEMOVE
If Not $bHover Then
GUICtrlSetImage(_WinAPI_GetDlgCtrlID($hWnd), "OK 52-51.bmp")
$bHover = True
EndIf
Case $WM_MOUSELEAVE
GUICtrlSetImage(_WinAPI_GetDlgCtrlID($hWnd), "Cancel 52-51.bmp")
$bHover = False
EndSwitch
Return DllCallAddress("long", $pOldBtnProc, "hwnd", $hWnd, "uint", $iMsg, "wparam", $wParam, "lparam", $lParam)[0]
EndFunc ;==>WinBtnProc