Seite 1 von 1

DialogLib und ScrollAreaGadget

Verfasst: 05.06.2025 00:44
von matbal
Mit dem ScrollareaGadget scheint es in der DialogLib ein Problem zu geben:

Im Beispiel-Code erstelle ich ein ScrollAreaGadget, in dem ist ein Canvas mit der Größe 100x100 (definiert im XML-Code). Nach öffnen des Dialogs vergrößere ich den Scrollbereich und das Canvas auf die benötigte Größe. Bis hierher ist alles O.K.

Wenn ich jedoch die Fenstergröße ändere, ist der Scrollbereich und das Canvas wieder klein.

Code: Alles auswählen

EnableExplicit
Runtime Enumeration Windows
	#FormMain
EndEnumeration

Runtime Enumeration Gadgets
	#FormMain_Scrollarea_1
	#FormMain_Canvas
EndEnumeration



Define XML$, event

XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs>"
XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget' name='main' xpos='0' ypos='0' id='#FormMain'>"
XML$ + "    <vbox width='400' height='300' expand='item:1'>"
XML$ + "      <scrollarea id='#FormMain_Scrollarea_1'>"
XML$ + "        <canvas width='100' height='100' id='#FormMain_Canvas'/>"
XML$ + "      </scrollarea>"
XML$ + "    </vbox>"
XML$ + "  </window>"
XML$ + "</dialogs>"
XML$ + ""


ParseXML(0, XML$)
If XMLStatus(0) = #PB_XML_Success
   CreateDialog(#FormMain)
   If OpenXMLDialog(#FormMain, 0, "main")
      
      ; Scrollarea und Canvas vergrößern
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerWidth, 600)
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerHeight, 400)
      ResizeGadget(#FormMain_Canvas, 0, 0, 600, 400)
      ; Grafik in Canvas
      If StartDrawing(CanvasOutput(#FormMain_Canvas))
         LineXY(0, 0, 600, 400, #Blue)
         LineXY(0, 400, 600, 0, #Blue)
         StopDrawing()
      EndIf
      
      Repeat
         event = WaitWindowEvent()
      Until event = #PB_Event_CloseWindow
   EndIf
EndIf


Re: DialogLib und ScrollAreaGadget

Verfasst: 05.06.2025 09:54
von Macros
Hallo matbal,

das liegt nicht am ScrollareaGadget sondern ist generell eine Eigenschaft der Bibliothek. Ihr Zweck ist es basierend auf dem XML automatisch eine schöne Oberfläche zu generieren. Wenn du manuell die Größe änderst bekommt die Bibliothek das sozusagen nicht mit. Wird dann die Fenstergröße geändert passt die Bibliothek wieder alle Gadgets auf die Angaben im XML an, also auch das Canvas was wieder auf 100*100 gesetzt wird.

Du kannst, falls es eine einmalige Änderung ist den XML Knoten anpassen:

Code: Alles auswählen

EnableExplicit
Runtime Enumeration Windows
	#FormMain
EndEnumeration

Runtime Enumeration Gadgets
	#FormMain_Scrollarea_1
	#FormMain_Canvas
EndEnumeration



Define XML$, event, canvasNode

XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs>"
XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget' name='main' xpos='0' ypos='0' id='#FormMain'>"
XML$ + "    <vbox width='400' height='300' expand='item:1'>"
XML$ + "      <scrollarea id='#FormMain_Scrollarea_1'>"
XML$ + "        <canvas width='100' height='100' id='#FormMain_Canvas'/>"
XML$ + "      </scrollarea>"
XML$ + "    </vbox>"
XML$ + "  </window>"
XML$ + "</dialogs>"
XML$ + ""



ParseXML(0, XML$)
; XML Knoten identifizieren und Attribute setzen
canvasNode = XMLNodeFromPath(MainXMLNode(0),"/dialogs/window/vbox/scrollarea/canvas")
SetXMLAttribute(canvasNode,"width","600")
SetXMLAttribute(canvasNode,"height","400")

If XMLStatus(0) = #PB_XML_Success
   CreateDialog(#FormMain)
   If OpenXMLDialog(#FormMain, 0, "main")
      
      ; Scrollarea und Canvas vergrößern
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerWidth, 600)
      SetGadgetAttribute(#FormMain_Scrollarea_1, #PB_ScrollArea_InnerHeight, 400)
      ;ResizeGadget(#FormMain_Canvas, 0, 0, 600, 400) funktioniert nicht
      ; Grafik in Canvas
      If StartDrawing(CanvasOutput(#FormMain_Canvas))
         LineXY(0, 0, 600, 400, #Blue)
         LineXY(0, 400, 600, 0, #Blue)
         StopDrawing()
      EndIf
      
      Repeat
         event = WaitWindowEvent()
      Until event = #PB_Event_CloseWindow
   EndIf
EndIf

Du musst allerdings den Dialog danach (oder nach jeder Größenanpassung erneut) öffnen.
Eine Alternative wäre nach jedem Resize erneut anzupassen (z.B. könntest du die Größe des größten Gadgets mit variabler Größe, also in dem Fall das ScrollArea, abfragen und bei Größenänderung dann wieder das Canvas Resizen)

Beides etwas umständlich, wie du merkst. Der Fall manuelle Größenänderungen in mit der Dialog Bibliothek zu kombinieren ist noch nicht vorgesehen.
Einen entsprechenden Feature Request gibt es schon im englischen Forum.

Re: DialogLib und ScrollAreaGadget

Verfasst: 05.06.2025 11:24
von matbal
Klingt logisch, danke für den Hinweis.
Macros hat geschrieben: 05.06.2025 09:54 Eine Alternative wäre nach jedem Resize erneut anzupassen (z.B. könntest du die Größe des größten Gadgets mit variabler Größe, also in dem Fall das ScrollArea, abfragen und bei Größenänderung dann wieder das Canvas Resizen)
Genauso umging ich das Problem. Kam mir nur falsch vor...

(Ich habe mein Programm mittlerweile ohne DialogLib umgeschrieben)

Re: DialogLib und ScrollAreaGadget

Verfasst: 05.06.2025 13:11
von HeX0R
und wieso hast Du die innerwidth und -height nicht einfach ins xml integriert?

Code: Alles auswählen

<scrollarea innerwidth='600' innerheight='400' id='#FormMain_Scrollarea_1'>

Re: DialogLib und ScrollAreaGadget

Verfasst: 06.06.2025 15:41
von matbal
Das war war Demo-Code, der das Problem zeigt. Im Originalprogramm von mir hängt die Größe vom gerade geladenen Bild ab.