Seite 1 von 1

CanvasGadgets im ScrollAreaGadget: Scrollproblem

Verfasst: 14.05.2018 12:13
von Kiffi
Hallo,

ich habe ein ScrollAreaGadget, in das ich ContainerGadgets einfüge.

Nun kann ich vertikal mit dem Mausrad scrollen -- fein!

Allerdings brauche ich ein ClickEvent auf den ContainerGadgets. Gibt's nicht. Also nehme ich anstelle der ContainerGadgets CanvasGadgets. Die haben ein ClickEvent.

Jetzt kann ich aber nicht mehr mit dem Mausrad im ScrollAreaGadget scrollen. Ich vermute, weil die CanvasGadgets die Events 'klauen'.

Was tun?

Danke im Voraus & Grüße ... Peter

ContainerGadget:

Code: Alles auswählen

EnableExplicit

Enumeration
	#frmTest
	#frmTest_SAG
EndEnumeration

Procedure ContainerEvent()
	Debug "ContainerEvent"
EndProcedure

Define newY, Counter, CG

OpenWindow(#frmTest, #PB_Ignore, #PB_Ignore, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

newY = 5

ScrollAreaGadget(#frmTest_SAG, 10, 15, 515, 350, 595, 550, 1, #PB_ScrollArea_Flat)

For Counter = 1 To 10
	CG = ContainerGadget(#PB_Any, 5, newY, 450, 100, #PB_Container_Flat) : CloseGadgetList()
	BindGadgetEvent(CG, @ContainerEvent())
	newY + 105
Next

CloseGadgetList()

SetGadgetAttribute(#frmTest_SAG,  #PB_ScrollArea_ScrollStep, 50)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

CanvasGadget:

Code: Alles auswählen

EnableExplicit

Enumeration
  #frmTest
  #frmTest_SAG
EndEnumeration

Procedure CanvasEvent()
  Debug "CanvasEvent"
EndProcedure

Define newY, Counter, CG

OpenWindow(#frmTest, #PB_Ignore, #PB_Ignore, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

newY = 5

ScrollAreaGadget(#frmTest_SAG, 10, 15, 515, 350, 595, 550, 1, #PB_ScrollArea_Flat)

For Counter = 1 To 10
  CG = CanvasGadget(#PB_Any, 5, newY, 450, 100, #PB_Canvas_Container) : CloseGadgetList()
  BindGadgetEvent(CG, @CanvasEvent())
  newY + 105
Next

CloseGadgetList()

SetGadgetAttribute(#frmTest_SAG,  #PB_ScrollArea_ScrollStep, 50)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Verfasst: 14.05.2018 12:19
von RSBasic
Hallo Peter,

beim CanvasGadget kann ich dir nicht helfen, aber beim ContainerGadget per WinAPI schon, falls WinAPI für dich in Ordnung ist:

Code: Alles auswählen

EnableExplicit

Enumeration
   #frmTest
   #frmTest_SAG
EndEnumeration

Global ContainerCB

Procedure ContainerCB(hWnd, Message, wParam, lParam)
  Select Message
    Case #WM_LBUTTONUP
      Debug "Klick auf " + Str(GetProp_(hWnd, "PB_ID"))
  EndSelect
  
  ProcedureReturn CallWindowProc_(ContainerCB, hWnd, Message, wParam, lParam)
EndProcedure

Procedure ContainerEvent()
   Debug "ContainerEvent"
EndProcedure

Define newY, Counter, CG

OpenWindow(#frmTest, #PB_Ignore, #PB_Ignore, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

newY = 5

ScrollAreaGadget(#frmTest_SAG, 10, 15, 515, 350, 595, 550, 1, #PB_ScrollArea_Flat)

For Counter = 1 To 10
   CG = ContainerGadget(#PB_Any, 5, newY, 450, 100, #PB_Container_Flat) : CloseGadgetList()
   BindGadgetEvent(CG, @ContainerEvent())
   ContainerCB = SetWindowLongPtr_(GadgetID(CG), #GWL_WNDPROC, @ContainerCB())
   newY + 105
Next

CloseGadgetList()

SetGadgetAttribute(#frmTest_SAG,  #PB_ScrollArea_ScrollStep, 50)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
\\Edit:
Die Variable ContainerCB müsstest du aber noch anpassen, damits nicht in der Schleife überschrieben wird. Am besten in eine Liste einfügen.

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Verfasst: 14.05.2018 12:40
von Kiffi
Hi Ray,

ja, WinAPI ist erst einmal OK. Danke! :allright:

Grüße ... Peter

P.S.: Wollte das Ganze später auch unter Linux laufen lassen. Aus diesem Grund wäre ich auch für betriebssystemunabhängige Lösungen offen (wenn das ohne allzu große Verrenkungen machbar ist). Vielleicht hat 'nimm-doch-ein-CanvasGadget' - Bisonte eine Lösung parat. ;-)

P.S.2: Habe vielleicht doch noch was gefunden. Wenn ich ein ImageGadget in den Container einfüge, kann ich aus dessen Klick-Event zugreifen.

ImageGadgetInsideContainerGadget:

Code: Alles auswählen

EnableExplicit

Enumeration
  #frmTest
  #frmTest_SAG
EndEnumeration

Procedure ImageEvent()
  Debug "ImageEvent" + EventGadget()
EndProcedure

Define newY, Counter, CG, IG

OpenWindow(#frmTest, #PB_Ignore, #PB_Ignore, 600, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

newY = 5

ScrollAreaGadget(#frmTest_SAG, 10, 15, 515, 350, 595, 550, 1, #PB_ScrollArea_Flat)

For Counter = 1 To 10
  CG = ContainerGadget(#PB_Any, 5, newY, 450, 100, #PB_Container_Flat)
    IG = ImageGadget(#PB_Any, 0, 0, 450, 100, 0)
    BindGadgetEvent(IG, @ImageEvent())
  CloseGadgetList()
  newY + 105
Next

CloseGadgetList()

SetGadgetAttribute(#frmTest_SAG,  #PB_ScrollArea_ScrollStep, 50)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
// EDIT: So, nach einigem Herumprobieren bin ich mit der ImageGadget-Lösung ganz zufrieden. Hat sich also mit dem CanvasGadget erledigt.

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Verfasst: 14.05.2018 22:16
von Bisonte
Kiffi hat geschrieben:Vielleicht hat 'nimm-doch-ein-CanvasGadget' - Bisonte eine Lösung parat. ;-)
Dafür hab ich doch glatt mal in der Trickkiste gewühlt... :mrgreen: Und tatsächlich was gefunden.

Man lenke einfach den Eventtype des Canvas auf das ScrollAreaGadget um ...
Dann sähe deine Eventprozedur in etwa so aus :

Code: Alles auswählen

Procedure CanvasEvent()
  
  Protected Direction 
  
  Select EventType()
    Case #PB_EventType_MouseWheel
      Direction = GetGadgetAttribute(EventGadget(), #PB_Canvas_WheelDelta)
      If Direction < 0
        SetGadgetAttribute(#frmTest_SAG, #PB_ScrollArea_Y, GetGadgetAttribute(#frmTest_SAG, #PB_ScrollArea_Y) + 5)
      Elseif Direction > 0
        SetGadgetAttribute(#frmTest_SAG, #PB_ScrollArea_Y, GetGadgetAttribute(#frmTest_SAG, #PB_ScrollArea_Y) - 5)
      EndIf
    Case #PB_EventType_LeftClick
      Debug "Click : " + Str(EventGadget())
  EndSelect
    
EndProcedure
Die Steps muss man natürlich anpassen, aber es geht ;)

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Verfasst: 14.05.2018 23:03
von Kiffi
Bisonte hat geschrieben:Dafür hab ich doch glatt mal in der Trickkiste gewühlt... :mrgreen: Und tatsächlich was gefunden.
wusste ich's doch, dass Du was aus dem Hut zaubern kannst! :allright:

Aber wie geschrieben: Mit der ImageGadget-Lösung bin ich ganz zufrieden. Ich glaube, dass ich's dabei belasse.

Danke & Grüße ... Peter