... 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.
wenn man Fenster außerhalb der Bildschirmränder bewegt...
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
Code: Alles auswählen
InvalidateRect_(hWnd, 0, 1)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
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.
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..
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:
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..
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)
SendMessage_(WindowID(0), #WM_SETREDRAW, 0, 0)
SendMessage_(WindowID(0), #WM_SETREDRAW, 1, 0)
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..
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.
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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck