Seite 1 von 1

GadgetWidth()/GadgetHeight() - Bug?

Verfasst: 08.05.2009 23:09
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?

Verfasst: 08.05.2009 23:17
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:

Verfasst: 09.05.2009 00:00
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?

Verfasst: 09.05.2009 00:10
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:

Verfasst: 09.05.2009 00:19
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.

Verfasst: 09.05.2009 00:20
von Kaeru Gaman
guter Hinweis!

... konnte ich auch gleich weitergeben:
http://www.purebasic.fr/german/viewtopi ... 001#244001