@RSBasic / Edel:
Erstmal vielen Dank für Deinen Input, das bringt mich auf jeden Fall weiter.
Noch eine Frage: Was muss/darf der Callback zurückgeben, wenn das PureBasic Event explizit nicht verarbeitet werden soll? Bei meinem Test habe ich den Fall, dass das DateGadget im gültigen Datumsbereich (1970 - 2038) selbst auch noch einen Event feuert und man so im Eventloop einen doppelten Event bekommt.
Möglicherweise bekomme ich damit auch die umständliche Unterdrückung der doppelten Ausgabe des Datums im Callback geregelt (dLastDateGadgetDate und dLastCalendarGadgetDate). Da das aber nur Testausgaben sind, ist das später eh irrelevant.
Code: Alles auswählen
EnableExplicit
#MCN_SELCHANGE = #MCN_FIRST + 1
;#MCN_SELECT = #MCN_FIRST + 4
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Static.d dLastCalendarGadgetDate, dLastDateGadgetDate
Protected *NMHDR.NMHDR
Protected SYSTEMTIME.SYSTEMTIME
If uMsg = #WM_NOTIFY
*NMHDR = lParam
If GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Calendar And *NMHDR\code = #MCN_SELCHANGE
SendMessage_(GadgetID(*NMHDR\idFrom), #MCM_GETCURSEL, 0, SYSTEMTIME)
If dLastCalendarGadgetDate <> PeekQ(@SYSTEMTIME)
PostEvent(#PB_Event_Gadget, GetParent_(*NMHDR\hwndFrom), *NMHDR\idFrom, #PB_EventType_Change)
dLastCalendarGadgetDate = PeekQ(@SYSTEMTIME)
Debug Str(SYSTEMTIME\wDay) + "." + Str(SYSTEMTIME\wMonth) + "." + Str(SYSTEMTIME\wYear)
EndIf
ElseIf GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Date And *NMHDR\code = #DTN_DATETIMECHANGE
SendMessage_(GadgetID(*NMHDR\idFrom), #DTM_GETSYSTEMTIME, 0, SYSTEMTIME)
If dLastDateGadgetDate <> PeekQ(@SYSTEMTIME)
PostEvent(#PB_Event_Gadget, GetParent_(*NMHDR\hwndFrom), *NMHDR\idFrom, #PB_EventType_Change)
dLastDateGadgetDate = PeekQ(@SYSTEMTIME)
Debug Str(SYSTEMTIME\wDay) + "." + Str(SYSTEMTIME\wMonth) + "." + Str(SYSTEMTIME\wYear)
EndIf
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CalendarGadget(1, 10, 10, 200, 200, Date())
DateGadget(2, 220, 10, 250, 20)
SetWindowCallback(@WinCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
If EventType() = #PB_EventType_Change
Debug "Event: " + Str(EventGadget())
EndIf
EndSelect
ForEver
EndIf