Seite 1 von 1
wenn man Fenster außerhalb der Bildschirmränder bewegt...
Verfasst: 08.09.2014 18:15
von es_91
... sie werden in der Regel neugezeichnet. Kann man das verhindern?
Wenn man zuvor mittels WindowOutput() auf das Fenster gezeichnet hat, geht diese Zeichnung in der Regel verloren, d.h. der Standart-Fensterhintergrund wird darüber gezeichnet. Wie geht ihr bei so Etwas vor? Neuzeichnen mittels Abfrage von #PB_Window_Repaint?
Ich habe einige Gadgets über meiner Zeichnung positioniert. Zeichne ich das Fenster neu, muss ich diese Gadgets neu anzeigen lassen, ich mache das mit HideGadget() und einmal #True, einmal #False. Dabei wird aber wieder ein neuer #PB_Event_Repaint ausgelöst. Das führt zu einer Endlosschleife...
Wie kann man dieses Problem lösen?
Schöne Grüße!
es_91.
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 08.09.2014 19:04
von ts-soft
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 08.09.2014 19:11
von es_91
Iiiiiiii...API
Scherz. Aber nur mal angenommen, ich würde das auf meinem Linux-System kompilieren wollen, hast Du da auch nen Tipp für?
Danke, einstweilen.
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 08.09.2014 19:18
von es_91
Sorry für den Doppelpost, ich hatte ts-soft's Methode noch nicht ausprobiert. Bei mir ist das Problem, dass scheinbar auch das InvalidateRect_() ein Neuzeichnen (#PB_Event_Repaint) auslöst, also ist es keine Lösung. Das Fenster flackert bei mir. Was könnte ich tun?
Meine Repaint-Routine:
Code: Alles auswählen
Procedure Repainter()
Protected y
StartDrawing(WindowOutput(0))
For y = 1 To WindowHeight(0)
Line(0, y - 1, WindowWidth(0) - 1, 1, RGB(255 - y, 255 - y, 255 - y))
Next
StopDrawing()
InvalidateRect_(GadgetID(SGQSPop), 0, 1)
InvalidateRect_(GadgetID(BNQSPop00), 0, 1)
InvalidateRect_(GadgetID(BNQSPop01), 0, 1)
InvalidateRect_(GadgetID(BNQSPop02), 0, 1)
InvalidateRect_(GadgetID(BNQSPop03), 0, 1)
InvalidateRect_(GadgetID(BNQSPop05), 0, 1)
InvalidateRect_(GadgetID(BNQSPop06), 0, 1)
InvalidateRect_(GadgetID(BNQSPop07), 0, 1)
InvalidateRect_(GadgetID(BNQSPop08), 0, 1)
InvalidateRect_(GadgetID(BNQSPop10), 0, 1)
InvalidateRect_(GadgetID(BNQSPop11), 0, 1)
InvalidateRect_(GadgetID(BNQSPop12), 0, 1)
InvalidateRect_(GadgetID(LVQSPop01), 0, 1)
EndProcedure
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 08.09.2014 20:07
von _JON_
Vielleicht hilft es das redraw abzuschlaten und später wieder einzuschalten
SendMessage_(WindowID(0), #WM_SETREDRAW, 0, 0)
SendMessage_(WindowID(0), #WM_SETREDRAW, 1, 0)
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 08.09.2014 20:18
von Danilo
WindowOutput() sollte man eigentlich nie brauchen. Besser ein Bild nehmen und dieses
als Hintergrund des Fensters setzen. Beispiele dazu gibt es im Forum einige, muss man
aber immer mit API machen. PB unterstützt leider noch keine Hintergrundbilder für Window
und ContainerGadget/ScrollAreaGadget etc.
Mit WindowOutput() müsste man wahrscheinlich noch Window-Flags wie #WS_CLIPCHILDREN
und evtl. #WS_CLIPSIBLINGS nehmen, so dass die Gadgets nicht überzeichnet werden.
Code: Alles auswählen
Procedure SetWinBackgroundImage_(Window, Image)
Protected brush, oldBrush
brush = CreatePatternBrush_(ImageID(Image))
If brush
oldBrush = SetClassLongPtr_(WindowID(Window),#GCL_HBRBACKGROUND,brush)
If oldBrush
DeleteObject_(oldBrush)
EndIf
InvalidateRect_(WindowID(Window),0,1)
RedrawWindow_(WindowID(Window),0,0,#RDW_UPDATENOW)
EndIf
EndProcedure
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Verfasst: 09.09.2014 15:12
von es_91
Danke!!