I've found the bug in the old WinBlitz3D where it doesnt response when i close the window. It works now!!!
It seems that the bug was in WaitEvent(), because i played a little around with it and now it works. Code here, and i've added a useful command PeekEvent():
Function WaitEvent(events=1)
apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)
ret_event=0
.again
PokeInt WinProcReturn,$04,0
apiGetMessage(WinProcReturn,0,0,0)
apiTranslateMessage(WinProcReturn)
apiDispatchMessage(WinProcReturn)
eventsource_RAW = 0
eventdata_RAW = 0
eventX_RAW = 0
eventY_RAW = 0
this_event = PeekInt(WinProcReturn,$04)
Select this_event
Case WM_RBUTTONUP
ret_event = $202
;
If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
If Gadget_BankDATA > 0 Then
If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
EndIf
EndIf
EndIf
Case WM_KILLFOCUS
apiGetMessage(WinProcReturn,0,0,0)
apiTranslateMessage(WinProcReturn)
apiDispatchMessage(WinProcReturn)
ret_event = $401
eventsource_RAW = apiGetFocus()
Case WM_HSCROLL
ret_event = $401
eventsource_RAW = PeekInt(WinProcReturn,$0C)
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL)
;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
Case WM_VSCROLL
ret_event = $401
eventsource_RAW = PeekInt(WinProcReturn,$0C)
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL)
;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
Case WM_ACTIVATE
If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
ret_event = $804
eventsource_RAW = PeekInt(WinProcReturn,$00)
EndIf
Case WM_ACTIVATEAPP
eventName$ = "WM_ACTIVATEAPP"
Case WM_NOTIFY
If a = 1 Then
; PokeByte b,0,$CC
EndIf
a = a + 1
nmhdr_addr = PeekInt(WinProcReturn,$0C)
apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
;Notify PeekInt(NMHDR,$04)
Select PeekInt(NMHDR,$08)
Case NM_CLICK,TCN_SELCHANGE ; tabber
ret_event = $401
eventsource_RAW = PeekInt(NMHDR,$00)
eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
Default
; ret_event = $401
; eventsource_RAW = PeekInt(NMHDR,$00)
End Select
;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
Case WM_COMMAND
; check menu selected or gadget event
eventsource_RAW = PeekInt(WinProcReturn,$0C)
If eventsource_RAW = 0 Then
If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
If eventdata_RAW > 0 Then
ret_event = $1001
EndIf
EndIf
Else
ret_event = $401
EndIf
;Notify HIWORD(PeekInt(WinProcReturn,$08))
Case WM_SIZE
ret_event = $802
eventsource_RAW = PeekInt(WinProcReturn,$00)
EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
; reposition status bars.
If apiIsWindow(eventsource_RAW) <> 0 Then
GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
If GAD_ID > 0 Then
statusbar = PeekInt(GAD_ID,4)
If statusbar > 0 Then
;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
;apiInvalidateRect statusbar,0,True
;apiSendMessage statusbar,WM_SIZE,0,0
EndIf
EndIf
EndIf
Case WM_MOVE
ret_event = $801
eventsource_RAW = PeekInt(WinProcReturn,$00)
EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
Case WM_CLOSE
DebugLog "WM_CLOSE"
Case WM_DESTROY
DebugLog "WM_DESTROY"
ret_event = $803
eventsource_RAW = PeekInt(WinProcReturn,$00)
End Select
; cleanup events
PokeInt(WinProcReturn,$00,0)
PokeInt(WinProcReturn,$04,0)
PokeInt(WinProcReturn,$08,0)
PokeInt(WinProcReturn,$0C,0)
If ret_event=0 Then Goto again
apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
Return ret_event
End Function
Function PeekEvent(events=1)
apiSetWindowLong runtimewindow,GWL_WNDPROC,GRAB_BankAddr(WinProcBank)
ret_event=0
apiPeekMessage(WinProcReturn,0,0,0,0)
apiTranslateMessage(WinProcReturn)
apiDispatchMessage(WinProcReturn)
eventsource_RAW = 0
eventdata_RAW = 0
eventX_RAW = 0
eventY_RAW = 0
this_event = PeekInt(WinProcReturn,$04)
Select this_event
Case WM_RBUTTONUP
ret_event = $202
;
If apiIsWindow(PeekInt(WinProcReturn,0)) <> 0 Then
Gadget_BankDATA = apiGetWindowLong(PeekInt(WinProcReturn,0),GWL_USERDATA)
If Gadget_BankDATA > 0 Then
If PeekInt(Gadget_BankDATA,$00) = PeekInt(WinProcReturn,0)
;PopUpGadgetMenu(PeekInt(Gadget_BankDATA,$00))
EndIf
EndIf
EndIf
Case WM_KILLFOCUS
apiGetMessage(WinProcReturn,0,0,0)
apiTranslateMessage(WinProcReturn)
apiDispatchMessage(WinProcReturn)
ret_event = $401
eventsource_RAW = apiGetFocus()
Case WM_HSCROLL
ret_event = $401
eventsource_RAW = PeekInt(WinProcReturn,$0C)
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
;WM_HSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL)
;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_HSCROLL_pos,True)
Case WM_VSCROLL
ret_event = $401
eventsource_RAW = PeekInt(WinProcReturn,$0C)
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
;WM_VSCROLL_pos = 1 + apiGetScrollPos(eventsource_RAW,SB_CTL)
;eventdata_RAW = apiSetScrollPos(eventsource_RAW,SB_CTL,WM_VSCROLL_pos,True)
Case WM_ACTIVATE
If LOWORD(PeekInt(WinProcReturn,$08)) = WA_CLICKACTIVE Then
ret_event = $804
eventsource_RAW = PeekInt(WinProcReturn,$00)
EndIf
Case WM_ACTIVATEAPP
eventName$ = "WM_ACTIVATEAPP"
Case WM_NOTIFY
If a = 1 Then
; PokeByte b,0,$CC
EndIf
a = a + 1
nmhdr_addr = PeekInt(WinProcReturn,$0C)
apiCallWindowProcF b,0,0,GRAB_BankAddr(NMHDR),nmhdr_addr
;Notify PeekInt(NMHDR,$04)
Select PeekInt(NMHDR,$08)
Case NM_CLICK,TCN_SELCHANGE ; tabber
ret_event = $401
eventsource_RAW = PeekInt(NMHDR,$00)
eventdata_RAW = apiSendMessage(eventsource_RAW,TCM_GETCURSEL,0,0)
Default
; ret_event = $401
; eventsource_RAW = PeekInt(NMHDR,$00)
End Select
;Notify "here "+PeekInt(NMHDR,$00)+" "+toolbar
Case WM_COMMAND
; check menu selected or gadget event
eventsource_RAW = PeekInt(WinProcReturn,$0C)
If eventsource_RAW = 0 Then
If HIWORD(PeekInt(WinProcReturn,$08)) = 0 Then
eventdata_RAW = LOWORD(PeekInt(WinProcReturn,$08))
If eventdata_RAW > 0 Then
ret_event = $1001
EndIf
EndIf
Else
ret_event = $401
EndIf
;Notify HIWORD(PeekInt(WinProcReturn,$08))
Case WM_SIZE
ret_event = $802
eventsource_RAW = PeekInt(WinProcReturn,$00)
EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
; reposition status bars.
If apiIsWindow(eventsource_RAW) <> 0 Then
GAD_ID = apiGetWindowLong(eventsource_RAW,GWL_USERDATA)
If GAD_ID > 0 Then
statusbar = PeekInt(GAD_ID,4)
If statusbar > 0 Then
;SetGadgetShape statusbar,0,0,GadgetWidth(eventsource_RAW),GadgetHeight(statusbar)
;apiInvalidateRect statusbar,0,True
;apiSendMessage statusbar,WM_SIZE,0,0
EndIf
EndIf
EndIf
Case WM_MOVE
ret_event = $801
eventsource_RAW = PeekInt(WinProcReturn,$00)
EventX_RAW = LOWORD(PeekInt(WinProcReturn,$0C))
EventY_RAW = HIWORD(PeekInt(WinProcReturn,$0C))
Case WM_CLOSE
DebugLog "WM_CLOSE"
Case WM_DESTROY
DebugLog "WM_DESTROY"
ret_event = $803
eventsource_RAW = PeekInt(WinProcReturn,$00)
End Select
; cleanup events
PokeInt(WinProcReturn,$00,0)
PokeInt(WinProcReturn,$04,0)
PokeInt(WinProcReturn,$08,0)
PokeInt(WinProcReturn,$0C,0)
;If ret_event=0 Then Goto again -- THIS IS PEEKEVENT SO JUST CONTINUE WITHOUT ANY EVENT!
apiSetWindowLong runtimewindow,GWL_WNDPROC,WinProcBlitz3D
Return ret_event
End Function