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

Code: Alles auswählen

InvalidateRect_(hWnd, 0, 1)
?

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!!