Seite 1 von 1

[Erledigt] Gadget aktivieren via Moushover, aber wie?

Verfasst: 17.05.2018 11:17
von MenschMarkus
Hallo zusammen

Ich bin mal wieder dabei etwas zu versuchen.
In diesem Post http://www.purebasic.fr/german/viewtopi ... 00#p343800 von RSBasic habe ich ein code Snippet gefunden welches mir für mein Vorhaben helfen könnte.
Ich habe dieses Snippet etwas abgeändert um mein Vorhaben etwas zu verdeutlichen

Code: Alles auswählen

EnableExplicit

Define hhkLLMouse

Procedure MouseKeyHook(nCode, wParam, lParam)
  Select wParam
    Case #WM_LBUTTONDOWN
      Debug "Linke Maustaste wird gedrückt."
    Case #WM_LBUTTONUP
      Debug "Linke Maustaste wurde losgelassen."
    Case #WM_MOUSEMOVE
      Debug EventGadget()
  EndSelect
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, lParam)
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(1,0,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  ListIconGadget(2,WindowWidth(0)/2,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  hhkLLMouse = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseKeyHook(), GetModuleHandle_(0), 0)
 
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

UnhookWindowsHookEx_(hhkLLMouse)
Der Debugger zeigt mir an welches Gadget gerade aktiv ist (Fenster=0, Listicon1=1, ListIcon2= 2), je nachdem welches Gadget angeklickt wurde. Soweit so gut.
Wie bringe ich Windows jetzt dazu mir ,ohne explizitem Tastendruck auf eines der Gadgets (ListIcon1 / ListIcon2), dieses Gadget beim Überfahren mit der Maus zu aktivieren.
Ich habe da in der API Referenz erst mal nichts gefunden.

Hat da jemand eine Idee?

Re: Gadget aktivieren via Moushover, aber wie?

Verfasst: 17.05.2018 11:26
von RSBasic
MouseHook würde ich nicht benutzen, dafür gibt es SetWindowCallback:

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  
  Select uMsg
    Case #WM_NOTIFY
      Debug wParam
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1,0,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  ListIconGadget(2,WindowWidth(0)/2,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: Gadget aktivieren via Moushover, aber wie?

Verfasst: 17.05.2018 11:34
von Shardik
Es gibt dazu ein schönes Beispiel von netmaestro und srod aus dem englischen Forum mit dem bequemen Befehl AddHoverGadget(), um ein beliebiges Gadget beim Überfahren mit dem Maus-Cursor mit einem roten Rahmen zu versehen:
http://www.purebasic.fr/english/viewtop ... 14&t=23294

Re: Gadget aktivieren via Moushover, aber wie?

Verfasst: 17.05.2018 11:43
von MenschMarkus
Vielen Dank,

das ging ja wirklich schnell. Das sollte mir helfen.
:allright:

Re: [Erledigt] Gadget aktivieren via Moushover, aber wie?

Verfasst: 19.05.2018 18:29
von Mijikai
Oder einfach PeekMessage_() vor den PureBasic Event() Befehlen aufrufen.

Re: [Erledigt] Gadget aktivieren via Moushover, aber wie?

Verfasst: 20.05.2018 19:03
von hjbremer
dafür hat Windows TrapMouseEvent() erfunden

Es lebe die Windows Api :mrgreen:

Re: [Erledigt] Gadget aktivieren via Moushover, aber wie?

Verfasst: 20.05.2018 19:48
von RSBasic
hjbremer hat geschrieben:dafür hat Windows TrapMouseEvent() erfunden
Du meinst TrackMouseEvent_(). Hier ein Beispielcode für MenschMarkus:

Code: Alles auswählen

EnableExplicit

Global LVCB

Procedure LVCB(hWnd, Message, wParam, lParam)
  Protected TRACKMOUSEEVENT.TRACKMOUSEEVENT
  
  Select Message
    Case #WM_MOUSEMOVE
      Debug "hover"
      TRACKMOUSEEVENT\cbSize = SizeOf (TRACKMOUSEEVENT)
      TRACKMOUSEEVENT\dwFlags = #TME_LEAVE
      TRACKMOUSEEVENT\hwndTrack = hwnd
      TrackMouseEvent_(TRACKMOUSEEVENT)
    Case #WM_MOUSELEAVE
      Debug "leave"
  EndSelect
 
  ProcedureReturn CallWindowProc_(LVCB, hWnd, Message, wParam, lParam)
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1,0,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  ListIconGadget(2,WindowWidth(0)/2,0,WindowWidth(0)/2,WindowHeight(0),"Title 1",200,0)
  
  LVCB = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LVCB())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
hjbremer hat geschrieben:Es lebe die Windows Api :mrgreen:
WinAPI forever. :D