Vielleicht waere es besser wenn du eigene Events abschickst bei einem
"hover" und "leave". So wird immer nur bei deinem Event das Bild
gewechselt und nicht wie jetzt bei jeder Bewegung ueber dem Gadget.
Ebenso wie trackmouseevent es macht.
oder so:
Code: Alles auswählen
Structure Hover
hwnd.l
DefaultImage.l
PressedImage.l
HoverImage.l
ishover.l ;<----
EndStructure
ProcedureDLL HoverButton_Init()
NewList Hover.Hover()
EndProcedure
Procedure HoverCallback(hwnd, msg, lParam, wParam)
Protected Found
Shared OldProc
ForEach Hover()
If Hover()\hwnd = hwnd
Found = #True
Break
EndIf
Next
If Found
If msg = #WM_MOUSEMOVE
GetCursorPos_(pt.POINT)
GetWindowRect_(hwnd,re.RECT)
If PtInRect_(re,pt\x,pt\y)
SetCapture_(hwnd)
If Hover()\HoverImage And Hover()\ishover = #False ;<----
If GetGadgetState(GetDlgCtrlID_(Hover()\hwnd)) <> Hover()\HoverImage
SetGadgetState(GetDlgCtrlID_(Hover()\hwnd),Hover()\HoverImage)
Hover()\ishover = #True ;<----
EndIf
EndIf
Else
ReleaseCapture_()
Hover()\ishover = #False;<----
If GetGadgetState(GetDlgCtrlID_(Hover()\hwnd)) <> Hover()\DefaultImage
SetGadgetState(GetDlgCtrlID_(Hover()\hwnd),Hover()\DefaultImage)
EndIf
EndIf
EndIf
ElseIf msg = #WM_KEYDOWN Or msg = #WM_LBUTTONDOWN Or msg = #WM_RBUTTONDOWN
If Hover()\PressedImage
If GetGadgetState(GetDlgCtrlID_(Hover()\hwnd)) <> Hover()\PressedImage
SetGadgetState(GetDlgCtrlID_(Hover()\hwnd),Hover()\PressedImage)
EndIf
EndIf
ElseIf msg = #WM_KEYUP Or msg = #WM_LBUTTONUP Or msg = #WM_RBUTTONUP
If Hover()\DefaultImage
If GetGadgetState(GetDlgCtrlID_(Hover()\hwnd)) <> Hover()\DefaultImage
SetGadgetState(GetDlgCtrlID_(Hover()\hwnd),Hover()\DefaultImage)
Hover()\ishover = #False ;<----
EndIf
EndIf
EndIf
ProcedureReturn CallFunctionFast(OldProc, hwnd, msg, lParam, wParam)
EndProcedure
ProcedureDLL ButtonHoverGadget2(Gadget, x, y, With, Height, DefaultImageID, HoverImageID, PressedImageID)
Protected hwnd, Result
Shared OldProc
Result = ButtonImageGadget(Gadget, x, y, With, Height, DefaultImageID)
If Result
If Gadget = #PB_Any
hwnd = GadgetID(Result)
Else
hwnd = Result
EndIf
AddElement(Hover())
Hover()\hwnd = hwnd
Hover()\DefaultImage = DefaultImageID
Hover()\PressedImage = PressedImageID
Hover()\HoverImage = HoverImageID
OldProc = GetWindowLong_(hwnd, #GWL_WNDPROC)
SetWindowLong_(hwnd, #GWL_WNDPROC, @HoverCallback())
EndIf
ProcedureReturn Result
EndProcedure
ProcedureDLL ButtonHoverGadget(Gadget, x, y, With, Height, DefaultImageID, HoverImageID)
ProcedureReturn ButtonHoverGadget2(Gadget, x, y, With, Height, DefaultImageID, HoverImageID, 0)
EndProcedure
DataSection
DefImg:
IncludeBinary "Button_Default.bmp" ;die Bilder befinden sich im Librarie-Archiv
HovImg:
IncludeBinary "Button_Hover.bmp"
EndDataSection
; Windows Konstanten
Enumeration
#frmMain
EndEnumeration
; Gadget Konstanten
Enumeration
#btnHover
EndEnumeration
If OpenWindow(#frmMain, #CW_USEDEFAULT, #CW_USEDEFAULT, 185, 70, #PB_Window_SystemMenu, "Hover-Test") = #False : End : EndIf
HoverButton_Init()
If CreateGadgetList(WindowID(#frmMain))
ButtonHoverGadget(#btnHover, 10, 10, 163, 47, UseImage(CatchImage(#PB_Any, ?DefImg)), UseImage(CatchImage(#PB_Any, ?HovImg)))
EndIf
Repeat
EventID = WaitWindowEvent()
MenuID = EventMenuID()
GadgetID = EventGadgetID()
Select EventID
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select GadgetID
Case #btnHover
MessageRequester("HoverTest", "Danke für das testen")
EndSelect
EndSelect
ForEver
End