Seite 1 von 2

"EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 15:36
von Angelo
Ich habe im englischen Forum die Funktion EventHoverGadget() entdeckt, mit der man die Gadget-ID bestimmen kann, indem man mit der Maus über ein Gadget geht. Wie kann man das erreichen, wenn es sich um Gadgets in einem PanelGadget handelt?

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 15:57
von RSBasic
Hallo Berliner Angelo

Code: Alles auswählen

OpenWindow(0, 0, 0, 600, 400, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget    (0,  10,  10, 100, 16, "ListIcon Standard", #PB_Text_Center)
ListIconGadget(1,  10,  35, 300, 70, "Column 1", 100)
TextGadget    (2,  10, 125, 120, 16, "ListIcon with Checkbox", #PB_Text_Center)
ListIconGadget(3,  10, 150, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)
ButtonGadget  (4, 10, 230, 100, 20, "Add Gadget")

ButtonGadget(5, 0, 0, 0, 0, "Button 5")
ButtonGadget(6, 0, 0, 0, 0, "Button 6")
SplitterGadget(7, 400,35, 160, 125, 5, 6, #PB_Splitter_Separator)

ContainerGadget(8,400,160,160,160)
ButtonGadget(9, 0, 10, 80, 25, "Button 9")
ButtonGadget(10,0, 45, 80, 25, "Button 10")
CloseGadgetList()

If PanelGadget(11, 10, 260, 580, 100)
  AddGadgetItem(11, -1, "Allgemein")
  ButtonGadget(12, 10, 10, 100, 20, "Button 12", 0)
  ButtonGadget(13, 120, 10, 100, 20, "Button 13", 0)
  ButtonGadget(14, 230, 10, 100, 20, "Button 14", 0)
  
  CloseGadgetList()
EndIf

Repeat
  ev=WaitWindowEvent()
  Select ev
    Case #WM_MOUSEMOVE         
      GetCursorPos_ (@p.POINT)
      ScreenToClient_ (WindowID(0), @p)             
      hGad = ChildWindowFromPoint_ (WindowID(0), p\y<< 32+p\x)
      If hGad = WindowID(0)
        Debug "No Gadget"
      Else
        gadget = GetDlgCtrlID_(hGad)
        If GadgetType(gadget) = #PB_GadgetType_Splitter Or GadgetType(gadget) = #PB_GadgetType_Container
          GetCursorPos_ (@p.POINT)
          ScreenToClient_ (GadgetID(gadget), @p)
          hGad = ChildWindowFromPoint_ (GadgetID(gadget), p\y<< 32+p\x)
        ElseIf GadgetType(gadget) = #PB_GadgetType_Panel
          GetCursorPos_ (@p.POINT)
          hGad = GetWindow_(GadgetID(gadget), #GW_CHILD)
          ScreenToClient_ (hGad, @p)
          hGad = ChildWindowFromPoint_ (hGad, p\y<< 32+p\x)
          If GetWindow_(GadgetID(gadget), #GW_CHILD) = hGad
            hGad = GadgetID(gadget)
          EndIf
        EndIf
        gadget = GetDlgCtrlID_(hGad)                 
        Debug "Gadget : " + Str(gadget)                 
      EndIf
      
    Case #PB_Event_CloseWindow
      Q = 1
      
  EndSelect
  
Until Q = 1

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 16:50
von mk-soft
Da gibt es ein Modul für alle OS. Funktioniert fast perfekt.

Link: http://www.purebasic.fr/german/viewtopi ... =8&t=29047

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 16:53
von Angelo
Super! Herzlichen Dank, RSBasic - das klappt ja wunderbar.

Allerdings wenn ich das Panel-Gadget um einen zweiten Tab erweitere:

Code: Alles auswählen

If PanelGadget(11, 10, 260, 580, 100)
  AddGadgetItem(11, -1, "Allgemein")
  ButtonGadget(12, 10, 10, 100, 20, "Button 12", 0)
  ButtonGadget(13, 120, 10, 100, 20, "Button 13", 0)
  ButtonGadget(14, 230, 10, 100, 20, "Button 14", 0)
  AddGadgetItem(11, -1, "zweites Tab")
  ButtonGadget(15, 10, 10, 100, 20, "Button 15", 0)
  ButtonGadget(16, 120, 10, 100, 20, "Button 16", 0)
  ButtonGadget(17, 230, 10, 100, 20, "Button 17", 0)
  CloseGadgetList()
EndIf
und dann auf den zweiten Tab gehe, werden die Gadget-IDs nicht richtig angezeigt (es werden die IDs der Gadgets vom ersten Tab genommen). Hast Du für diesen Fall eine Idee?

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 17:03
von RSBasic

Code: Alles auswählen

OpenWindow(0, 0, 0, 600, 400, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget    (0,  10,  10, 100, 16, "ListIcon Standard", #PB_Text_Center)
ListIconGadget(1,  10,  35, 300, 70, "Column 1", 100)
TextGadget    (2,  10, 125, 120, 16, "ListIcon with Checkbox", #PB_Text_Center)
ListIconGadget(3,  10, 150, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)
ButtonGadget  (4, 10, 230, 100, 20, "Add Gadget")

ButtonGadget(5, 0, 0, 0, 0, "Button 5")
ButtonGadget(6, 0, 0, 0, 0, "Button 6")
SplitterGadget(7, 400,35, 160, 125, 5, 6, #PB_Splitter_Separator)

ContainerGadget(8,400,160,160,160)
ButtonGadget(9, 0, 10, 80, 25, "Button 9")
ButtonGadget(10,0, 45, 80, 25, "Button 10")
CloseGadgetList()

If PanelGadget(11, 10, 260, 580, 100)
  AddGadgetItem(11, -1, "Allgemein")
  ButtonGadget(12, 10, 10, 100, 20, "Button 12", 0)
  ButtonGadget(13, 120, 10, 100, 20, "Button 13", 0)
  ButtonGadget(14, 230, 10, 100, 20, "Button 14", 0)
  AddGadgetItem(11, -1, "Erweitert")
  ButtonGadget(15, 10, 10, 100, 20, "Button 15", 0)
  ButtonGadget(16, 120, 10, 100, 20, "Button 16", 0)
  ButtonGadget(17, 230, 10, 100, 20, "Button 17", 0)
  
  CloseGadgetList()
EndIf

Repeat
  ev=WaitWindowEvent()
  Select ev
    Case #WM_MOUSEMOVE         
      GetCursorPos_ (@p.POINT)
      ScreenToClient_ (WindowID(0), @p)             
      hGad = ChildWindowFromPoint_ (WindowID(0), p\y<< 32+p\x)
      If hGad = WindowID(0)
        Debug "No Gadget"
      Else
        gadget = GetDlgCtrlID_(hGad)
        If GadgetType(gadget) = #PB_GadgetType_Splitter Or GadgetType(gadget) = #PB_GadgetType_Container
          GetCursorPos_ (@p.POINT)
          ScreenToClient_ (GadgetID(gadget), @p)
          hGad = ChildWindowFromPoint_ (GadgetID(gadget), p\y<< 32+p\x)
        ElseIf GadgetType(gadget) = #PB_GadgetType_Panel
          GetCursorPos_ (@p.POINT)
          hGad = GetWindow_(GadgetID(gadget), #GW_CHILD)
          For a=1 To GetGadgetState(gadget)
            hGad = GetWindow_(hGad, #GW_HWNDNEXT)
          Next
          ScreenToClient_ (hGad, @p)
          hGad = ChildWindowFromPoint_ (hGad, p\y<< 32+p\x)
          If GetWindow_(GadgetID(gadget), #GW_CHILD) = ChildWindowFromPoint_ (GadgetID(gadget), p\y<< 32+p\x)
            hGad = GadgetID(gadget)
          EndIf
        EndIf
        gadget = GetDlgCtrlID_(hGad)                 
        Debug "Gadget : " + Str(gadget)                 
      EndIf
     
    Case #PB_Event_CloseWindow
      Q = 1
     
  EndSelect
 
Until Q = 1

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 17:44
von Angelo
Vielen Dank, RSBasic. In dieser Konfiguration funktioniert es. Aber ich habe mal die y-Koordinate der Buttons auf dem "Erweitert"-Tab verändert (auf den Wert 40):

Code: Alles auswählen

 ButtonGadget(15, 10, 40, 100, 20, "Button 15", 0)
  ButtonGadget(16, 120, 40, 100, 20, "Button 16", 0)
  ButtonGadget(17, 230, 40, 100, 20, "Button 17", 0)
Wenn ich das mache, wird nichts angezeigt!?

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 17:52
von RSBasic
Ist die Höhe deines PanelGadgets kleiner als 40? Kannst du einen Beispielcode schreiben?
Wenn ich deinen Code in den von mir erweiterten Code einfüge und ersetze, dann werden die Buttons angezeigt, nur etwas tiefer.
Hast du in deinem Code noch irgendwas geändert?

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 17:56
von Angelo
Ich habe direkt Deinen Code genommen und die y-Koordinate der Buttons in "Erweitert" von 10 auf 40 erhöht. Man sieht jetzt die Buttons tiefer liegen - so wie es sein soll. Aber gehe ich mit der Maus drüber, wird keine Gadget-ID angezeigt....

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 18:04
von RSBasic
Sorry, die letzte Abfrage war nicht korrekt. Das sollte jetzt besser funktionieren:

Code: Alles auswählen

OpenWindow(0, 0, 0, 600, 400, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget    (0,  10,  10, 100, 16, "ListIcon Standard", #PB_Text_Center)
ListIconGadget(1,  10,  35, 300, 70, "Column 1", 100)
TextGadget    (2,  10, 125, 120, 16, "ListIcon with Checkbox", #PB_Text_Center)
ListIconGadget(3,  10, 150, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)
ButtonGadget  (4, 10, 230, 100, 20, "Add Gadget")

ButtonGadget(5, 0, 0, 0, 0, "Button 5")
ButtonGadget(6, 0, 0, 0, 0, "Button 6")
SplitterGadget(7, 400,35, 160, 125, 5, 6, #PB_Splitter_Separator)

ContainerGadget(8,400,160,160,160)
ButtonGadget(9, 0, 10, 80, 25, "Button 9")
ButtonGadget(10,0, 45, 80, 25, "Button 10")
CloseGadgetList()

If PanelGadget(11, 10, 260, 580, 100)
  AddGadgetItem(11, -1, "Allgemein")
  ButtonGadget(12, 10, 10, 100, 20, "Button 12", 0)
  ButtonGadget(13, 120, 10, 100, 20, "Button 13", 0)
  ButtonGadget(14, 230, 10, 100, 20, "Button 14", 0)
  AddGadgetItem(11, -1, "Erweitert")
   ButtonGadget(15, 10, 40, 100, 20, "Button 15", 0)
  ButtonGadget(16, 120, 40, 100, 20, "Button 16", 0)
  ButtonGadget(17, 230, 40, 100, 20, "Button 17", 0)
 
  CloseGadgetList()
EndIf

Repeat
  ev=WaitWindowEvent()
  Select ev
    Case #WM_MOUSEMOVE         
      GetCursorPos_ (@p.POINT)
      ScreenToClient_ (WindowID(0), @p)             
      hGad = ChildWindowFromPoint_ (WindowID(0), p\y<< 32+p\x)
      If hGad = WindowID(0)
        Debug "No Gadget"
      Else
        gadget = GetDlgCtrlID_(hGad)
        If GadgetType(gadget) = #PB_GadgetType_Splitter Or GadgetType(gadget) = #PB_GadgetType_Container
          GetCursorPos_ (@p.POINT)
          ScreenToClient_ (GadgetID(gadget), @p)
          hGad = ChildWindowFromPoint_ (GadgetID(gadget), p\y<< 32+p\x)
        ElseIf GadgetType(gadget) = #PB_GadgetType_Panel
          GetCursorPos_ (@p.POINT)
          hGad = GetWindow_(GadgetID(gadget), #GW_CHILD)
          For a=1 To GetGadgetState(gadget)
            hGad = GetWindow_(hGad, #GW_HWNDNEXT)
          Next
          hGad2 = hGad
          ScreenToClient_ (hGad, @p)
          hGad = ChildWindowFromPoint_ (hGad, p\y<< 32+p\x)
          If hGad = hGad2
            hGad = GadgetID(gadget)
          EndIf
        EndIf
        gadget = GetDlgCtrlID_(hGad)                 
        Debug "Gadget : " + Str(gadget)                 
      EndIf
     
    Case #PB_Event_CloseWindow
      Q = 1
     
  EndSelect
 
Until Q = 1

Re: "EventHoverGadget" für PanelGadget

Verfasst: 24.08.2017 18:18
von Angelo
Super, das klappt wunderbar.

Darf ich Dich noch eine allerletzte Sache fragen?? Ich würde mich riesig freuen, wenn ich das auch noch wüsste.... (dann sind wirklich alle Fragen beantwortet)

Ich habe noch einen drittes Tab mit einer ScrollArea erstellt, die wiederum drei Buttons enthält. Wie kann man deren ID herausbekommen?

Code: Alles auswählen

If PanelGadget(11, 10, 260, 580, 100)
  AddGadgetItem(11, -1, "Allgemein")
  ButtonGadget(12, 10, 10, 100, 20, "Button 12", 0)
  ButtonGadget(13, 120, 10, 100, 20, "Button 13", 0)
  ButtonGadget(14, 230, 10, 100, 20, "Button 14", 0)
  AddGadgetItem(11, -1, "Erweitert")
   ButtonGadget(15, 10, 40, 100, 20, "Button 15", 0)
  ButtonGadget(16, 120, 40, 100, 20, "Button 16", 0)
  ButtonGadget(17, 230, 40, 100, 20, "Button 17", 0)
  AddGadgetItem(11, -1, "mit Scrollarea")
  ScrollAreaGadget(18, 5, 5, 590, 90, 580, 85)
  ButtonGadget(19, 10, 25, 100, 20, "Button 19", 0)
  ButtonGadget(20, 120, 25, 100, 20, "Button 20", 0)
  ButtonGadget(21, 230, 25, 100, 20, "Button 21", 0)  
  CloseGadgetList() 
  CloseGadgetList()
EndIf