@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