Window oder Gadget neu zeichenen lassen
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Window oder Gadget neu zeichenen lassen
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.
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Du geben Code. Ansonsten #WS_CLIPCHILDREN helfen kann.
PS: InvalidateRect_(hwnd,0,1)
PS: InvalidateRect_(hwnd,0,1)
Windows 10 Pro, 64-Bit / Outtakes | Derek
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Also erst mal, der Code is' ne' Katastrophe 
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.
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
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
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.
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
dllfreak2001 hat geschrieben:Der ist doch keine Katastrophe nur nicht dokumentiert.
- 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_MoveWindowIst auch kein Wunder da du überhaupt nicht zwischen Fenster- und Gadgetereignissen unterscheidest. Ernsthaft, den Code solltest du noch mal gründlich überarbeiten.
Das flackert dann ja noch mehr als vorher ...dllfreak2001 hat geschrieben:Aber mit deinem "InvalidateRect_(hwnd,0,1)" funzt das schon ganz gut, Problem gelöst.
Ich hoffe das Programm ist ausschließlich für den Eigengebrauch
Windows 10 Pro, 64-Bit / Outtakes | Derek
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
etwas was du nicht mitbekommen hast?Fluid Byte hat geschrieben:Ich meine was ist das denn hier?
Code: Alles auswählen
Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
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.
Der Weise weiß, dass er ein Narr ist.
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Deine Hilfe in allen Ehren aber jetzt spinnst du ein bißchen!Fluid Byte hat geschrieben:dllfreak2001 hat geschrieben:Der ist doch keine Katastrophe nur nicht dokumentiert.
- 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?
Das Vergrößern/Verkleinern der Gadgets funktioniert nicht mehr richtig wenn man #PB_Event_MoveWindow entferntCode: Alles auswählen
Case #PB_Event_SizeWindow, #PB_Event_MoveWindow![]()
Ist auch kein Wunder da du überhaupt nicht zwischen Fenster- und Gadgetereignissen unterscheidest. Ernsthaft, den Code solltest du noch mal gründlich überarbeiten.
Das flackert dann ja noch mehr als vorher ...dllfreak2001 hat geschrieben:Aber mit deinem "InvalidateRect_(hwnd,0,1)" funzt das schon ganz gut, Problem gelöst.
Ich hoffe das Programm ist ausschließlich für den Eigengebrauch
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Äpfel und Birnen? Es ist völlig bedeutungslos ob du minimierst/maximierst/onanierst. Was hat das hier:Kaeru Gaman hat geschrieben:etwas was du nicht mitbekommen hast?Code: Alles auswählen
Case #PB_Event_SizeWindow, #PB_Event_MoveWindow
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 ...
Code: Alles auswählen
ResizeGadget(#EditorVScroll,edw-19,0,18,edh-20)
ResizeGadget(#EditorHScroll,0, edh-19, edw-20, 18)Code: Alles auswählen
Case #PB_Event_SizeWindowJa ne', nur das er dazu überhaupt nichts gesagt hat ...Kearu hat es erklärt und hinter meiner Variablenkennzeichnung, Operatorenschreibweise und dem Eventhandling steckt schon ein Sinn.
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
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Code: Alles auswählen
ResizeGadget(#EditorVScroll,edw-19,0,18,edh-20)
ResizeGadget(#EditorHScroll,0, edh-19, edw-20, 18)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