CanvasGadgets im ScrollAreaGadget: Scrollproblem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

CanvasGadgets im ScrollAreaGadget: Scrollproblem

Beitrag 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
Hygge
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Beitrag 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.
Hygge
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Beitrag 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 ;)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CanvasGadgets im ScrollAreaGadget: Scrollproblem

Beitrag 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
Hygge
Antworten