@Kaeru Gaman
Kaeru Gaman hat geschrieben:@nco2k
btw:
wolfs artikel hättest du dort kritisieren können, wo es hingehört: in der lounge selber.
ich finde das nicht sehr gelungen, das hier zu machen.
sry aber ich melde mich nicht deswegen extra dort an. wenn ich bereits dort mitglied gewesen wär, hätte ichs dort auch gemacht, empfand es jedoch nicht als sonderlich schlimm, es einfach mal hier zu posten, immerhin wurde die frage auch hier gestellt.
@AND51
AND51 hat geschrieben:
Soll das heißen, Callbacks sind nur dazu da, damit ich mein eigenes Programm manipulieren kann und bestimmen kann, welche Events durch WindowEvent() abgefragt werden können?
nein, es gibt viele möglichkeiten. du kannst u.a. auch bestimmte vorkehrungen treffen, bevor das benötigte event verarbeitet wird. kleines beispiel: jedesmal bevor das vollbild screen minimiert wird sollen alle sprites mittels einer schleife gefreet werden und jedesmal bevor das screen wieder restored wird, sollen alle sprites wieder neu eingelesen werden. ich weiss pb macht dies im regelfall automatisch, ist auch jetzt einfach nur als beispiel hergeholt.
allerdings sollte man sich ganz genau überlegen welche befehle man innerhalb eines callbacks verwendet und "manuell" abarbeitet, da befehle, welche weitere msgs ausgeben, nette endlosschleifen verursachen können:
ACHTUNG: benützung auf eigene gefahr
Code: Alles auswählen
Procedure WndProc(hWnd, uMsg, wParam, lParam)
If hWnd = WindowID(0) And uMsg = #WM_SIZE
Select wParam
Case #SIZE_MINIMIZED
ShowWindow_(hWnd, #SW_RESTORE)
Case #SIZE_RESTORED
ShowWindow_(hWnd, #SW_MINIMIZE)
EndSelect
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
SetWindowCallback(@WndProc())
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf
wenn du in dem beispiel z.b. den minimieren button des fensters clickst, wird die #SIZE_MINIMIZED msg verarbeitet
nachdem das fenster minimiert wurde und das fenster wieder restored, was jedoch die #SIZE_RESTORED hervorruft und in dieser wird dann das fenster wieder minimiert, was wiederrum eine #SIZE_MINIMIZED msg ausgibt was somit zu einer endlosschleife führt. ProcedureReturn #False funktioniert hier natürlich nicht.
du kannst auch einfach den minimieren und den maximieren knopf frech vertauschen, dafür ist ja das ProcedureReturn #False da:
Code: Alles auswählen
Procedure WndProc(hWnd, uMsg, wParam, lParam)
If hWnd = WindowID(0) And uMsg = #WM_SYSCOMMAND
Select (wParam & $FFF0)
Case #SC_MINIMIZE
ShowWindow_(hWnd, #SW_MAXIMIZE)
ProcedureReturn #False
Case #SC_MAXIMIZE
ShowWindow_(hWnd, #SW_MINIMIZE)
ProcedureReturn #False
EndSelect
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
SetWindowCallback(@WndProc())
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf
callbacks sind für viele sachen nützlich, die möglichkeiten sind praktisch endlos, pauschalisieren kann man es nicht und jeder muss sich überlegen für was er die callbacks benützt bzw. ob überhaupt ein callback notwendig ist für das eigene vorhaben, genauso wie mit threads. solche sachen sind mit äusserster vorsicht zu genießen.
@ts-soft
ts-soft hat geschrieben:
>> - ist der timer genau genug, um die routine alle 20 oder sogar nur 10 ms aufzurufen?
Ohne besondere Maßnahmen ist unter NT-Systemen eine Genauigkeit von
10ms, unter Win9x von 56ms
hab es jetzt nicht ausprobiert, aber wirkt sich timeBeginPeriod/timeEndPeriod_() auch auf SetTimer aus? wenn ja dann wars das mit der ungenauigkeit.
c ya,
nco2k