Seite 1 von 2

Kein #PB_Event_Repaint Ebent während Fensterbewegung?

Verfasst: 28.05.2006 16:44
von Kurzer
Hallöchen,

Vorwarnung: Mein erstes Projekt in PureBasic ;-)

Ich reagiere im Eventloop meines Programmfensters auf den Event #PB_Event_Repaint.

Aber die Repaint-Message kommt während eines Verschiebens des Fensters erst, wenn man die Maustaste wieder losgelassen hat.
Wenn ich das Fenster also zur Hälfte aus dem Desktop schiebe und wieder zurück, dann ist die Hälfte des Fensterinhalts zerstört. Erst wenn ich die Maus loslasse wird der Inhalt neugezeichnet [Procedure Test()]

Ist das normal oder kann ich irgendwie die Message vorher schon bekommen? Also genau dann, wenn der Inhalt des Fensters tatsächlich zerstört wird - während des verschiebens.

Hier mal ein (ausgedünnter) Auschnitt des Loops:

Code: Alles auswählen

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  Select Event 
    Case #PB_Event_Menu
      ;[blah...]   
    Case #PB_Event_Gadget
      ;[blubb...]   
    Case #PB_Event_Repaint
      Test() ; Test ist meine Repaint-Procedure
  EndSelect
  
Until Event = #PB_Event_CloseWindow Or MenuID = #QUITGAME; End of the event loop
Gruß Markus

Verfasst: 28.05.2006 17:25
von edel
Du kannst WM_PAINT abfangen und darauf reagieren.

Code: Alles auswählen

  Procedure Callback(hWnd,msg,wParam,lParam)
    
    If msg = #WM_PAINT
      Debug "RePaint"
      ;hdc = beginpaint_(hwnd,ps.paintstruct)
      ;endpaint_(hwnd,ps)
      ;ProcedureReturn 0
    endif 
    
    ProcedureReturn #PB_ProcessPureBasicEvents
    
  EndProcedure
  
  OpenWindow(0,#PB_Ignore,#PB_Ignore,640,480,"")
  SetWindowCallback(@Callback())  
    
  Repeat : Until WaitWindowEvent() = #WM_CLOSE

Verfasst: 28.05.2006 20:00
von ts-soft
Beim Fenster bewegen brauch man doch kein Paint-Ereignis, nur beim
Resizen. Ich glaube nicht das #wm_paint beim bewegen ausgelöst wird, nur #wm_move

Verfasst: 28.05.2006 21:38
von edel
wm_paint wird immer dann aufgerufen wenn es gebraucht wird .
Wenn man beim bewegen das Fenster verdeckt (aus dem desktop schieben z.b.)
kommt ein wm_paint um das Fenster wiederherzustellen. , Pb_repaint erst dann wenn man die Maus losslaesst.

Verfasst: 28.05.2006 23:27
von Kurzer
Danke für Eure Anregungen - besonders hallodri.

Das ganze soll ein Kartenspiel werden, das in in einem normalen Windows-Fenster dargestellt wird - allerdings mit grafischen Elementen (die Karten).

Aber mittlerweile denke ich, daß es besser ist die Karten etc. mittels Sprite auf einem WindowedScreen darzustellen - da brauche ich mir dann um das RePaint auch keine Gedanken zu machen.

AUsschlaggebend für den Wechsel zu Sprites war auch, daß ich meine Karten (Imgages bzw. jetzt Sprites) um 90 Grad und 45 Grad drehen muß. Da habe ich es mit Sprites natürlich einfacher.

Was mir aber jetzt im ZUsammenhang mit dem WindowedScreen spanisch vorkommt sind noch folgende Dinge:

1) Öffne ich ein Window und darin ein WindowedScreen, dann ist die Mausgeschwindigkeit innerhalb dieses Fensters langsamer als in allen anderen Fenstern oder auf dem Desktop.
Ich vermute, daß liegt irgendwie daran, daß innerhalb des WindowedScreens DirextX im Spiel ist. Aber kann man das ändern oder den Mousespeed irgendwie erhöhen? Ist nämlich ziemlich nervig.
Vorab: Nein, ich habe keinerlei Mousebefehle benutzt... nur WindewedScreen geöffnet und schon is die Mouse langsam.

2) Es gibt für OpenWindowedScreen die beiden Parameter RightOffset und BottomOffset. Wenn ich das richtig verstanden habe, sollen die Platz schaffen für die Stausleiste oder ähnliches, aber ich sehe keinen Unterschied, wenn ich da einen Offset angebe oder nicht.

Der Screen ist bei OpenWindowedScreen(WindowID(0), 0, 0, 700, 560, 0, 0, 0) genauso groß wie bei...
OpenWindowedScreen(WindowID(0), 0, 0, 700, 560, 0, 50, 50) und auch die Statusleiste wird im letzten Fall genauso übergebügelt wie im ersten.

Welchen Effekt sollten diese Parameter haben?

3) Wie kann ich die aktuelle Hintergrundfarbe eines frisch geöffneten Windows ermitteln?
Eigentlich kann die Farbe ja mit GetWindowColor() ermittelt werden, aber direkt nach dem Öffnen gibt der Befehl nur -1 zurück. Man muß erst SetWindowColor() benutzt haben, damit eine Farbe ermittelt werden kann.

Das Fenster hat aber auch so schon eine Hintergrundfarbe (grau). Wie kann ich ermitteln, welche RGB Werte das sind? DIe linke obere Ecke des Fensters mit Point() auslesen wäre ziemlich "wired". :) Scheint mir aber irgendwie nicht anders zu gehen, oder?

Gruß Markus

Verfasst: 28.05.2006 23:53
von edel
Der Offset klappt bestens wenn du auf auto stellst , oder den Offset von der Breite oder Hoehe abziehst.

Die Farbe bekommst du z.b. mit :

GetSysColor_(#COLOR_BTNFACE)

Der Rest ist nur spielerei , mir ist langweilig :D

Code: Alles auswählen

  InitSprite()
  InitSprite3d()
  
  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,640,280,"",#WS_SIZEBOX|#WS_SYSMENU)
  
  CreateStatusBar(0,*hWindow\l)
  
  OpenWindowedScreen(*hWindow\l,0,0,640,WindowHeight(*hWindow),1,0,StatusBarHeight(0))
  
  color = GetSysColor_(#COLOR_BTNFACE)
  
  CreateSprite(0,70,70,#PB_Sprite_Texture)
  
  StartDrawing(SpriteOutput(0))
  box(0,0,70,70,$000001) 
  box(1,1,68,68,$408080) 
  StopDrawing()
  
  CreateSprite3D(0,0)
  x.f + 0
  Repeat
    uMsg = WaitWindowEvent(3)  
    ClearScreen(color) 
    
    Start3D()
    
    For i = 1 to 3
      DisplaySprite3D(0,i*100,30)       
    next 
    
    RotateSprite3D(0,x,1)
    
    Stop3D()
    
    x + 0.01
    
    FlipBuffers() 
  Until uMsg = #WM_CLOSE

Verfasst: 29.05.2006 11:38
von Kurzer
Danke für Dein Beispiel.

Farbe ermitteln: Alles klar, funktioniert klasse. Ist GetSysColor_ kein PB Befehl? Ich finde ihn nicht in der Hilfe.

Offset: Okay, wenn er nur bei aktiviertem "Auto" funktioniert, dann erklärt das natürlich das Verhalten. :)

Mousespeed: Auch in Deinem Beispiel ist es so, daß die -wie ich jetzt festgestellt habe- Mausbeschleunigung meines Logitech Maustreibers komplett ausgeschaltet wird, sobald ein WindowedScreen benutzt wird. Das passiert also auch bei Deinem Beispielcode.

Gibt es da Abhilfe?

Gruß Markus[/i]

Verfasst: 29.05.2006 11:47
von edel
Alle Befehle mit einem Unterstrich sind API Befehle und auf MDSN
zu finden.


Zu deinem Mausproblem kann ich nur sagen , kauf dir ne MS-Maus :D

Ich habe keine Probleme mit der Maus, kann daher auch das Problem
nicht nachvollziehen, vielleicht hilft es neue Treiber zu installieren, oder
such mal hier im Forum , eventuell hatte schon einmal Jemand das gleiche
Problem.

Verfasst: 29.05.2006 13:08
von Kurzer
Ich nochmal. ;)

Manchmal wirft ein Beispielprogramm zur Erklärung eines Problems doch noch mehr Fragen auf.

Du hast geschrieben

Code: Alles auswählen

  *hWindow.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,640,280,"",#WS_SIZEBOX|#WS_SYSMENU)
 
  CreateStatusBar(0,*hWindow\l)
 
  OpenWindowedScreen(*hWindow\l,0,0,640,WindowHeight(*hWindow),1,0,StatusBarHeight(0))
Mit dem *hWindow.Long habe ich so meine Probleme.
Was ist das jetzt? Ein Zeiger auf eine Struktur?

In der PB Hilfe steht (sinngemäß auch für OpenWindow geltend):

Meistens geben die Funktionen, die solche Objekte erstellen, auch dieses Handle als Ergebnis zurück, wenn das Objekt erfolgreich erstellt wurde. Dies ist nur dann der Fall, wenn #PB_Any beim Erstellen des Objekts nicht verwendet wurde. Wenn #PB_Any verwendet wird, dann geben diese Befehle die von PB zugewiesenen Objekt-Nummern zurück, und nicht das Handle.


Da Du #PB_Any verwendet hast, scheint der Befehl ja die Window-Nummer zurückzugeben.
Demzufolge müsste *hWindow.long ja ein Zeiger auf diese Window-Nummer sein.
Der Befehl "CreateStatusBar()" erwartet lt. Hilfe eine WindowID, also ein Handle.

Du hast folgendes benutzt:

Code: Alles auswählen

CreateStatusBar(0,*hWindow\l)
Tja und da hakts bei mir aus. Ist die Schreibweise * [Window-Nummer] \ leine Art, um zu dem zugehörigen
Handle zu kommen? Das wirft bei nem Anfänger ziemlich Fragen auf. :)

Auch die von Dir benutzen "Tricks(?)", wie

Code: Alles auswählen

x.f + 0 und x + 0.01
Ich vermute mal, es sind Äquivalente zu

Code: Alles auswählen

x.f = 0 und x = x + 0.01
Kannst Du diese Unsicherheiten evtl. noch ausräumen, damit ich heute Nacht gut schlafen kann? ;)

Danke

Markus

[EDIT]: Das Problem mit dem Mousespeed hat sich erledigt. In den Mouseeigenschaften (Logitech) war die Option "[x] Mausbeschleunigung in Spielen deaktivieren" eingeschaltet. :freak: Hatte also nix mit PB zu tun.

Verfasst: 29.05.2006 20:59
von edel
#PB_ANY gibt einen Zeiger auf eine Struktur zurueck. So spar ich mir alle
gadgetid() oder windowid() spriteid() usw ...

*win = pbid
*win\l = handle

So sah das wohl in 3.94 aus .

Code: Alles auswählen

  
  Structure PB_WindowStructure
    Window.l         
    NbAccelerators.l 
    *Accelerators.ACCEL[]  
    AcceleratorTable.l     
  EndStructure
Diese Liste ist zwar alt und das meiste geht auch nicht mehr unter 4.0 aber hilfreich ist es alle mal :
http://hometown.aol.de/moebiusstefan/Pu ... riptor.txt


Bei dem anderen biste ja sebst schon draufgekommen ;-)