wenn man Fenster außerhalb der Bildschirmränder bewegt...

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

wenn man Fenster außerhalb der Bildschirmränder bewegt...

Beitrag 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.
Benutzeravatar
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..

Beitrag von ts-soft »

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.
Bild
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..

Beitrag 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.
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..

Beitrag 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
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..

Beitrag 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)
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..

Beitrag 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
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
es_91
Beiträge: 383
Registriert: 25.01.2011 04:48

Re: wenn man Fenster außerhalb der Bildschirmränder bewegt..

Beitrag von es_91 »

Danke!!
Antworten