ts-soft hat geschrieben:Mit dem Flickern komme ich nicht so recht weiter, vielleicht kennt ja von euch einer die Lösung. Hier der Library-Source HoverButton.pb :
Code: Alles auswählen
Structure Hover
hWnd.l
DefaultImage.l
PressedImage.l
HoverImage.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
If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\HoverImage
SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\HoverImage)
EndIf
EndIf
Else
ReleaseCapture_()
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)
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
Bin für jede Hilfe dankbar, weil mit dem geflicker macht der HoverButton keine Spaß

Das funktioniert hier nicht einmal. Das "PressedImage" kann
auch nie angezeigt werden, da Deine Abfrage nach "Found"
gekürzt so aussieht:
Code: Alles auswählen
If Found
If Msg = #WM_MOUSEMOVE
....
EndIf
ElseIf Msg = #WM_KEYDOWN Or Msg = #WM_LBUTTONDOWN Or Msg = #WM_RBUTTONDOWN
....
ElseIf Msg = #WM_KEYUP Or Msg = #WM_LBUTTONUP Or Msg = #WM_RBUTTONUP
....
EndIf
ProcedureReturn CallFunctionFast(OldProc, hWnd, Msg, lParam, wParam)
EndProcedure
Wenn das Fenster in der LinkedList gefunden wurde, wird
also nur #WM_MOUSEMOVE bearbeitet - die anderen
Nachrichten werden nie bearbeitet. Total verbuggt das bissl Code.
Das flickern ist ganz einfach zu erklären:
Code: Alles auswählen
If Msg = #WM_MOUSEMOVE
GetCursorPos_(pt.POINT)
GetWindowRect_(hWnd,re.RECT)
If PtInRect_(re,pt\x,pt\y)
SetCapture_(hWnd)
If Hover()\HoverImage
If GetGadgetState(GetDlgCtrlID_(Hover()\hWnd)) <> Hover()\HoverImage
SetGadgetState(GetDlgCtrlID_(Hover()\hWnd),Hover()\HoverImage)
Beep_(800,100)
EndIf
EndIf
Else
Füge dort das Beep_() ein, und Du wirst feststellen das es
bei jedem MouseMove beept.
Das heißt: GetGadgetState() gibt nicht die ImageID des
ButtonImageGadgets zurück, sondern wahrscheinlich den
Status ob der Button gedrückt ist oder nicht (0 oder 1).
In der Hilfe steht bei GetGadgetState() aber auch nicht das
es für ButtonImageGadgets die ImageID zurück gibt.
Ein 'Debug GetGadgetState(0)' zeigt mir für ein ButtonHoverGadget
jedenfalls 0 an, direkt nachdem das Gadget erstellt wurde.
Das neue Bild wird somit bei jedem Durchlauf gesetzt.
Weitermachen!
