Gadgets verschieben bzw. positionieren
Verfasst: 02.12.2022 14:53
vor langer Zeit habe ich mal einen ähnlichen Code geschrieben mit Namen gotoxy. Dieser war gut aber mit Flags überladen und deswegen unübersichtlich.
mein letzter Code WriteText basierte darauf.
Hier nun eine überarbeitete Version genannt goxy. Dieser kommt wieder mit nur 5 flags aus und beschränkt sich auf das Nötigste.
wer die Beispiele nicht mehr braucht kann sie ja löschen
Vorschläge sind erwünscht
mein letzter Code WriteText basierte darauf.
Hier nun eine überarbeitete Version genannt goxy. Dieser kommt wieder mit nur 5 flags aus und beschränkt sich auf das Nötigste.
wer die Beispiele nicht mehr braucht kann sie ja löschen
Vorschläge sind erwünscht
Code: Alles auswählen
;- Gadgets verschieben by HJBremer V.1.10 Nov 2022 - Windows 10 - PB ab 5.70 all
; goxy(pbnr, parent, position=#goBottom, align=#goLeft, gap=10, moveX=0, moveY=0)
; pbnr = pbnr des Gadgets welches verschoben wird
; parent = pbnr des Gadgets welches der Bezugspunkt ist
; position = flag bestimmt wo das Gadget hin soll, flags gelten auch für align, siehe DeclareModule
; align = flag bestimmt Ausrichtung
; gap = Abstand zum Parentgadget, Vorgabe ist 10 Pixel Abstand zum Gadget
; move = zusätzliche Möglichkeit ein Gadget zu verschieben, plus minus erlaubt
; Standarvorgabe ist #goBottom, #goLeft, Abstand 10 Pixel zum Gadget
;Beispiele
; goxy(pbnr, parent) ;unter dem Gadget links, Abstand Vorgabe 10
; goxy(pbnr, parent, #goTop) ;über dem Gadget links
; goxy(pbnr, parent, #goLeft) ;links vom Gadget oben
; goxy(pbnr, parent, #goRight) ;rechts vom Gadget oben
; goxy(pbnr, parent, #goRight, #goBottom, 3) ;rechts vom Gadget unten Abstand 3
; goxy(pbnr, parent, #goBottom, #goCenter, 3) ;unter dem Gadget mittig Abstand 3
;
; goxy(202, #window, #goTop, #goRight) ;im Window oben rechts, braucht kein #goInside
; goxy(200, #container, #goInside+#goBottom, #goRight) ;im Container unten rechts, #goInside wenn innerhalb
; Hinweis für #goInside: wenn ein Window die gleiche Nummer wie ein Gadget hat funktioniert es nicht !
; Hinweis für #goInside: ein Gadget muß in der entsprechenden Gadgetlist definiert sein z.B. beim Container !
; Hinweis: Konstanten benutzen, dient der Übersicht. Windows und Gadgets dürfen nicht die gleichen Werte haben.
DeclareModule goxy
#goTop = 16
#goLeft = 1
#goRight = 2
#goBottom = 128
#goCenter = $100000
#goInside = $80000 ;nur für Position wenn Parent Window oder Container etc
Declare.i goxy(pbnr, parent, position=#goBottom, align=#goLeft, gap=10, moveX=0, moveY=0)
Declare.i goxySetGap(gap)
EndDeclareModule
;-
Module goxy
EnableExplicit
Global newgap = #PB_Default
Procedure.i goxySetGap(gap)
newgap = gap
EndProcedure
Procedure.i goxy(child, parent, position=#goBottom, align=#goLeft, gap=10, moveX=0, moveY=0)
Protected info$ = "Child: " + Str(child) + " Parent: " + Str(parent) + " "
If newgap <> #PB_Default And gap = 10 : gap = newgap : EndIf
If IsGadget(child) = 0
Debug info$ + "Child ist kein Gadget"
ProcedureReturn
EndIf
Protected inside, parenttyp = 0
Protected x, y ;Child Gadget Werte
Protected w = GadgetWidth(child)
Protected h = GadgetHeight(child)
Protected px, py, pw, ph ;Parent Werte
If Bool(position & #goInside)
inside = #True: position = position - #goInside ;goinside entfernen
EndIf
If IsGadget(parent) = 0 ;wenn kein Gadget
If IsWindow(parent) ;wenn Window
parenttyp = 1 : inside = #True ;im Window immer inside
Else
Debug info$ + "Parent ist kein Gadget/Window"
ProcedureReturn
EndIf
Else ;ist ein Gadget
Select GadgetType(parent)
Case #PB_GadgetType_Container, #PB_GadgetType_Panel, #PB_GadgetType_ScrollArea
If inside: parenttyp = 2: EndIf
EndSelect
EndIf
If parenttyp = 1
pw = WindowWidth(parent): ph = WindowHeight(parent) ;Window Parent Werte
Else
px = GadgetX(parent): py = GadgetY(parent) ;Gadget Parent Werte
pw = GadgetWidth(parent): ph = GadgetHeight(parent)
EndIf
If parenttyp = 0 ;Parent ist ein Gadget
Select position ;wohin soll das ChildGadget ?
Case #goTop: y = py - h - gap ;y über dem Parent
Case #goLeft: x = px - w - gap ;x links vom Parent
Case #goRight: x = px + pw + gap ;x rechts vom Parent
Case #goBottom: y = py + ph + gap ;y unter dem Parent
Default: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Select align ;Ausrichtung
Case #goTop
Select position
Case #goLeft, #goRight: y = py
Default: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Case #goLeft
Select position
Case #goTop, #goBottom: x = px
Default: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Case #goRight
Select position
Case #goTop, #goBottom: x = px + pw - w
Default: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Case #goBottom:
Select position
Case #goLeft, #goRight: y = py + ph - h
Default: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Case #goCenter:
Select position
Case #goTop, #goBottom: x = px + ((pw - w)/2)
Case #goLeft, #goRight: y = py + ((ph - h)/2)
Case #goCenter: Debug info$ + "Flag nicht vorgesehen"
EndSelect
Default: Debug info$ + "Flag nicht vorgesehen/unbekannt"
EndSelect
Else ;Parent ist window oder container
Select position ;wohin soll das ChildGadget ?
Case #goTop: y = gap
Case #goBottom: y = ph - h - gap
Default: Debug info$ + "Flag für posi im window/container nicht vorgesehen"
EndSelect
Select align
Case #goLeft : x = gap
Case #goRight : x = pw - gap - w
Case #goCenter : x = (pw - w) / 2
Default: Debug info$ + "Flag für align im window/container nicht vorgesehen"
EndSelect
EndIf
ResizeGadget(child, x + moveX, y + moveY, #PB_Ignore, #PB_Ignore)
EndProcedure
EndModule
UseModule goxy
;===================
CompilerIf #PB_Compiler_IsMainFile
#window = 50
#parent = 0
#container = 100
#container2 = 110
OpenWindow(#window, 0, 0, 850, 500, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#parent, 100, 100, 200, 50, "Gadget Parent")
For j = 1 To 12
ButtonGadget(j, 0, 0, 60, 22, "Button " + Str(j))
Next
goxy(1, #parent) ;position=#goBottom + align=#goLeft sind Vorgabe
goxy(2, #parent, #goRight, #goTop)
goxy(3, #parent, #goLeft, #goTop)
goxy(4, #parent, #goBottom, #goRight, 10, -8) ;x wird um -8 verschoben
goxy(5, #parent, #goRight, #goBottom)
goxy(6, #parent, #goTop, #goCenter, 5) ;Abstand ist hier 5
goxySetGap(20)
goxy(7, 1)
goxy(8, 7)
goxy(9, 8, #goBottom, #goLeft)
goxy(10, 9, #goRight, #goTop)
goxy(11, 9)
goxySetGap(#PB_Default)
goxy(12, #parent, #goTop)
ContainerGadget(#container, 500, 110, 200, 222, 1)
ButtonGadget(190, 0, 0, 90, 25, "Button 190")
ButtonGadget(191, 0, 0, 90, 25, "Button 191")
goxy(190, #container, #goInside+#goTop, #goLeft) ; + oder |
goxy(191, #container, #goInside|#goBottom, #goRight) ; erlaubt
CloseGadgetList()
ButtonGadget(201, 0, 0, 80, 25, "Button 201")
ButtonGadget(202, 0, 0, 80, 25, "Button 202")
ButtonGadget(203, 0, 0, 80, 25, "Button 203")
goxy(201, #window, #goBottom)
goxy(202, #window, #goTop, #goRight)
goxy(203, #window, #goTop, #goCenter)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
CompilerEndIf