#PB_Event_Repaint

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

#PB_Event_Repaint

Beitrag 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
Zuletzt geändert von Josh am 07.08.2012 13:29, insgesamt 1-mal geändert.
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: #PB_Event_Repaint

Beitrag von Bisonte »

Aber wie Du siehst, hat PB damit nichts zu tun. Die Meldung kommt von Windows selbst.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: #PB_Event_Repaint

Beitrag 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?
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: #PB_Event_Repaint

Beitrag 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 ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: #PB_Event_Repaint

Beitrag von NicTheQuick »

Ich nehme an der Callback war nur zu Demonstration und in Wirklichkeit will er ihn gar nicht benutzen.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: #PB_Event_Repaint

Beitrag von Josh »

NicTheQuick hat geschrieben:Ich nehme an der Callback war nur zu Demonstration und in Wirklichkeit will er ihn gar nicht benutzen.
bingo
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: #PB_Event_Repaint

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: #PB_Event_Repaint

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