2 * Date and time picker control
4 * Copyright 1998, 1999 Eric Kohl
5 * Copyright 1999, 2000 Alex Priem <alexp@sci.kun.nl>
10 * - All notifications.
18 #include "debugtools.h"
23 DEFAULT_DEBUG_CHANNEL(datetime)
26 #define DATETIME_GetInfoPtr(hwnd) ((DATETIME_INFO *)GetWindowLongA (hwnd, 0))
28 static BOOL DATETIME_SendSimpleNotify (HWND hwnd, UINT code);
29 static BOOL DATETIME_SendDateTimeChangeNotify (HWND hwnd);
30 extern void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to);
31 static const char * const days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
32 "Thursday", "Friday", "Saturday", NULL};
33 static const char *allowedformatchars = {"dhHmMstyX'"};
34 static const int maxrepetition [] = {4,2,2,2,4,2,2,3,-1,-1};
38 DATETIME_GetSystemTime (HWND hwnd, WPARAM wParam, LPARAM lParam )
40 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
41 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
42 SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *) lParam;
44 if (!lParam) return GDT_NONE;
46 if ((dwStyle & DTS_SHOWNONE) &&
47 (SendMessageA (infoPtr->hwndCheckbut, BM_GETCHECK, 0, 0)))
50 MONTHCAL_CopyTime (&infoPtr->date, lprgSysTimeArray);
57 DATETIME_SetSystemTime (HWND hwnd, WPARAM wParam, LPARAM lParam )
59 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
60 SYSTEMTIME *lprgSysTimeArray=(SYSTEMTIME *) lParam;
62 if (!lParam) return 0;
64 if (lParam==GDT_VALID)
65 MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
66 if (lParam==GDT_NONE) {
67 infoPtr->dateValid=FALSE;
68 SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 0, 0);
75 DATETIME_GetMonthCalColor (HWND hwnd, WPARAM wParam)
77 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
79 return SendMessageA (infoPtr->hMonthCal, MCM_GETCOLOR, wParam, 0);
83 DATETIME_SetMonthCalColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
85 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
87 return SendMessageA (infoPtr->hMonthCal, MCM_SETCOLOR, wParam, lParam);
91 /* FIXME: need to get way to force font into monthcal structure */
94 DATETIME_GetMonthCal (HWND hwnd)
96 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
98 return infoPtr->hMonthCal;
103 /* FIXME: need to get way to force font into monthcal structure */
106 DATETIME_GetMonthCalFont (HWND hwnd)
113 DATETIME_SetMonthCalFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
122 Split up a formattxt in actions.
123 See ms documentation for the meaning of the letter codes/'specifiers'.
126 *'dddddd' is handled as 'dddd' plus 'dd'.
127 *unrecognized formats are strings (here given the type DT_STRING;
128 start of the string is encoded in lower bits of DT_STRING.
129 Therefore, 'string' ends finally up as '<show seconds>tring'.
136 DATETIME_UseFormat (DATETIME_INFO *infoPtr, const char *formattxt)
139 int *nrFields=& infoPtr->nrFields;
141 TRACE ("%s\n",formattxt);
145 infoPtr->fieldspec[*nrFields]=0;
146 len=strlen(allowedformatchars);
149 for (i=0; i<strlen (formattxt); i++) {
150 TRACE ("\n%d %c:",i, formattxt[i]);
151 for (j=0; j<len; j++) {
152 if (allowedformatchars[j]==formattxt[i]) {
153 TRACE ("%c[%d,%x]",allowedformatchars[j], *nrFields,
154 infoPtr->fieldspec[*nrFields]);
155 if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) {
156 infoPtr->fieldspec[*nrFields]=(j<<4) +1;
159 if (infoPtr->fieldspec[*nrFields]>>4!=j) {
161 infoPtr->fieldspec[*nrFields]=(j<<4) +1;
164 if ((infoPtr->fieldspec[*nrFields] & 0x0f)==maxrepetition[j]) {
166 infoPtr->fieldspec[*nrFields]=(j<<4) +1;
169 infoPtr->fieldspec[*nrFields]++;
171 } /* if allowedformatchar */
175 /* char is not a specifier: handle char like a string */
177 if ((*nrFields==0) && (infoPtr->fieldspec[*nrFields]==0)) {
178 infoPtr->fieldspec[*nrFields]=DT_STRING+k;
179 infoPtr->buflen[*nrFields]=0;
181 if ((infoPtr->fieldspec[*nrFields] & DT_STRING)!=DT_STRING) {
183 infoPtr->fieldspec[*nrFields]=DT_STRING+k;
184 infoPtr->buflen[*nrFields]=0;
186 infoPtr->textbuf[k]=formattxt[i];
188 infoPtr->buflen[*nrFields]++;
191 if (*nrFields==infoPtr->nrFieldsAllocated) {
192 FIXME ("out of memory; should reallocate. crash ahead.\n");
197 if (infoPtr->fieldspec[*nrFields]!=0) (*nrFields)++;
201 DATETIME_SetFormat (HWND hwnd, WPARAM wParam, LPARAM lParam)
204 DATETIME_INFO *infoPtr= DATETIME_GetInfoPtr (hwnd);
207 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
209 if (dwStyle & DTS_SHORTDATEFORMAT)
210 DATETIME_UseFormat (infoPtr, "M/d/yy");
211 if (dwStyle & DTS_LONGDATEFORMAT)
212 DATETIME_UseFormat (infoPtr, "dddd, MMMM dd, yyy");
213 if (dwStyle & DTS_TIMEFORMAT)
214 DATETIME_UseFormat (infoPtr, "h:mm:ss tt");
217 DATETIME_UseFormat (infoPtr, (char *) lParam);
219 return infoPtr->nrFields;
223 DATETIME_SetFormatW (HWND hwnd, WPARAM wParam, LPARAM lParam)
229 int len = lstrlenW ((LPWSTR) lParam)+1;
231 buf = (LPSTR) COMCTL32_Alloc (len);
232 lstrcpyWtoA (buf, (LPWSTR) lParam);
233 retval=DATETIME_SetFormat (hwnd, 0, (LPARAM) buf);
238 return DATETIME_SetFormat (hwnd, 0, 0);
243 DATETIME_ReturnTxt (DATETIME_INFO *infoPtr, int count, char *result)
245 SYSTEMTIME date = infoPtr->date;
249 TRACE ("%d,%d\n", infoPtr->nrFields, count);
250 if ((count>infoPtr->nrFields) || (count<0)) {
251 WARN ("buffer overrun, have %d want %d\n", infoPtr->nrFields, count);
255 if (!infoPtr->fieldspec) return;
257 spec=infoPtr->fieldspec[count];
258 if (spec & DT_STRING) {
259 int txtlen=infoPtr->buflen[count];
261 strncpy (result, infoPtr->textbuf + (spec &~ DT_STRING), txtlen);
263 TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
273 sprintf (result,"%d",date.wDay);
276 sprintf (result,"%.2d",date.wDay);
279 sprintf (result,"%.3s",days[date.wDayOfWeek]);
282 strcpy (result,days[date.wDayOfWeek]);
286 sprintf (result,"%d",date.wHour-12);
288 sprintf (result,"%d",date.wHour);
292 sprintf (result,"%.2d",date.wHour-12);
294 sprintf (result,"%.2d",date.wHour);
297 sprintf (result,"%d",date.wHour);
300 sprintf (result,"%.2d",date.wHour);
303 sprintf (result,"%d",date.wSecond);
306 sprintf (result,"%.2d",date.wSecond);
309 sprintf (result,"%d",date.wMinute);
312 sprintf (result,"%.2d",date.wMinute);
315 sprintf (result,"%d",date.wMonth);
318 sprintf (result,"%.2d",date.wMonth);
321 sprintf (result,"%.3s",monthtxt[date.wMonth-1]);
324 strcpy (result,monthtxt[date.wMonth-1]);
334 strcpy (result,"AM");
336 strcpy (result,"PM");
339 FIXME ("Not implemented\n");
340 strcpy (result,"xxx");
343 sprintf (result,"%d",date.wYear-10* (int) floor(date.wYear/10));
346 sprintf (result,"%.2d",date.wYear-100* (int) floor(date.wYear/100));
349 sprintf (result,"%d",date.wYear);
353 TRACE ("arg%d=%x->[%s]\n",count,infoPtr->fieldspec[count],result);
357 DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number)
359 SYSTEMTIME *date = &infoPtr->date;
362 TRACE ("%d\n",number);
363 if ((number>infoPtr->nrFields) || (number<0)) return;
365 spec=infoPtr->fieldspec[number];
366 if ((spec & DTHT_DATEFIELD)==0) return;
375 if (date->wDay>mdays[date->wMonth-1]) date->wDay=1;
382 if (date->wHour>23) date->wHour=0;
387 if (date->wSecond>59) date->wSecond=0;
392 if (date->wMinute>59) date->wMinute=0;
399 if (date->wMonth>12) date->wMonth=1;
400 if (date->wDay>mdays[date->wMonth-1])
401 date->wDay=mdays[date->wMonth-1];
406 if (date->wHour>23) date->wHour-=24;
409 FIXME ("Not implemented\n");
421 DATETIME_DecreaseField (DATETIME_INFO *infoPtr, int number)
423 SYSTEMTIME *date = & infoPtr->date;
426 TRACE ("%d\n",number);
427 if ((number>infoPtr->nrFields) || (number<0)) return;
429 spec=infoPtr->fieldspec[number];
430 if ((spec & DTHT_DATEFIELD)==0) return;
440 if (date->wDay<1) date->wDay=mdays[date->wMonth-1];
473 if (date->wDay>mdays[date->wMonth-1])
474 date->wDay=mdays[date->wMonth-1];
484 FIXME ("Not implemented\n");
497 DATETIME_ResetFieldDown (DATETIME_INFO *infoPtr, int number)
499 SYSTEMTIME *date = &infoPtr->date;
502 TRACE ("%d\n",number);
503 if ((number>infoPtr->nrFields) || (number<0)) return;
505 spec=infoPtr->fieldspec[number];
506 if ((spec & DTHT_DATEFIELD)==0) return;
538 FIXME ("Not implemented\n");
546 date->wDay=14; /* overactive ms-programmers..*/
555 DATETIME_ResetFieldUp (DATETIME_INFO *infoPtr, int number)
557 SYSTEMTIME *date = & infoPtr->date;
560 if ((number>infoPtr->nrFields) || (number<0)) return;
562 spec=infoPtr->fieldspec[number];
563 if ((spec & DTHT_DATEFIELD)==0) return;
570 date->wDay=mdays[date->wMonth-1];
594 FIXME ("Not implemented\n");
599 date->wYear=9999; /* Y10K problem? naaah. */
606 static void DATETIME_Refresh (HWND hwnd, HDC hdc)
609 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
612 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
613 RECT *rect = &infoPtr->rect;
614 RECT *calbutton= &infoPtr->calbutton;
615 RECT *checkbox= &infoPtr->checkbox;
619 COLORREF oldBk, oldTextColor;
623 if (infoPtr->dateValid) {
626 oldFont = SelectObject (hdc, infoPtr->hFont);
628 GetClientRect (hwnd, rect);
629 hbr = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
630 FillRect(hdc, rect, hbr);
634 DATETIME_ReturnTxt (infoPtr, 0, txt);
635 GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
636 rect->bottom=size.cy+2;
640 checkbox->top = rect->top;
641 checkbox->bottom= rect->bottom;
643 if (dwStyle & DTS_SHOWNONE) checkbox->right=18;
645 prevright=checkbox->right;
646 for (i=0; i<infoPtr->nrFields; i++) {
647 DATETIME_ReturnTxt (infoPtr, i, txt);
648 GetTextExtentPoint32A (hdc, txt, strlen (txt), &size);
649 field = & infoPtr->fieldRect[i];
650 field->left = prevright;
651 field->right = prevright+size.cx;
652 field->top = rect->top;
653 field->bottom= rect->bottom;
654 prevright=field->right;
656 if ((infoPtr->haveFocus) && (i==infoPtr->select)) {
657 hbr=CreateSolidBrush (GetSysColor (COLOR_ACTIVECAPTION));
658 FillRect(hdc, field, hbr);
659 oldBk=SetBkColor (hdc, GetSysColor(COLOR_ACTIVECAPTION));
660 oldTextColor=SetTextColor (hdc, GetSysColor(COLOR_WINDOW));
662 DrawTextA ( hdc, txt, strlen(txt), field,
663 DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
664 SetBkColor (hdc, oldBk);
665 SetTextColor (hdc, oldTextColor);
668 DrawTextA ( hdc, txt, strlen(txt), field,
669 DT_RIGHT | DT_VCENTER | DT_SINGLELINE );
672 SelectObject (hdc, oldFont);
675 if (!(dwStyle & DTS_UPDOWN)) {
677 calbutton->right = rect->right;
678 calbutton->left = rect->right-15;
679 calbutton->top = rect->top;
680 calbutton->bottom= rect->bottom;
682 DrawFrameControl(hdc, calbutton, DFC_SCROLL,
683 DFCS_SCROLLDOWN | (prssed ? DFCS_PUSHED : 0) |
684 (dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );
690 DATETIME_HitTest (HWND hwnd, DATETIME_INFO *infoPtr, POINT pt)
694 TRACE ("%ld, %ld\n",pt.x,pt.y);
697 if (PtInRect (&infoPtr->calbutton, pt)) {retval=DTHT_MCPOPUP; goto done; }
698 if (PtInRect (&infoPtr->checkbox, pt)) {retval=DTHT_CHECKBOX; goto done; }
700 for (i=0; i<infoPtr->nrFields; i++) {
701 if (PtInRect (&infoPtr->fieldRect[i], pt)) {
708 TRACE ("%x\n",retval);
713 DATETIME_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
715 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
722 pt.x=(INT)LOWORD(lParam);
723 pt.y=(INT)HIWORD(lParam);
725 new=DATETIME_HitTest (hwnd, infoPtr, pt);
727 if ((new & DT_STRING)==0) infoPtr->select=new;
729 if (infoPtr->select!=old) {
734 DATETIME_Refresh (hwnd,hdc);
735 infoPtr->haveFocus=DTHT_GOTFOCUS;
737 ReleaseDC (hwnd, hdc);
740 if (infoPtr->select==DTHT_MCPOPUP) {
744 pt.y=infoPtr->rect.bottom+5;
745 ClientToScreen (hwnd, &pt);
746 infoPtr->hMonthCal=CreateWindowExA (0,"SysMonthCal32", 0,
747 WS_POPUP | WS_BORDER,
752 TRACE ("dt:%x mc:%x mc parent:%x, desktop:%x, mcpp:%x\n",
753 hwnd,infoPtr->hMonthCal,
754 GetParent (infoPtr->hMonthCal),
756 GetParent (GetParent (infoPtr->hMonthCal)));
759 DATETIME_SendSimpleNotify (hwnd, DTN_DROPDOWN);
768 DATETIME_Paint (HWND hwnd, WPARAM wParam)
773 hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam;
774 DATETIME_Refresh (hwnd, hdc);
776 EndPaint (hwnd, &ps);
781 DATETIME_ParentNotify (HWND hwnd, WPARAM wParam, LPARAM lParam)
783 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
784 LPNMHDR lpnmh=(LPNMHDR) lParam;
786 TRACE ("%x,%lx\n",wParam, lParam);
787 TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
788 TRACE ("info: %x %x %x\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
793 DATETIME_Notify (HWND hwnd, WPARAM wParam, LPARAM lParam)
796 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
797 LPNMHDR lpnmh=(LPNMHDR) lParam;
799 TRACE ("%x,%lx\n",wParam, lParam);
800 TRACE ("Got notification %x from %x\n", lpnmh->code, lpnmh->hwndFrom);
801 TRACE ("info: %x %x %x\n",hwnd,infoPtr->hMonthCal,infoPtr->hUpdown);
808 DATETIME_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
810 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
814 TRACE("%x %lx %x\n",wParam, lParam, infoPtr->select);
816 FieldNum=infoPtr->select & DTHT_DATEFIELD;
818 if (!(infoPtr->haveFocus)) return 0;
819 if ((FieldNum==0) && (infoPtr->select)) return 0;
821 if (infoPtr->select & FORMATCALLMASK) {
822 FIXME ("Callbacks not implemented yet\n");
828 DATETIME_IncreaseField (infoPtr,FieldNum);
829 DATETIME_SendDateTimeChangeNotify (hwnd);
833 DATETIME_DecreaseField (infoPtr,FieldNum);
834 DATETIME_SendDateTimeChangeNotify (hwnd);
837 DATETIME_ResetFieldDown (infoPtr,FieldNum);
838 DATETIME_SendDateTimeChangeNotify (hwnd);
841 DATETIME_ResetFieldUp(infoPtr,FieldNum);
842 DATETIME_SendDateTimeChangeNotify (hwnd);
846 if (infoPtr->select==0) {
847 infoPtr->select=infoPtr->nrFields-1;
852 while ((infoPtr->fieldspec[infoPtr->select] & DT_STRING) && (wrap<2));
857 if (infoPtr->select==infoPtr->nrFields) {
862 while ((infoPtr->fieldspec[infoPtr->select] & DT_STRING) && (wrap<2));
867 DATETIME_Refresh (hwnd, hdc);
868 ReleaseDC (hwnd, hdc);
875 DATETIME_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
877 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
882 if (infoPtr->haveFocus) {
883 DATETIME_SendSimpleNotify (hwnd, NM_KILLFOCUS);
884 infoPtr->haveFocus = 0;
887 DATETIME_Refresh (hwnd, hdc);
888 ReleaseDC (hwnd, hdc);
889 InvalidateRect (hwnd, NULL, TRUE);
896 DATETIME_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
898 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
903 if (infoPtr->haveFocus==0) {
904 DATETIME_SendSimpleNotify (hwnd, NM_SETFOCUS);
905 infoPtr->haveFocus=DTHT_GOTFOCUS;
908 DATETIME_Refresh (hwnd, hdc);
909 ReleaseDC (hwnd, hdc);
916 DATETIME_SendDateTimeChangeNotify (HWND hwnd)
919 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
920 NMDATETIMECHANGE dtdtc;
923 dtdtc.nmhdr.hwndFrom = hwnd;
924 dtdtc.nmhdr.idFrom = GetWindowLongA( hwnd, GWL_ID);
925 dtdtc.nmhdr.code = DTN_DATETIMECHANGE;
927 if ((GetWindowLongA (hwnd, GWL_STYLE) & DTS_SHOWNONE))
928 dtdtc.dwFlags = GDT_NONE;
930 dtdtc.dwFlags = GDT_VALID;
932 MONTHCAL_CopyTime (&infoPtr->date, &dtdtc.st);
933 return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
934 (WPARAM)dtdtc.nmhdr.idFrom, (LPARAM)&dtdtc);
939 DATETIME_SendSimpleNotify (HWND hwnd, UINT code)
944 nmhdr.hwndFrom = hwnd;
945 nmhdr.idFrom = GetWindowLongA( hwnd, GWL_ID);
948 return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
949 (WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
958 DATETIME_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
960 DATETIME_INFO *infoPtr;
961 DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
963 /* allocate memory for info structure */
964 infoPtr = (DATETIME_INFO *)COMCTL32_Alloc (sizeof(DATETIME_INFO));
965 if (infoPtr == NULL) {
966 ERR("could not allocate info memory!\n");
970 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
972 if (dwStyle & DTS_SHOWNONE) {
973 infoPtr->hwndCheckbut=CreateWindowExA (0,"button", 0,
974 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
977 0, GetWindowLongA (hwnd, GWL_HINSTANCE), 0);
978 SendMessageA (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0);
981 if (dwStyle & DTS_UPDOWN) {
983 infoPtr->hUpdown=CreateUpDownControl (
984 WS_CHILD | WS_BORDER | WS_VISIBLE,
987 UD_MAXVAL, UD_MINVAL, 0);
990 infoPtr->fieldspec=(int *) COMCTL32_Alloc (32*sizeof(int));
991 infoPtr->fieldRect=(RECT *) COMCTL32_Alloc (32*sizeof(RECT));
992 infoPtr->buflen=(int *) COMCTL32_Alloc (32*sizeof(int));
993 infoPtr->nrFieldsAllocated=32;
995 DATETIME_SetFormat (hwnd, 0, 0);
997 /* initialize info structure */
998 infoPtr->hMonthCal=0;
999 GetSystemTime (&infoPtr->date);
1000 infoPtr->dateValid = TRUE;
1001 infoPtr->hFont = GetStockObject(DEFAULT_GUI_FONT);
1007 DATETIME_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
1009 DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr (hwnd);
1011 COMCTL32_Free (infoPtr);
1019 static LRESULT WINAPI
1020 DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1026 case DTM_GETSYSTEMTIME:
1027 DATETIME_GetSystemTime (hwnd, wParam, lParam);
1029 case DTM_SETSYSTEMTIME:
1030 DATETIME_SetSystemTime (hwnd, wParam, lParam);
1033 FIXME("Unimplemented msg DTM_GETRANGE\n");
1037 FIXME("Unimplemented msg DTM_SETRANGE\n");
1040 case DTM_SETFORMATA:
1041 return DATETIME_SetFormat (hwnd, wParam, lParam);
1043 case DTM_SETFORMATW:
1044 return DATETIME_SetFormatW (hwnd, wParam, lParam);
1046 case DTM_SETMCCOLOR:
1047 return DATETIME_SetMonthCalColor (hwnd, wParam, lParam);
1049 case DTM_GETMCCOLOR:
1050 return DATETIME_GetMonthCalColor (hwnd, wParam);
1052 case DTM_GETMONTHCAL:
1053 return DATETIME_GetMonthCal (hwnd);
1056 return DATETIME_SetMonthCalFont (hwnd, wParam, lParam);
1059 return DATETIME_GetMonthCalFont (hwnd);
1061 case WM_PARENTNOTIFY:
1062 return DATETIME_ParentNotify (hwnd, wParam, lParam);
1065 return DATETIME_Notify (hwnd, wParam, lParam);
1068 return DLGC_WANTARROWS | DLGC_WANTCHARS;
1071 return DATETIME_Paint (hwnd, wParam);
1074 return DATETIME_KeyDown (hwnd, wParam, lParam);
1077 return DATETIME_KillFocus (hwnd, wParam, lParam);
1080 return DATETIME_SetFocus (hwnd, wParam, lParam);
1082 case WM_LBUTTONDOWN:
1083 return DATETIME_LButtonDown (hwnd, wParam, lParam);
1086 return DATETIME_Create (hwnd, wParam, lParam);
1089 return DATETIME_Destroy (hwnd, wParam, lParam);
1092 if (uMsg >= WM_USER)
1093 ERR("unknown msg %04x wp=%08x lp=%08lx\n",
1094 uMsg, wParam, lParam);
1095 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
1102 DATETIME_Register (void)
1106 if (GlobalFindAtomA (DATETIMEPICK_CLASSA)) return;
1108 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
1109 wndClass.style = CS_GLOBALCLASS;
1110 wndClass.lpfnWndProc = (WNDPROC)DATETIME_WindowProc;
1111 wndClass.cbClsExtra = 0;
1112 wndClass.cbWndExtra = sizeof(DATETIME_INFO *);
1113 wndClass.hCursor = LoadCursorA (0, IDC_ARROWA);
1114 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
1115 wndClass.lpszClassName = DATETIMEPICK_CLASSA;
1117 RegisterClassA (&wndClass);
1122 DATETIME_Unregister (void)
1124 if (GlobalFindAtomA (DATETIMEPICK_CLASSA))
1125 UnregisterClassA (DATETIMEPICK_CLASSA, (HINSTANCE)NULL);