GadgetWidth()/GadgetHeight() - Bug?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

GadgetWidth()/GadgetHeight() - Bug?

Beitrag von dllfreak2001 »

Ich bastel bißchen mit nem Fenster an einer vernünftigen Bedienoberfläche herum und hier bekomme ich ein Problem.
Wenn ich mein Fenster maximiere gibt GadgetWidth/Height bezogen auf ein Containergadget welches sich in einem Splittergadget befindet nicht den richtigen wert zurück. Es gibt stattdessen nur den Wert vor dem Maximieren wieder, hebt man dann die Maximierung auf gibt es dann
den für das maximierte Fenster richtigen Wert wieder.

Code: Alles auswählen

Enumeration
  #MainWindow
  #ProjectWindow
EndEnumeration

Enumeration
  #MainMenu
EndEnumeration

Enumeration
  #MenuNew
  #MenuOpen
  #MenuSave
  #MenuProject
EndEnumeration

Enumeration
  #ProjectOKButton
  #ProjectCancelButton
  #ProjectNameInfoText
  #ProjectNameString
  #ProjectWidthInfoText
  #ProjectHeightInfoText
  #ProjectWidthString
  #ProjectHeightString
  
  #EditorImage
  #ToolPanel
  
  #EditorVScroll
  #EditorHScroll
  
  #MapScrollArea
  #MapImage
  
  #EditorContainer
  #ToolSplitter
  #MainSplitter
EndEnumeration

Enumeration
  #ImEditor
  #ImMiniMap
EndEnumeration


CreateImage(#ImEditor,200,200)
CreateImage(#ImMiniMap,200,200)


Global MapWidth.l, MapHeight.l, MapName.s

MapWidth = 200
MapHeight = 200
MapName = "Neues Level"


OpenWindow(#MainWindow,0,0,800,600,"MapED v0.002", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)

  CreateMenu(#MainMenu,WindowID(#MainWindow))
    MenuTitle("Datei")
      MenuItem(#MenuNew,"Neu")
      MenuItem(#MenuOpen,"Öffnen")
      MenuItem(#MenuSave,"Speichern")
      MenuBar()
      MenuItem(#MenuProject,"Projekteigenschaften")
      MenuBar()
  
  
  ContainerGadget(#EditorContainer,0,0,400,600)
    ImageGadget(#EditorImage,0,0, 200, 200, ImageID(#ImEditor))    
    ScrollBarGadget(#EditorVScroll,0,0,20,100,0,MapHeight-1,1,#PB_ScrollBar_Vertical)
    ScrollBarGadget(#EditorHScroll,0,0,100,20,0,MapWidth-1,1) 
  CloseGadgetList()
  
  
  
  
  ScrollAreaGadget(#MapScrollArea, 0, 0, 200,200,200,200,1)
    ImageGadget(#MapImage,0,0,150,150,ImageID(#ImMiniMap))
  CloseGadgetList()
  
  PanelGadget(#ToolPanel, 600, 5, 100, 100)
    AddGadgetItem (#ToolPanel, -1, "Karte")
    AddGadgetItem (#ToolPanel, -1, "Wand")
    AddGadgetItem (#ToolPanel, -1, "Paralax")  
    AddGadgetItem (#ToolPanel, -1, "Funktion")  
  CloseGadgetList()
  
   
   
  SplitterGadget(#ToolSplitter, 400,200,200,600,#ToolPanel,#MapScrollArea,#PB_Splitter_Separator)
  SetGadgetState(#ToolSplitter,380)
  SplitterGadget(#MainSplitter,0,0,600,480,#EditorContainer,#ToolSplitter,#PB_Splitter_Separator|#PB_Splitter_Vertical )
  SetGadgetState(#MainSplitter,440)
    
    
Procedure.b ProjectWindow()

  DisableWindow(#MainWindow, #True)
  
  OpenWindow(#ProjectWindow,0,0,300,80,"Projekteigenschaften", #PB_Window_ScreenCentered, WindowID(#MainWindow))

    ButtonGadget(#ProjectOKButton,225,30,70,20,"OK")  
    ButtonGadget(#ProjectCancelButton,225,55,70,20,"Abbrechen")  

    TextGadget(#ProjectNameInfoText,5,10,50,15,"Name:")
    StringGadget(#ProjectNameString,55,5,240,20,MapName)

    TextGadget(#ProjectWidthInfoText,5,35,50,15,"Breite = ")
    StringGadget(#ProjectWidthString,55,30,50,20,Str(MapWidth), #PB_String_Numeric )

    TextGadget(#ProjectHeightInfoText,5,60,50,15,"Höhe = ")
    StringGadget(#ProjectHeightString,55,55,50,20,Str(MapHeight), #PB_String_Numeric )

  Repeat
  
    If WaitWindowEvent() = #PB_Event_Gadget
      
        Select EventGadget()
          
          Case #ProjectOKButton
          
            If Val(GetGadgetText(#ProjectWidthString)) < 16 Or Val(GetGadgetText(#ProjectWidthString)) > 1024 Or Val(GetGadgetText(#ProjectHeightString)) < 16 Or Val(GetGadgetText(#ProjectHeightString)) > 1024
              MessageRequester("Achtung","Die Höhe und Breite des Projektes muss zwischen 16 und 1024 liegen!")
            Else
              MapName = GetGadgetText(#ProjectNameString)
              MapWidth = Val(GetGadgetText(#ProjectWidthString))
              MapHeight = Val(GetGadgetText(#ProjectHeightString))
              CloseWindow(#ProjectWindow)  
              DisableWindow(#MainWindow, #False)

              ProcedureReturn #True
            EndIf

          Case #ProjectCancelButton
            
            CloseWindow(#ProjectWindow)  
            DisableWindow(#MainWindow, #False)
            ProcedureReturn #False

        EndSelect

    EndIf

  ForEver
EndProcedure

Procedure DrawEditorImage()
  Protected imWidth.l, imHeight.l
  
  
  StartDrawing(ImageOutput(#ImEditor))
    imWidth = ImageWidth(#ImEditor)
    imHeight = ImageHeight(#ImEditor)
    
    
  StopDrawing()
EndProcedure





Repeat

  Select WaitWindowEvent()

    Case #PB_Event_Menu
    
      Select EventMenu()
      
        Case #MenuProject
          ProjectWindow()

      EndSelect

    Case #PB_Event_CloseWindow
      CloseWindow(#MainWindow)
      End
  
    Case #PB_Event_SizeWindow
      winw.l = WindowWidth(#MainWindow)
      winh.l = WindowHeight(#MainWindow) - MenuHeight()
      WindowEvent()
      
      ;-***Hier frage ich die Größe des Containergadgets ab
      edw.l = GadgetWidth(#EditorContainer)
      edh.l = GadgetHeight(#EditorContainer)  
      Debug edw
                  
      If edw - 20> 1 And edh - 20 > 1
        CreateImage(#ImEditor,edw - 20, edh - 20) 
        SetGadgetState(#EditorImage, ImageID(0))
         
      EndIf
      

      ResizeGadget(#EditorVScroll,edw-20,0,20,edh-20)
      ResizeGadget(#EditorHScroll,0, edh-20, edw-20, 20)
      
      ResizeGadget(#MainSplitter,0, 0, winw, winh)

      
  EndSelect

ForEver
Irgendwie komisch... sind diese Probleme mit verschachtelten Gadgets schon bekannt?
I´a dllfreak2001
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Dann ändere mal Dein Case in:

Code: Alles auswählen

Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
Beim Maximieren wird das Fenster auch verschoben, auf 0, 0 :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Danke, funktioniert. :allright:

Aber wieso das so ist, versteh ich irgendwie nicht.
Was hat denn die Position des Fensters mit der Gadgetgröße zutun?
I´a dllfreak2001
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Die größe wird erst im #WM_MOVE Ereignis geändert, da Du dies nicht
abfragst, die Größe im #WM_SIZE noch normal ist, bekommste den alten Wert.

Maximieren ist in erster Linie ein Move Ereignis, das Fenster wird
verschoben, okay, Resized wird es nebenbei auch noch, aber das wird so in
WM_SIZE noch nicht ausgewertet. Aber beide Ereignisse koppeln macht das
drüber Nachdenken überflüssig :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Danke, habs verstanden.

Ist aber richtig undurchsichtig für jemanden der das nicht weiß.
Nebenbei wird das verändern des Splittergadgets auch als #WM_MOVE Ereignis gezählt, was die ganze Sache noch inkosistenter macht...
Aber ich weiß ja jetzt bescheid.
I´a dllfreak2001
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

guter Hinweis!

... konnte ich auch gleich weitergeben:
http://www.purebasic.fr/german/viewtopi ... 001#244001
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten