Window oder Gadget neu zeichenen lassen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Window oder Gadget neu zeichenen lassen

Beitrag 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.
Zuletzt geändert von dllfreak2001 am 11.05.2009 12:59, insgesamt 1-mal geändert.
I´a dllfreak2001
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Du geben Code. Ansonsten #WS_CLIPCHILDREN helfen kann.

PS: InvalidateRect_(hwnd,0,1)
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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


I´a dllfreak2001
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
I´a dllfreak2001
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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:
Windows 10 Pro, 64-Bit / Outtakes | Derek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 ...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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.
Zuletzt geändert von dllfreak2001 am 11.05.2009 18:22, insgesamt 1-mal geändert.
I´a dllfreak2001
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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
Zuletzt geändert von dllfreak2001 am 11.05.2009 18:35, insgesamt 2-mal geändert.
I´a dllfreak2001
Antworten