Seite 1 von 3

Window oder Gadget neu zeichenen lassen

Verfasst: 11.05.2009 12:15
von dllfreak2001
Ich nutze grad massiv Splittergadgets, durch das Resizen wird
aber ein Panelgadget sehr schnell unleserlich gemacht.
Es gab doch mal so einen Befehl der das ganze Fenster neuzeichnen ließ, oder irre ich mich.

Nebenbei, die Funktion für den Smartrefresh zeigt hier keinerlei Veränderung.

Verfasst: 11.05.2009 12:53
von Fluid Byte
Du geben Code. Ansonsten #WS_CLIPCHILDREN helfen kann.

PS: InvalidateRect_(hwnd,0,1)

Verfasst: 11.05.2009 13:00
von dllfreak2001
Du kriegen Code hier:

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
    
  #EditorContainer
    #EditorImage
    #EditorVScroll
    #EditorHScroll
  
  #ToolPanel
    #KarteList

  #MapScrollArea
    #MapImage

  #ToolSplitter
  #MainSplitter
EndEnumeration

Enumeration
  #ImEditor
  #ImMiniMap
EndEnumeration


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


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


#TileSize = 64

MapWidth = 200
MapHeight = 200
MapName = "Level"


Global MausX.l, MausY.l

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 * #TileSize,1,#PB_ScrollBar_Vertical)
    ScrollBarGadget(#EditorHScroll,0,0,100,20,0,MapWidth * #TileSize,1) 
  CloseGadgetList()

  ScrollAreaGadget(#MapScrollArea, 0, 0, 200,200,200,200,1,#PB_ScrollArea_BorderLess)
    ImageGadget(#MapImage,0,0,150,150,ImageID(#ImMiniMap))
  CloseGadgetList()
  
  PanelGadget(#ToolPanel, 600, 5, 100, 100)
    AddGadgetItem (#ToolPanel, -1, "Karte")
      
      ListViewGadget(#KarteList,0,0,100,100)
      TextGadget(687,0,0,100,15,"Preview:")

    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, vScroll.l, hScroll.l, vModulo.l, hModulo.l
  
  vScroll = GetGadgetState(#EditorVScroll)
  hScroll = GetGadgetState(#EditorHScroll)
  hModulo = hScroll%#TileSize
  vModulo = vScroll%#TileSize
  
  StartDrawing(ImageOutput(#ImEditor))
    imWidth = ImageWidth(#ImEditor)
    imHeight = ImageHeight(#ImEditor)

    Box(0,0,imWidth,imHeight,0)
    

    DrawingMode(#PB_2DDrawing_Transparent)
    
    For x = 0 To Round(imWidth/#TileSize,1)
      Line(x*#TileSize - hModulo,0,0,imHeight,$00009F)
    Next
    For y = 0 To Round(imHeight/#TileSize,0)
      Line(0,y*#TileSize - vModulo,imWidth,0,$00009F)
    Next
    
    For x = 0 To Round(imWidth/#TileSize,1)
      DrawText(x*#TileSize  - hModulo, 0, Str(x + Round(hScroll/#TileSize,0)), $9CE259)  
    Next
    For y = 0 To Round(imHeight/#TileSize,0)
      DrawText(0,y*#TileSize - vModulo, Str(y + Round(vScroll/#TileSize,0)), $9CE259)   
    Next
  StopDrawing()
  
  SetGadgetState(#EditorImage, ImageID(#ImEditor))
  
  
  StartDrawing(ImageOutput(#ImMiniMap))
    Box(0,0,MapWidth,MapHeight,0)
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(hScroll/#TileSize,vScroll/#TileSize,Round(imWidth/#TileSize,1), Round(imHeight/#TileSize,1),$00FFFF)
  StopDrawing()
  
  SetGadgetState(#MapImage, ImageID(#ImMiniMap))
EndProcedure






Repeat
  
  MausX = WindowMouseX(#MainWindow)
  MausY = WindowMouseY(#MainWindow)


  Select WaitWindowEvent()

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


    Case #PB_Event_Gadget
      
      Select EventGadget()
        
        Case #MapImage
          
          If EventType() = #PB_EventType_LeftClick
            
            spx.l = GetGadgetState(#MainSplitter)
            spy.l = GetGadgetState(#ToolSplitter)
            
            
            msx.l = GetGadgetAttribute(#MapScrollArea,#PB_ScrollArea_X)
            
            
            msy.l = GetGadgetAttribute(#MapScrollArea,#PB_ScrollArea_Y)
            eimw.l = GadgetWidth(#EditorImage)
            eimh.l = GadgetHeight(#EditorImage)
            
            SetGadgetState(#EditorHScroll, Round((MausX - spx + msx - 6)*#TileSize - eimw/2 ,0))
            SetGadgetState(#EditorVScroll, Round((MausY - spy + msy - 6)*#TileSize  - eimh/2 ,0))
            
            
          EndIf
          
      
      
      
      EndSelect
      



    Case #PB_Event_CloseWindow
      CloseWindow(#MainWindow)
      End
  
    Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
      winw.l = WindowWidth(#MainWindow)
      winh.l = WindowHeight(#MainWindow) - MenuHeight()

      
  
      edw.l = GadgetWidth(#EditorContainer)
      edh.l = GadgetHeight(#EditorContainer)  

      If edw - 20> 1 And edh - 20 > 1
        CreateImage(#ImEditor,edw - 20, edh - 20) 
        SetGadgetState(#EditorImage, ImageID(0))
      EndIf
      

      ResizeGadget(#EditorVScroll,edw-19,0,18,edh-20)
      ResizeGadget(#EditorHScroll,0, edh-19, edw-20, 18)
      
      
      ResizeGadget(#KarteList,0,0,  GetGadgetAttribute(#ToolPanel,#PB_Panel_ItemWidth)-2,GetGadgetAttribute(#ToolPanel,#PB_Panel_ItemHeight)-30-#TileSize)
      ResizeGadget(687,0,GetGadgetAttribute(#ToolPanel,#PB_Panel_ItemHeight)-25-#TileSize,  100,15)
     
      
      
      SetGadgetAttribute(#EditorHScroll, #PB_ScrollBar_PageLength, edw-20)
     
     
      SetGadgetAttribute(#EditorVScroll, #PB_ScrollBar_PageLength, edh-20)
      
      ResizeGadget(#MainSplitter,0, 0, winw, winh)
      


  EndSelect
  

  DrawEditorImage()

ForEver



Verfasst: 11.05.2009 14:05
von Fluid Byte
Also erst mal, der Code is' ne' Katastrophe :mrgreen:

Durch die ganze Verschachtelungen ist es etwas müssig an den richtigen Stellen zu gelangen. Aber ich benutzte ein ähnliches Layout in meinem VD von daher ist das zu schaffen. Muss mich da noch mal genauer reinfuchsen.

Verfasst: 11.05.2009 16:36
von dllfreak2001
Der ist doch keine Katastrophe nur nicht kommentiert.


Dann erkläre ich dir den mal....

Ich habe ein panel #ToolPanel und eine scrollarea #MapScrollArea die kommen in den #ToolSplitter rein.
Der Kommt mit dem #EditorContainer in das #MainSplitter.

Aber mit deinem "InvalidateRect_(hwnd,0,1)" funzt das schon ganz gut, Problem gelöst.

Verfasst: 11.05.2009 17:22
von Fluid Byte
dllfreak2001 hat geschrieben:Der ist doch keine Katastrophe nur nicht dokumentiert.
:lol:

- Indention nach Lust und Laune
- die meisten Variablen klein geschrieben
- kaum Leerzeichen bei Operatoren
- kein EnableExplicit
- keine Konstanten Prefixe
- verkorkstes Event Handling
- überflüssige Typendeklarationen

Ich meine was ist das denn hier?

Code: Alles auswählen

Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
Das Vergrößern/Verkleinern der Gadgets funktioniert nicht mehr richtig wenn man #PB_Event_MoveWindow entfernt :freak:

Ist auch kein Wunder da du überhaupt nicht zwischen Fenster- und Gadgetereignissen unterscheidest. Ernsthaft, den Code solltest du noch mal gründlich überarbeiten.
dllfreak2001 hat geschrieben:Aber mit deinem "InvalidateRect_(hwnd,0,1)" funzt das schon ganz gut, Problem gelöst.
Das flackert dann ja noch mehr als vorher ...

Ich hoffe das Programm ist ausschließlich für den Eigengebrauch :mrgreen:

Verfasst: 11.05.2009 17:36
von Kaeru Gaman
Fluid Byte hat geschrieben:Ich meine was ist das denn hier?

Code: Alles auswählen

Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
etwas was du nicht mitbekommen hast? 8)
ein Maximieren ist zuerst ein Move, dann ein Size.
ohne das Move in diesem Case wird nicht korrekt auf das Maximieren als Size reagiert.
... wurde erst vor kurzer Zeit besprochen ...

Verfasst: 11.05.2009 18:09
von dllfreak2001
Fluid Byte hat geschrieben:
dllfreak2001 hat geschrieben:Der ist doch keine Katastrophe nur nicht dokumentiert.
:lol:

- Indention nach Lust und Laune
- die meisten Variablen klein geschrieben
- kaum Leerzeichen bei Operatoren
- kein EnableExplicit
- keine Konstanten Prefixe
- verkorkstes Event Handling
- überflüssige Typendeklarationen

Ich meine was ist das denn hier?

Code: Alles auswählen

Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
Das Vergrößern/Verkleinern der Gadgets funktioniert nicht mehr richtig wenn man #PB_Event_MoveWindow entfernt :freak:

Ist auch kein Wunder da du überhaupt nicht zwischen Fenster- und Gadgetereignissen unterscheidest. Ernsthaft, den Code solltest du noch mal gründlich überarbeiten.
dllfreak2001 hat geschrieben:Aber mit deinem "InvalidateRect_(hwnd,0,1)" funzt das schon ganz gut, Problem gelöst.
Das flackert dann ja noch mehr als vorher ...

Ich hoffe das Programm ist ausschließlich für den Eigengebrauch :mrgreen:
Deine Hilfe in allen Ehren aber jetzt spinnst du ein bißchen!

Kearu hat dein Negativbeispiel erklärt und hinter meiner Variablenkennzeichnung, Operatorenschreibweise und dem Eventhandling steckt schon ein Sinn.
Ich schachtel eben gerne.

Nur das flackern stört mich nicht, wenn das Panel aber nach einem Geflacker erstmal nicht angezeigt wird dagegen schon.

Verfasst: 11.05.2009 18:22
von Fluid Byte
Kaeru Gaman hat geschrieben:

Code: Alles auswählen

Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
etwas was du nicht mitbekommen hast? 8)
ein Maximieren ist zuerst ein Move, dann ein Size.
ohne das Move in diesem Case wird nicht korrekt auf das Maximieren als Size reagiert.
... wurde erst vor kurzer Zeit besprochen ...
Äpfel und Birnen? Es ist völlig bedeutungslos ob du minimierst/maximierst/onanierst. Was hat das hier:

Code: Alles auswählen

ResizeGadget(#EditorVScroll,edw-19,0,18,edh-20)
ResizeGadget(#EditorHScroll,0, edh-19, edw-20, 18)
bei dem hier:

Code: Alles auswählen

Case #PB_Event_SizeWindow
zu suchen? Das sind Events des Splitters. :!:
Kearu hat es erklärt und hinter meiner Variablenkennzeichnung, Operatorenschreibweise und dem Eventhandling steckt schon ein Sinn.
Ja ne', nur das er dazu überhaupt nichts gesagt hat ... <)

Um beim Thema zu bleiben:

Die "InvalidateRect_(hwnd,0,1)"-Variante ist mit Abstand die beschissenste Route die du gehen kannst. Sollte es ausschließlich für den Eigenbedarf sein ist das in Ordnung. Wenn nicht kann es nicht schaden sich mal ein bisschen tiefer in die Materie einzuarbeiten.

Verfasst: 11.05.2009 18:32
von dllfreak2001

Code: Alles auswählen

ResizeGadget(#EditorVScroll,edw-19,0,18,edh-20) 
ResizeGadget(#EditorHScroll,0, edh-19, edw-20, 18)
Tja, das passt meine Scrollbars im ContainerGadget in der Größe an.
Ich wüsste nicht wo ich es sonst hinstecken sollte als im Case der die Größenänderung des Fesnters abfängt.

Kearu hat ein Wort zu deinem obigen Beispiel verloren, ich hab mir dieses Konstrukt so auch nicht ausgedacht.
Lustiger Weise fängt es auch die Veränderungen der Splitter ab, somit brauche ich das nicht als Gadget extra betrachten