Resize ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Resize ?

Beitrag von marcelx »

Hallo,

ich komme nicht weiter mit meine Test-Code und zwar wie ich in der Procedure ResizeWindowEvent() verfahren sollte beim ändern der Window Breite und Höhe

Danke für eine Hilfe

Gruß
MarcelX

Code: Alles auswählen

Enumeration
  #Window_0
  #Container1
  #Container2
  #Container3
  
  #Splitter1
  #Splitter2

  #lstCTxt
  #lstSCTxt
  #lstCG
  #lstCSG
  
  #lstG
  #lstGTxt
  #lstSGT
  #lstSG
  
  #lstD
EndEnumeration

Global x1=100
Global x2=90

Global G_colIDwidth = 60

Procedure OpenWindow_0(x = 0, y = 0, width = 800, height = 400)
  Window_0 = OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered) 
  
  ContainerGadget(#Container1, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstCTxt, 5, 10, x1, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCG, 5, 30, x1-20, 21)
    AddGadgetItem(#lstCG, -1, "Tout")
    SetGadgetState(#lstCG, 0)  
    TextGadget(#lstGTxt, 5, 50+20, x1-20, 21, "Groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstG, 5, 70+20, x1, 130)
  CloseGadgetList()
  
  ContainerGadget(#Container2, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstSCTxt, 5, 10, x2, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCSG, 5, 30, x2, 21)
    AddGadgetItem(#lstCSG, -1, "Tout")
    SetGadgetState(#lstCSG, 0)  
    TextGadget(#lstSGT, 5, 70, x2, 21, "Sous-groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstSG, 5, 90, x2, 130)
  CloseGadgetList()
  
  ContainerGadget(#Container3, 0, 0, 0, 0 ,#PB_Container_Flat)
    ListIconGadget(#lstD, 5, 70, 500, 130, "A", G_colIDwidth, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop)
    AddGadgetColumn(#lstD, 1, "B", 100)
  CloseGadgetList()
  
  w= WindowWidth(#Window_0)
  SplitterGadget(#Splitter1, 0, 0, 0, 0, #Container1, #Container2, #PB_Splitter_Vertical|#PB_Splitter_FirstFixed     )
  SplitterGadget(#Splitter2, 5, 70, w-10, 230, #Splitter1, #Container3, #PB_Splitter_Vertical|#PB_Splitter_SecondFixed )

  SetGadgetState(#Splitter2, 200) 
  SetGadgetState(#Splitter1, 90)

EndProcedure

Procedure ResizeWindowEvent()
  ResizeGadget(#Container3,#PB_Ignore,#PB_Ignore,WindowWidth(#Window_0) - GadgetWidth(#Splitter1)-20,WindowHeight(#Window_0))
  ResizeGadget(#lstD,#PB_Ignore,#PB_Ignore,WindowWidth(#Window_0) - GadgetWidth(#Splitter1)-20,WindowHeight(#Window_0))
  
  ResizeGadget(#Container1,#PB_Ignore,#PB_Ignore,WindowWidth(#Window_0) - GadgetWidth(#Splitter1)-20, WindowHeight(#Window_0))
  ResizeGadget(#lstG,#PB_Ignore,#PB_Ignore,#PB_Ignore,WindowHeight(#Window_0))
  ; ???
EndProcedure

BindEvent(#PB_Event_SizeWindow, @ResizeWindowEvent())

OpenWindow_0()

For a = 1 To 20
  AddGadgetItem (#lstG, -1, "Item " + Str(a)) 
Next

Repeat
  Event = WaitWindowEvent()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Splitter1 
          newWidth = GadgetWidth(#Container1)-20
          ResizeGadget(#lstCTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstCG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstGTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)

          newWidth = GadgetWidth(#Container2)-20
          ResizeGadget(#lstSCTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstCSG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
          ResizeGadget(#lstSGT, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore) 

          newWidth = GadgetWidth(#Container3)-20
          ResizeGadget(#lstD, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Resize ?

Beitrag von STARGÅTE »

Was genau soll denn passieren, wenn das Fenster in der Größe verändert wird?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Resize ?

Beitrag von marcelx »

Habe ich vergessen zur schreiben.
Bei Horizontal-Ziehen sollte
- der ContainerGadget(#Container3) breiter gesetzt werden und sein Inhalt (der ListIconGadget #lstD)
Beim Vertikal Ziehen sollte
- alle Element länger gezogen werden (alle ContainerGadget mit Inhalt wie ComboBoxGadget, ListViewGadget, ListIconGadget)
Win-10, PB 5.31 (Windows - x86)
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Resize ?

Beitrag von matbal »

Ich habe versucht deinen Code zu ändern.

Der Splitter sollte auch mit BindGadgetEvent verwendet werden, wenn Größenänderungen bei Änderung der Fenstergröße direkt erfolgen sollen. Ich habe den Teil aus der Eventschleife in die Callback-Prozedur genommen.

Code: Alles auswählen

Enumeration
  #Window_0
  #Container1
  #Container2
  #Container3
 
  #Splitter1
  #Splitter2

  #lstCTxt
  #lstSCTxt
  #lstCG
  #lstCSG
 
  #lstG
  #lstGTxt
  #lstSGT
  #lstSG
 
  #lstD
EndEnumeration

Global x1=100
Global x2=90

Global G_colIDwidth = 60

Declare ResizeWindowEvent()
Declare Splitter()

Procedure OpenWindow_0(x = 0, y = 0, width = 800, height = 400)
  Window_0 = OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
 
  ContainerGadget(#Container1, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstCTxt, 5, 10, x1, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCG, 5, 30, x1-20, 21)
    AddGadgetItem(#lstCG, -1, "Tout")
    SetGadgetState(#lstCG, 0) 
    TextGadget(#lstGTxt, 5, 50+20, x1-20, 21, "Groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstG, 5, 70+20, x1, 130)
  CloseGadgetList()
 
  ContainerGadget(#Container2, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstSCTxt, 5, 10, x2, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCSG, 5, 30, x2, 21)
    AddGadgetItem(#lstCSG, -1, "Tout")
    SetGadgetState(#lstCSG, 0) 
    TextGadget(#lstSGT, 5, 70, x2, 21, "Sous-groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstSG, 5, 90, x2, 130)
  CloseGadgetList()
 
  ContainerGadget(#Container3, 0, 0, 0, 0 ,#PB_Container_Flat)
    ListIconGadget(#lstD, 5, 70, 500, 130, "A", G_colIDwidth, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop)
    AddGadgetColumn(#lstD, 1, "B", 100)
  CloseGadgetList()
 
  w= WindowWidth(#Window_0)
  SplitterGadget(#Splitter1, 0, 0, 0, 0, #Container1, #Container2, #PB_Splitter_Vertical )
  SplitterGadget(#Splitter2, 5, 70, w-10, 230, #Splitter1, #Container3, #PB_Splitter_Vertical|#PB_Splitter_FirstFixed )

  SetGadgetState(#Splitter2, 200)
  SetGadgetState(#Splitter1, 90)
  
EndProcedure

Procedure ResizeWindowEvent()
   Debug "RESIZE"
   ResizeGadget(#Splitter2, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0) - 10, WindowHeight(#Window_0) - 170)
  ; ???
EndProcedure

Procedure Splitter()
   Protected newWidth, newHeight
   
   newWidth = GadgetWidth(#Container1)-20
   newHeight = GadgetHeight(#Container1)-100
   ResizeGadget(#lstCTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   ResizeGadget(#lstG, #PB_Ignore, #PB_Ignore, newWidth, newHeight)
   ResizeGadget(#lstCG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   ResizeGadget(#lstGTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   
   newWidth = GadgetWidth(#Container2)-20
   newHeight = GadgetHeight(#Container2)-100
   ResizeGadget(#lstSCTxt, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   ResizeGadget(#lstSG, #PB_Ignore, #PB_Ignore, newWidth, newHeight)
   ResizeGadget(#lstCSG, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   ResizeGadget(#lstSGT, #PB_Ignore, #PB_Ignore, newWidth, #PB_Ignore)
   
   newWidth = GadgetWidth(#Container3)-20
   newHeight = GadgetHeight(#Container3)-100
   ResizeGadget(#lstD, #PB_Ignore, #PB_Ignore, newWidth, newHeight)
   
EndProcedure



OpenWindow_0()

BindEvent(#PB_Event_SizeWindow, @ResizeWindowEvent())
BindGadgetEvent(#Splitter1, @Splitter())
BindGadgetEvent(#Splitter2, @Splitter())


For a = 1 To 20
  AddGadgetItem (#lstG, -1, "Item " + Str(a))
Next

Repeat
  Event = WaitWindowEvent()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
         Case #Splitter1, #Splitter2
       
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Resize ?

Beitrag von marcelx »

Hallo matbal
es ist nicht nur ein Versuche sondern funktioniert super.
Ich habe wieder was gelernt - Danke matbal
Gruß
MarcelX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Resize ?

Beitrag von Kiffi »

Seitdem ich die Dialog-Lib verwende, brauche ich mich um das Resizen der Gadgets nicht mehr zu kümmern.

Vielleicht ist das ja auch was für Dich?

Code: Alles auswählen

EnableExplicit

Define XML$

XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs>"
XML$ + "  <window flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered' width='800' height='400' name='window_0'>"
XML$ + "    <hbox>"
XML$ + "      <splitter flags='#PB_Splitter_Vertical'>"
XML$ + "        <splitter flags='#PB_Splitter_Vertical'>"
XML$ + "          <container flags='#PB_Container_Flat'>"
XML$ + "            <vbox expand='item:4'>"
XML$ + "              <text text='Catégorie'/>"
XML$ + "              <combobox/>"
XML$ + "              <text text='Groupe'/>"
XML$ + "              <listview/>"
XML$ + "            </vbox>"
XML$ + "          </container>"
XML$ + "          <container flags='#PB_Container_Flat'>"
XML$ + "            <vbox expand='item:4'>"
XML$ + "              <text text='Catégorie'/>"
XML$ + "              <combobox/>"
XML$ + "              <text text='Groupe'/>"
XML$ + "              <listview/>"
XML$ + "            </vbox>"
XML$ + "          </container>"
XML$ + "        </splitter>"
XML$ + "        <listicon name='listicon' />"
XML$ + "      </splitter>"
XML$ + "    </hbox>"
XML$ + "  </window>"
XML$ + "</dialogs>"


#Dialog = 0
#Xml = 0

Define ListIcon

If ParseXML(#Xml, XML$) And XMLStatus(#Xml) = #PB_XML_Success
  
  If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "window_0")
    
    ListIcon = DialogGadget(#Dialog, "listicon")
    
    RemoveGadgetColumn(ListIcon, 0)
    
    AddGadgetColumn(ListIcon, 0, "A", 100)
    AddGadgetColumn(ListIcon, 1, "B", 100)
    AddGadgetColumn(ListIcon, 2, "C", 100)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
    
  Else  
    Debug "Dialog error: " + DialogError(#Dialog)
  EndIf
  
Else
  Debug "XML error: " + XMLError(#Xml) + " (Line: " + XMLErrorLine(#Xml) + ")"
EndIf
Hygge
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Resize ?

Beitrag von marcelx »

Danke Kiffi
ich bleibe bei der konventionelle Code-Lösung
Win-10, PB 5.31 (Windows - x86)
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Resize ?

Beitrag von matbal »

Mit sogenannten AutoResizern läßt auch sich einige Schreibarbeit ersparen. Die Parameter der AutoResize-Prozedure machen das gleiche wie die Verankerung der Gadgets im FormDesigner von Purebasic.

Es gibt ein einige solche Projekte, wie beispielsweise diesen AutoResizer von breeze4me. (In der Include muß #Pb_Sort_Integer gegen #Pb_Integer ausgetauscht werden)
Hier dein Code-Beispiel mit dieser Include:

Code: Alles auswählen

XIncludeFile "AutoResizer.pbi"

Enumeration
  #Window_0
  #Container1
  #Container2
  #Container3
 
  #Splitter1
  #Splitter2

  #lstCTxt
  #lstSCTxt
  #lstCG
  #lstCSG
 
  #lstG
  #lstGTxt
  #lstSGT
  #lstSG
 
  #lstD
EndEnumeration

Global x1=110
Global x2=90

Global G_colIDwidth = 60

Procedure OpenWindow_0(x = 0, y = 0, width = 800, height = 400)
  Window_0 = OpenWindow(#Window_0, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
 
  ContainerGadget(#Container1, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstCTxt, 5, 10, x1, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCG, 5, 30, x1-20, 21)
    AddGadgetItem(#lstCG, -1, "Tout")
    SetGadgetState(#lstCG, 0) 
    TextGadget(#lstGTxt, 5, 50+20, x1-20, 21, "Groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstG, 5, 70+20, x1-20, 130)
  CloseGadgetList()
 
  ContainerGadget(#Container2, 0, 0, 0, 0 ,#PB_Container_Flat)
    TextGadget(#lstSCTxt, 5, 10, x2, 21, "Catégorie", #PB_Text_Center);|#PB_Text_Border)
    ComboBoxGadget(#lstCSG, 5, 30, x2, 21)
    AddGadgetItem(#lstCSG, -1, "Tout")
    SetGadgetState(#lstCSG, 0) 
    TextGadget(#lstSGT, 5, 70, x2, 21, "Sous-groupe", #PB_Text_Center);|#PB_Text_Border)
    ListViewGadget(#lstSG, 5, 90, x2, 130)
  CloseGadgetList()
 
  ContainerGadget(#Container3, 0, 0, 0, 0 ,#PB_Container_Flat)
    ListIconGadget(#lstD, 5, 70, 570, 130, "A", G_colIDwidth, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines|#PB_ListIcon_HeaderDragDrop)
    AddGadgetColumn(#lstD, 1, "B", 100)
  CloseGadgetList()
 
  w= WindowWidth(#Window_0)
  SplitterGadget(#Splitter1, 0, 0, 0, 0, #Container1, #Container2, #PB_Splitter_Vertical     )
  SplitterGadget(#Splitter2, 5, 70, w-10, 230, #Splitter1, #Container3, #PB_Splitter_Vertical|#PB_Splitter_FirstFixed )

  SetGadgetState(#Splitter2, 204)
  SetGadgetState(#Splitter1, 100)
  
  
  ; Verankerung der Gadgets setzen (links, oben, rechts, unten)
  
  AutoResizer_SetAnchors(#Splitter2, 1, 1, 1, 1)
  
  AutoResizer_SetAnchors(#lstCTxt, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstCG, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstGTxt, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstG, 1, 1, 1, 1)
  
  AutoResizer_SetAnchors(#lstSCTxt, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstCSG, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstSGT, 1, 1, 1, 0)
  AutoResizer_SetAnchors(#lstSG, 1, 1, 1, 1)
  
  AutoResizer_SetAnchors(#lstD, 1, 1, 1, 1)

EndProcedure

Procedure ResizeWindowEvent()
   ; ???
   AutoResizer_ResizeGadgets(#Window_0)
EndProcedure


OpenWindow_0()
BindEvent(#PB_Event_SizeWindow, @ResizeWindowEvent())

BindGadgetEvent(#Splitter1, @ResizeWindowEvent())
BindGadgetEvent(#Splitter2, @ResizeWindowEvent())

For a = 1 To 20
  AddGadgetItem (#lstG, -1, "Item " + Str(a))
Next

Repeat
  Event = WaitWindowEvent()

  Select Event
    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
Der PureBasic FormDesigner erstellt ja auch eine Resize-Prozedur für die Gadgets, wenn Verankerungen gesetzt werden. Diesen Resizecode könnte man theoretisch auch übernehmen.

Leider kommt der Designer nicht (und kam noch nie) richtig mit dem Splittergadget klar. Sobald man ein Splitter im Formular hat, kann man sich überraschen lassen, was passiert, wenn man von der Form-Ansicht in die Code-Ansicht und wieder zurück schaltet. Probleme entstehen immer dann, wenn nach dem SplitterGadget weitere Gadgets (außerhalb des Splitters) hinzugefügt wurden.
Antworten