Seite 1 von 1

#PB_Event_Repaint

Verfasst: 07.08.2012 09:50
von Josh
Hallo Leute,

entweder sehe ich da was falsch, oder beim #PB_Event_Repaint Ereignis läuft gewaltig was falsch. Nachfolgend gehe ich immer davon aus, dass das Fenster vom Anwender in der Horizontalen um 1 Pixel vergrößert wird. Beim Verkleinern und Änderung in der Vertikalen kann es ein wenig anders aussehen.
  • Bei einem leeren Fenster bekomme ich 2x das Repaint Ereignis, was nach meiner Meinung schon 1x zu viel ist.
  • Füge ich ein Menü dazu, ändert sich nichts.
  • Füge ich eine Toolbar dazu, bekomme ich das Repaint Ereignis schon 5x für jedes Pixel in der Breite.
  • Füge ich dann noch eine Statusbar dazu, dann kommt noch mal ein Repaint Ereignis dazu.
Warum muss ich den Fensterinhalt 6x neu erstellen, wenn 1x genügen sollte. Wenn bei Windows "Fensterinhalt beim Ziehen anzeigen" aktiviert ist, kann es zu einem erheblichen unnötigen Rechenaufwand kommen.

lg
Josh

Code: Alles auswählen

  Procedure WinCallback(hWnd, uMsg, wParam, lParam)

    If uMsg = #WM_PAINT
      Debug "WM_PAINT"
    EndIf

    ProcedureReturn #PB_ProcessPureBasicEvents
  EndProcedure


  OpenWindow(0, 0, 0, 500, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)

  SetWindowCallback(@WinCallback())
  
  CreateMenu(0, WindowID(0))
  MenuTitle("Datei")
  MenuItem( 1, "Neu")
  MenuItem( 1, "Neu")
  MenuItem( 1, "Neu")

  CreateToolBar (0, WindowID(0))
  ToolBarStandardButton (0, #PB_ToolBarIcon_New)
  ToolBarStandardButton (1, #PB_ToolBarIcon_Open)
  ToolBarStandardButton (2, #PB_ToolBarIcon_Save)

  CreateStatusBar (0, WindowID(0))
  AddStatusBarField (100)
  AddStatusBarField (100)
  AddStatusBarField (100)

  Repeat
    Event = WaitWindowEvent()

    Select Event
      Case #PB_Event_SizeWindow : Debug "Size Window"
      Case #PB_Event_Repaint    : Debug "Repaint"
    EndSelect

  Until Event = #PB_Event_CloseWindow
Code verwendet unter Win7, PB 4.60

Edit: bei einer Toolbar kommt das Ereignis 5x und nicht wie vorher angegeben 4x

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 11:25
von Bisonte
Aber wie Du siehst, hat PB damit nichts zu tun. Die Meldung kommt von Windows selbst.

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 11:35
von Josh
Bisonte hat geschrieben:Aber wie Du siehst, hat PB damit nichts zu tun. Die Meldung kommt von Windows selbst.
Warum bekomme ich dann auf ein WM_PAINT Ereignis sechs #PB_Event_Repaint Ereignisse?

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 11:51
von Bisonte
Das wiederum ist PB ...

Aber es wurde schon öfter beobachtet, dass seit Version 4.60 öfter ein Repaint genutzt oder erzeugt wird.
Da war was von dige, glaub ich, der als erstes schrieb das Gadgets flackern wegen zu häufigem Repaint.

Woran es liegt, oder warum es sein muss ? Keine Ahnung.

Edit:

Aber in deinem Fall vielleicht normal ?

1. Repaint für das Fenster, 2. für Toolbar, 3. für Statusbar, 4. für das menu ?

wäre jetzt meine Vermutung... aber wenn Du das #WM_PAINT in einem Callback abfragst, warum dann noch in der PB Event Loop ?

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 12:20
von NicTheQuick
Ich nehme an der Callback war nur zu Demonstration und in Wirklichkeit will er ihn gar nicht benutzen.

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 12:45
von Josh
NicTheQuick hat geschrieben:Ich nehme an der Callback war nur zu Demonstration und in Wirklichkeit will er ihn gar nicht benutzen.
bingo

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 13:12
von STARGÅTE
Das #PB_Event_Repaint so oft kommt, liegt wirklich daran, dass zB beim vergrößern ja mehrere Sachen auf dem Fenster ebenfalls verändert werden. Das diese "gleichzeitig" verändert werden, kann PB ja nicht wissen.

Wichtig für dich ist nur, was willst du erreichen?
Das #PB_Event_Repaint ist wirklcih nur dafür gedacht, um mit StartDrawing(WindowOutput(0)) den kompletten Fensterinhalt zu bearbeiten, also sogar über die StatusBar und ToolBar.
Wenn du diese StartDrawing stattdessen bei #PB_Event_SizeWindow anwendest, wird die ToolBar und die StatusBar den Inhalt selbst wieder "zerstören" -> #PB_Event_Repaint

Re: #PB_Event_Repaint

Verfasst: 07.08.2012 13:44
von Josh
STARGÅTE hat geschrieben:Das #PB_Event_Repaint so oft kommt, liegt wirklich daran, dass zB beim vergrößern ja mehrere Sachen auf dem Fenster ebenfalls verändert werden. Das diese "gleichzeitig" verändert werden, kann PB ja nicht wissen.
Warum sollte PB das nicht wissen, Toolbar und Statusbar werden ja immerhin von PB in der Größe angepasst. Die Toolbar alleine bringt mir 3 zusätzliche und unnötige Repaint Ereignisse.

Naja, werd mir was anderes einfallen lassen. So ist das Repaint Ereingnis für mich uninteressant.