FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Datum", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Èas", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Datum", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Zeit", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Dato", -1, 4, 2, 126, 133
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 10, 17, 115, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
- WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
- 9, 34, 115, 97
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
+ WS_CHILD | WS_VISIBLE | WS_TABSTOP,
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Klokken",
-1, 132, 2, 113, 133
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Date", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Time", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Dia", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Hora", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Date", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Heure", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Çìåñïìçíßá", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&¿ñá", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0\r
BEGIN\r
GROUPBOX "&Dátum", -1, 4, 2, 122, 125\r
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",\r
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,\r
- 11, 17, 108, 12\r
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",\r
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP\r
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",\r
WS_CHILD | WS_VISIBLE | WS_TABSTOP,\r
- 11, 37, 108, 80\r
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE\r
GROUPBOX "&Idõ", -1, 132, 2, 113, 125\r
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",\r
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,\r
FONT 9, "MS UI Gothic", 0, 0, 0x0
BEGIN
GROUPBOX "\93ú\95t(&D)", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "\8e\9e\8d\8f(&T)", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "Da&tum", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "Tij&d", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Data", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Godzina", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Äàòà", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Âðåìÿ", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
GROUPBOX "&Datum", -1, 4, 2, 122, 125
- CONTROL "", IDC_DATEPICKER, "SysDateTimePick32",
- DTS_SHORTDATEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 17, 108, 12
- CONTROL "", IDC_MONTHCALENDAR, "SysMonthCal32",
+ COMBOBOX IDC_MONTHCB, 11, 17, 50, 120, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ CONTROL "", IDC_MONTHCALENDAR, "MonthCalWnd",
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
- 11, 37, 108, 80
+ 11, 37, 108, 80, WS_EX_CLIENTEDGE
GROUPBOX "&Tid", -1, 132, 2, 113, 125
CONTROL "", IDC_TIMEPICKER, "SysDateTimePick32",
DTS_TIMEFORMAT | WS_CHILD | WS_VISIBLE | WS_TABSTOP,
/* Code based on clock.c from Programming Windows, Charles Petzold */\r
\r
-#include "timedate.h"\r
+#include <timedate.h>\r
\r
#define TWOPI (2 * 3.14159)\r
\r
--- /dev/null
+/*\r
+ * ReactOS Calendar Control\r
+ * Copyright (C) 2006 Thomas Weidenmueller <w3seek@reactos.com>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+ */\r
+#include <timedate.h>\r
+\r
+static const TCHAR szMonthCalWndClass[] = TEXT("MonthCalWnd");\r
+\r
+#define MONTHCAL_HEADERBG COLOR_INACTIVECAPTION\r
+#define MONTHCAL_HEADERFG COLOR_INACTIVECAPTIONTEXT\r
+#define MONTHCAL_CTRLBG COLOR_WINDOW\r
+#define MONTHCAL_CTRLFG COLOR_WINDOWTEXT\r
+#define MONTHCAL_SELBG COLOR_ACTIVECAPTION\r
+#define MONTHCAL_SELFG COLOR_CAPTIONTEXT\r
+\r
+#define ID_DAYTIMER 1\r
+\r
+typedef struct _MONTHCALWND\r
+{\r
+ HWND hSelf;\r
+ HWND hNotify;\r
+ WORD Day;\r
+ WORD Month;\r
+ WORD Year;\r
+ WORD FirstDayOfWeek;\r
+ BYTE Days[6][7];\r
+ TCHAR Week[7];\r
+ SIZE CellSize;\r
+ SIZE ClientSize;\r
+\r
+ HFONT hFont;\r
+ HBRUSH hbHeader;\r
+ HBRUSH hbSelection;\r
+\r
+ BOOL Changed : 1;\r
+ BOOL DayTimerSet : 1;\r
+ BOOL HideFocus : 1;\r
+ BOOL HasFocus : 1;\r
+} MONTHCALWND, *PMONTHCALWND;\r
+\r
+static LRESULT\r
+MonthCalNotifyControlParent(IN PMONTHCALWND infoPtr,\r
+ IN UINT code,\r
+ IN OUT PVOID data)\r
+{\r
+ LRESULT Ret = 0;\r
+ \r
+ if (infoPtr->hNotify != NULL)\r
+ {\r
+ LPNMHDR pnmh = (LPNMHDR)data;\r
+ \r
+ pnmh->hwndFrom = infoPtr->hSelf;\r
+ pnmh->idFrom = GetWindowLongPtr(infoPtr->hSelf,\r
+ GWLP_ID);\r
+ pnmh->code = code;\r
+ \r
+ Ret = SendMessage(infoPtr->hNotify,\r
+ WM_NOTIFY,\r
+ (WPARAM)pnmh->idFrom,\r
+ (LPARAM)pnmh);\r
+ }\r
+ \r
+ return Ret;\r
+}\r
+\r
+static WORD\r
+MonthCalMonthLength(IN WORD Month,\r
+ IN WORD Year)\r
+{\r
+ const BYTE MonthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0};\r
+\r
+ if(Month == 2)\r
+ return MonthDays[Month - 1] + ((Year % 400 == 0) ? 1 : ((Year % 100 != 0) && (Year % 4 == 0)) ? 1 : 0);\r
+ else\r
+ return MonthDays[Month - 1];\r
+}\r
+\r
+static WORD\r
+MonthCalWeekInMonth(IN WORD Day,\r
+ IN WORD DayOfWeek)\r
+{\r
+ return (Day - DayOfWeek + 5) / 7;\r
+}\r
+\r
+static WORD\r
+MonthCalDayOfWeek(IN PMONTHCALWND infoPtr,\r
+ IN WORD Day,\r
+ IN WORD Month,\r
+ IN WORD Year)\r
+{\r
+ const BYTE DayOfWeek[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};\r
+ WORD Ret;\r
+\r
+ Year -= (Month < 3);\r
+ Ret = (Year + (Year / 4) - (Year / 100) + (Year / 400) + DayOfWeek[Month - 1] + Day + 6) % 7;\r
+\r
+ return (7 + Ret - infoPtr->FirstDayOfWeek) % 7;\r
+}\r
+\r
+static WORD\r
+MonthCalFirstDayOfWeek(VOID)\r
+{\r
+ TCHAR szBuf[2] = {0};\r
+ WORD Ret = 0;\r
+\r
+ if (GetLocaleInfo(LOCALE_USER_DEFAULT,\r
+ LOCALE_IFIRSTDAYOFWEEK,\r
+ szBuf,\r
+ sizeof(szBuf) / sizeof(szBuf[0])) != 0)\r
+ {\r
+ Ret = (WORD)(szBuf[0] - TEXT('0'));\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+static BOOL\r
+MonthCalValidDate(IN WORD Day,\r
+ IN WORD Month,\r
+ IN WORD Year)\r
+{\r
+ if (Month < 1 || Month > 12 ||\r
+ Day == 0 || Day > MonthCalMonthLength(Month,\r
+ Year) ||\r
+ Year < 1980 || Year > 2099)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+static VOID\r
+MonthCalUpdate(IN PMONTHCALWND infoPtr)\r
+{\r
+ PBYTE pDay, pDayEnd;\r
+ WORD DayOfWeek, MonthLength, d = 0;\r
+ SIZE NewCellSize;\r
+ BOOL RepaintHeader = FALSE;\r
+\r
+ NewCellSize.cx = infoPtr->ClientSize.cx / 7;\r
+ NewCellSize.cy = infoPtr->ClientSize.cy / 7;\r
+\r
+ if (infoPtr->CellSize.cx != NewCellSize.cx ||\r
+ infoPtr->CellSize.cy != NewCellSize.cy);\r
+ {\r
+ infoPtr->CellSize = NewCellSize;\r
+ RepaintHeader = TRUE;\r
+ }\r
+\r
+ /* update the days layout of the current month */\r
+ ZeroMemory(infoPtr->Days,\r
+ sizeof(infoPtr->Days));\r
+\r
+ DayOfWeek = MonthCalDayOfWeek(infoPtr,\r
+ 1,\r
+ infoPtr->Month,\r
+ infoPtr->Year);\r
+\r
+ MonthLength = MonthCalMonthLength(infoPtr->Month,\r
+ infoPtr->Year);\r
+\r
+ pDay = &infoPtr->Days[0][DayOfWeek];\r
+ pDayEnd = pDay + MonthLength;\r
+ while (pDay != pDayEnd)\r
+ {\r
+ *(pDay++) = ++d;\r
+ }\r
+\r
+ /* repaint the control */\r
+ if (RepaintHeader)\r
+ {\r
+ InvalidateRect(infoPtr->hSelf,\r
+ NULL,\r
+ TRUE);\r
+ }\r
+ else\r
+ {\r
+ RECT rcClient;\r
+\r
+ rcClient.left = 0;\r
+ rcClient.top = infoPtr->CellSize.cy;\r
+ rcClient.right = infoPtr->ClientSize.cx;\r
+ rcClient.bottom = infoPtr->ClientSize.cy - rcClient.top;\r
+\r
+ InvalidateRect(infoPtr->hSelf,\r
+ &rcClient,\r
+ TRUE);\r
+ }\r
+}\r
+\r
+static VOID\r
+MonthCalSetupDayTimer(IN PMONTHCALWND infoPtr)\r
+{\r
+ SYSTEMTIME LocalTime = {0};\r
+ UINT uElapse;\r
+\r
+ /* update the current date */\r
+ GetLocalTime(&LocalTime);\r
+\r
+ /* calculate the number of remaining milliseconds until midnight */\r
+ uElapse = 1000 - (UINT)LocalTime.wMilliseconds;\r
+ uElapse += (59 - (UINT)LocalTime.wSecond) * 1000;\r
+ uElapse += (59 - (UINT)LocalTime.wMinute) * 60 * 1000;\r
+ uElapse += (23 - (UINT)LocalTime.wHour) * 60 * 60 * 1000;\r
+\r
+ if (uElapse < USER_TIMER_MINIMUM || uElapse > USER_TIMER_MAXIMUM)\r
+ uElapse = 1000;\r
+ else\r
+ uElapse += 100; /* Add a delay of 0.1 seconds */\r
+\r
+ /* setup the new timer */\r
+ if (SetTimer(infoPtr->hSelf,\r
+ ID_DAYTIMER,\r
+ uElapse,\r
+ NULL) != 0)\r
+ {\r
+ infoPtr->DayTimerSet = TRUE;\r
+ }\r
+}\r
+\r
+static VOID\r
+MonthCalReload(IN PMONTHCALWND infoPtr)\r
+{\r
+ TCHAR szBuf[64];\r
+ UINT i;\r
+\r
+ /* cache the configuration */\r
+ infoPtr->FirstDayOfWeek = MonthCalFirstDayOfWeek();\r
+\r
+ infoPtr->hbHeader = GetSysColorBrush(MONTHCAL_HEADERBG);\r
+ infoPtr->hbSelection = GetSysColorBrush(MONTHCAL_SELBG);\r
+\r
+ for (i = 0;\r
+ i < 7;\r
+ i++)\r
+ {\r
+ if (GetLocaleInfo(LOCALE_USER_DEFAULT,\r
+ LOCALE_SABBREVDAYNAME1 +\r
+ ((i + infoPtr->FirstDayOfWeek) % 7),\r
+ szBuf,\r
+ sizeof(szBuf) / sizeof(szBuf[0])) != 0)\r
+ {\r
+ infoPtr->Week[i] = szBuf[0];\r
+ }\r
+ }\r
+\r
+ /* update the control */\r
+ MonthCalUpdate(infoPtr);\r
+}\r
+\r
+static BOOL\r
+MonthCalGetDayRect(IN PMONTHCALWND infoPtr,\r
+ IN WORD Day,\r
+ OUT RECT *rcCell)\r
+{\r
+ if (Day >= 1 && Day <= MonthCalMonthLength(infoPtr->Month,\r
+ infoPtr->Year))\r
+ {\r
+ WORD DayOfWeek;\r
+\r
+ DayOfWeek = MonthCalDayOfWeek(infoPtr,\r
+ Day,\r
+ infoPtr->Month,\r
+ infoPtr->Year);\r
+\r
+ rcCell->left = DayOfWeek * infoPtr->CellSize.cx;\r
+ rcCell->top = (MonthCalWeekInMonth(Day,\r
+ DayOfWeek) + 1) * infoPtr->CellSize.cy;\r
+ rcCell->right = rcCell->left + infoPtr->CellSize.cx;\r
+ rcCell->bottom = rcCell->top + infoPtr->CellSize.cy;\r
+\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+static VOID\r
+MonthCalChange(IN PMONTHCALWND infoPtr)\r
+{\r
+ infoPtr->Changed = TRUE;\r
+\r
+ /* kill the day timer */\r
+ if (infoPtr->DayTimerSet)\r
+ {\r
+ KillTimer(infoPtr->hSelf,\r
+ ID_DAYTIMER);\r
+ infoPtr->DayTimerSet = FALSE;\r
+ }\r
+}\r
+\r
+\r
+static BOOL\r
+MonthCalSetDate(IN PMONTHCALWND infoPtr,\r
+ IN WORD Day,\r
+ IN WORD Month,\r
+ IN WORD Year)\r
+{\r
+ NMMCCSELCHANGE sc;\r
+ BOOL Ret = FALSE;\r
+\r
+ sc.OldDay = infoPtr->Day;\r
+ sc.OldMonth = infoPtr->Month;\r
+ sc.OldYear = infoPtr->Year;\r
+ sc.NewDay = Day;\r
+ sc.NewMonth = Month;\r
+ sc.NewYear = Year;\r
+\r
+ /* notify the parent */\r
+ if (!MonthCalNotifyControlParent(infoPtr,\r
+ MCCN_SELCHANGE,\r
+ &sc))\r
+ {\r
+ /* check if we actually need to update */\r
+ if (infoPtr->Month != sc.NewMonth ||\r
+ infoPtr->Year != sc.NewYear)\r
+ {\r
+ infoPtr->Day = sc.NewDay;\r
+ infoPtr->Month = sc.NewMonth;\r
+ infoPtr->Year = sc.NewYear;\r
+\r
+ MonthCalChange(infoPtr);\r
+\r
+ /* repaint the entire control */\r
+ MonthCalUpdate(infoPtr);\r
+\r
+ Ret = TRUE;\r
+ }\r
+ else if (infoPtr->Day != sc.NewDay)\r
+ {\r
+ RECT rcUpdate;\r
+\r
+ infoPtr->Day = sc.NewDay;\r
+\r
+ MonthCalChange(infoPtr);\r
+\r
+ if (MonthCalGetDayRect(infoPtr,\r
+ sc.OldDay,\r
+ &rcUpdate))\r
+ {\r
+ /* repaint the day cells that need to be updated */\r
+ InvalidateRect(infoPtr->hSelf,\r
+ &rcUpdate,\r
+ TRUE);\r
+ if (MonthCalGetDayRect(infoPtr,\r
+ sc.NewDay,\r
+ &rcUpdate))\r
+ {\r
+ InvalidateRect(infoPtr->hSelf,\r
+ &rcUpdate,\r
+ TRUE);\r
+ }\r
+ }\r
+\r
+ Ret = TRUE;\r
+ }\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+static VOID\r
+MonthCalSetLocalTime(IN PMONTHCALWND infoPtr,\r
+ OUT SYSTEMTIME *Time)\r
+{\r
+ NMMCCAUTOUPDATE au;\r
+ SYSTEMTIME LocalTime = {0};\r
+\r
+ GetLocalTime(&LocalTime);\r
+\r
+ au.SystemTime = LocalTime;\r
+ if (!MonthCalNotifyControlParent(infoPtr,\r
+ MCCN_AUTOUPDATE,\r
+ &au))\r
+ {\r
+ if (MonthCalSetDate(infoPtr,\r
+ LocalTime.wDay,\r
+ LocalTime.wMonth,\r
+ LocalTime.wYear))\r
+ {\r
+ infoPtr->Changed = FALSE;\r
+ }\r
+ }\r
+\r
+ /* kill the day timer */\r
+ if (infoPtr->DayTimerSet)\r
+ {\r
+ KillTimer(infoPtr->hSelf,\r
+ ID_DAYTIMER);\r
+ infoPtr->DayTimerSet = FALSE;\r
+ }\r
+\r
+ /* setup the new day timer */\r
+ MonthCalSetupDayTimer(infoPtr);\r
+\r
+ if (Time != NULL)\r
+ {\r
+ *Time = LocalTime;\r
+ }\r
+}\r
+\r
+static VOID\r
+MonthCalRepaintDay(IN PMONTHCALWND infoPtr,\r
+ IN WORD Day)\r
+{\r
+ RECT rcCell;\r
+\r
+ if (MonthCalGetDayRect(infoPtr,\r
+ Day,\r
+ &rcCell))\r
+ {\r
+ InvalidateRect(infoPtr->hSelf,\r
+ &rcCell,\r
+ TRUE);\r
+ }\r
+}\r
+\r
+static VOID\r
+MonthCalPaint(IN PMONTHCALWND infoPtr,\r
+ IN HDC hDC,\r
+ IN LPRECT prcUpdate)\r
+{\r
+ UINT x, y;\r
+ RECT rcCell;\r
+ COLORREF crOldText, crOldCtrlText = CLR_INVALID;\r
+ HFONT hOldFont;\r
+ INT iOldBkMode;\r
+\r
+ iOldBkMode = SetBkMode(hDC,\r
+ TRANSPARENT);\r
+ hOldFont = (HFONT)SelectObject(hDC,\r
+ infoPtr->hFont);\r
+\r
+ for (y = prcUpdate->top / infoPtr->CellSize.cy;\r
+ y <= prcUpdate->bottom / infoPtr->CellSize.cy && y < 7;\r
+ y++)\r
+ {\r
+ rcCell.top = y * infoPtr->CellSize.cy;\r
+ rcCell.bottom = rcCell.top + infoPtr->CellSize.cy;\r
+\r
+ if (y == 0)\r
+ {\r
+ RECT rcHeader;\r
+\r
+ /* paint the header */\r
+ rcHeader.left = prcUpdate->left;\r
+ rcHeader.top = rcCell.top;\r
+ rcHeader.right = prcUpdate->right;\r
+ rcHeader.bottom = rcCell.bottom;\r
+\r
+ FillRect(hDC,\r
+ &rcHeader,\r
+ infoPtr->hbHeader);\r
+\r
+ crOldText = SetTextColor(hDC,\r
+ GetSysColor(MONTHCAL_HEADERFG));\r
+\r
+ for (x = prcUpdate->left / infoPtr->CellSize.cx;\r
+ x <= prcUpdate->right / infoPtr->CellSize.cx && x < 7;\r
+ x++)\r
+ {\r
+ rcCell.left = x * infoPtr->CellSize.cx;\r
+ rcCell.right = rcCell.left + infoPtr->CellSize.cx;\r
+\r
+ /* write the first letter of each weekday */\r
+ DrawText(hDC,\r
+ &infoPtr->Week[x],\r
+ 1,\r
+ &rcCell,\r
+ DT_SINGLELINE | DT_NOPREFIX | DT_CENTER | DT_VCENTER);\r
+ }\r
+\r
+ SetTextColor(hDC,\r
+ crOldText);\r
+ }\r
+ else\r
+ {\r
+ if (crOldCtrlText == CLR_INVALID)\r
+ {\r
+ crOldCtrlText = SetTextColor(hDC,\r
+ MONTHCAL_CTRLFG);\r
+ }\r
+\r
+ for (x = prcUpdate->left / infoPtr->CellSize.cx;\r
+ x <= prcUpdate->right / infoPtr->CellSize.cx && x < 7;\r
+ x++)\r
+ {\r
+ UINT Day = infoPtr->Days[y - 1][x];\r
+\r
+ rcCell.left = x * infoPtr->CellSize.cx;\r
+ rcCell.right = rcCell.left + infoPtr->CellSize.cx;\r
+\r
+ /* write the day number */\r
+ if (Day != 0 && Day < 100)\r
+ {\r
+ TCHAR szDay[3];\r
+ INT szDayLen;\r
+ RECT rcText;\r
+ SIZE TextSize;\r
+\r
+ szDayLen = _stprintf(szDay,\r
+ TEXT("%lu"),\r
+ Day);\r
+\r
+ if (GetTextExtentPoint32(hDC,\r
+ szDay,\r
+ szDayLen,\r
+ &TextSize))\r
+ {\r
+ RECT rcHighlight = {0};\r
+\r
+ rcText.left = rcCell.left + (infoPtr->CellSize.cx / 2) - (TextSize.cx / 2);\r
+ rcText.top = rcCell.top + (infoPtr->CellSize.cy / 2) - (TextSize.cy / 2);\r
+ rcText.right = rcText.left + TextSize.cx;\r
+ rcText.bottom = rcText.top + TextSize.cy;\r
+\r
+ if (Day == infoPtr->Day)\r
+ {\r
+ rcHighlight = rcText;\r
+\r
+ InflateRect(&rcHighlight,\r
+ GetSystemMetrics(SM_CXFOCUSBORDER),\r
+ GetSystemMetrics(SM_CYFOCUSBORDER));\r
+\r
+ if (!FillRect(hDC,\r
+ &rcHighlight,\r
+ infoPtr->hbSelection))\r
+ {\r
+ goto FailNoHighlight;\r
+ }\r
+\r
+ /* highlight the selected day */\r
+ crOldText = SetTextColor(hDC,\r
+ GetSysColor(MONTHCAL_SELFG));\r
+ }\r
+ else\r
+ {\r
+FailNoHighlight:\r
+ /* don't change the text color, we're not highlighting it... */\r
+ crOldText = CLR_INVALID;\r
+ }\r
+\r
+ TextOut(hDC,\r
+ rcText.left,\r
+ rcText.top,\r
+ szDay,\r
+ szDayLen);\r
+\r
+ if (Day == infoPtr->Day && crOldText != CLR_INVALID)\r
+ {\r
+ if (infoPtr->HasFocus && !infoPtr->HideFocus)\r
+ {\r
+ COLORREF crOldBk;\r
+\r
+ crOldBk = SetBkColor(hDC,\r
+ GetSysColor(MONTHCAL_SELBG));\r
+\r
+ DrawFocusRect(hDC,\r
+ &rcHighlight);\r
+\r
+ SetBkColor(hDC,\r
+ crOldBk);\r
+ }\r
+\r
+ SetTextColor(hDC,\r
+ crOldText);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (crOldCtrlText != CLR_INVALID)\r
+ {\r
+ SetTextColor(hDC,\r
+ crOldCtrlText);\r
+ }\r
+\r
+ SetBkMode(hDC,\r
+ iOldBkMode);\r
+ SelectObject(hDC,\r
+ (HGDIOBJ)hOldFont);\r
+}\r
+\r
+static HFONT\r
+MonthCalChangeFont(IN PMONTHCALWND infoPtr,\r
+ IN HFONT hFont,\r
+ IN BOOL Redraw)\r
+{\r
+ HFONT hOldFont = infoPtr->hFont;\r
+ infoPtr->hFont = hFont;\r
+\r
+ if (Redraw)\r
+ {\r
+ InvalidateRect(infoPtr->hSelf,\r
+ NULL,\r
+ TRUE);\r
+ }\r
+\r
+ return hOldFont;\r
+}\r
+\r
+static WORD\r
+MonthCalPtToDay(IN PMONTHCALWND infoPtr,\r
+ IN SHORT x,\r
+ IN SHORT y)\r
+{\r
+ WORD Ret = 0;\r
+\r
+ if (infoPtr->CellSize.cx != 0 && infoPtr->CellSize.cy != 0 &&\r
+ x >= 0 && y >= 0)\r
+ {\r
+ x /= infoPtr->CellSize.cx;\r
+ y /= infoPtr->CellSize.cy;\r
+\r
+ if (x < 7 && y != 0 && y < 7)\r
+ {\r
+ Ret = (WORD)infoPtr->Days[y - 1][x];\r
+ }\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+static LRESULT CALLBACK\r
+MonthCalWndProc(IN HWND hwnd,\r
+ IN UINT uMsg,\r
+ IN WPARAM wParam,\r
+ IN LPARAM lParam)\r
+{\r
+ PMONTHCALWND infoPtr;\r
+ LRESULT Ret = 0;\r
+ \r
+ infoPtr = (PMONTHCALWND)GetWindowLongPtr(hwnd,\r
+ 0);\r
+ \r
+ if (infoPtr == NULL && uMsg != WM_CREATE)\r
+ {\r
+ goto HandleDefaultMessage;\r
+ }\r
+ \r
+ switch (uMsg)\r
+ {\r
+ case WM_PAINT:\r
+ case WM_PRINTCLIENT:\r
+ {\r
+ if (infoPtr->CellSize.cx != 0 && infoPtr->CellSize.cy != 0)\r
+ {\r
+ PAINTSTRUCT ps;\r
+ HDC hDC;\r
+\r
+ if (wParam != 0)\r
+ {\r
+ if (!GetUpdateRect(hwnd,\r
+ &ps.rcPaint,\r
+ TRUE))\r
+ {\r
+ break;\r
+ }\r
+ hDC = (HDC)wParam;\r
+ }\r
+ else\r
+ {\r
+ hDC = BeginPaint(hwnd,\r
+ &ps);\r
+ if (hDC == NULL)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ MonthCalPaint(infoPtr,\r
+ hDC,\r
+ &ps.rcPaint);\r
+\r
+ if (wParam == 0)\r
+ {\r
+ EndPaint(hwnd,\r
+ &ps);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+\r
+ case WM_LBUTTONDBLCLK:\r
+ case WM_LBUTTONDOWN:\r
+ {\r
+ WORD SelDay;\r
+\r
+ SelDay = MonthCalPtToDay(infoPtr,\r
+ GET_X_LPARAM(lParam),\r
+ GET_Y_LPARAM(lParam));\r
+ if (SelDay != 0 && SelDay != infoPtr->Day)\r
+ {\r
+ MonthCalSetDate(infoPtr,\r
+ SelDay,\r
+ infoPtr->Month,\r
+ infoPtr->Year);\r
+ }\r
+\r
+ /* fall through */\r
+ }\r
+\r
+ case WM_MBUTTONDOWN:\r
+ case WM_RBUTTONDOWN:\r
+ {\r
+ if (!infoPtr->HasFocus)\r
+ {\r
+ SetFocus(hwnd);\r
+ }\r
+ break;\r
+ }\r
+\r
+ case WM_KEYDOWN:\r
+ {\r
+ WORD NewDay = 0;\r
+\r
+ switch (wParam)\r
+ {\r
+ case VK_UP:\r
+ {\r
+ if (infoPtr->Day > 7)\r
+ {\r
+ NewDay = infoPtr->Day - 7;\r
+ }\r
+ break;\r
+ }\r
+\r
+ case VK_DOWN:\r
+ {\r
+ if (infoPtr->Day + 7 <= MonthCalMonthLength(infoPtr->Month,\r
+ infoPtr->Year))\r
+ {\r
+ NewDay = infoPtr->Day + 7;\r
+ }\r
+ break;\r
+ }\r
+ case VK_LEFT:\r
+ {\r
+ if (infoPtr->Day > 1)\r
+ {\r
+ NewDay = infoPtr->Day - 1;\r
+ }\r
+ break;\r
+ }\r
+\r
+ case VK_RIGHT:\r
+ {\r
+ if (infoPtr->Day < MonthCalMonthLength(infoPtr->Month,\r
+ infoPtr->Year))\r
+ {\r
+ NewDay = infoPtr->Day + 1;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ /* update the selection */\r
+ if (NewDay != 0)\r
+ {\r
+ MonthCalSetDate(infoPtr,\r
+ NewDay,\r
+ infoPtr->Month,\r
+ infoPtr->Year);\r
+ }\r
+\r
+ goto HandleDefaultMessage;\r
+ }\r
+\r
+ case WM_GETDLGCODE:\r
+ {\r
+ INT virtKey;\r
+ \r
+ virtKey = (lParam != 0 ? (INT)((LPMSG)lParam)->wParam : 0);\r
+ switch (virtKey)\r
+ {\r
+ case VK_TAB:\r
+ {\r
+ /* change the UI status */\r
+ SendMessage(GetAncestor(hwnd,\r
+ GA_ROOT),\r
+ WM_CHANGEUISTATE,\r
+ MAKEWPARAM(UIS_INITIALIZE,\r
+ 0),\r
+ 0);\r
+ break;\r
+ }\r
+ }\r
+\r
+ Ret |= DLGC_WANTARROWS;\r
+ break;\r
+ }\r
+\r
+ case WM_SETFOCUS:\r
+ {\r
+ infoPtr->HasFocus = TRUE;\r
+ MonthCalRepaintDay(infoPtr,\r
+ infoPtr->Day);\r
+ break;\r
+ }\r
+\r
+ case WM_KILLFOCUS:\r
+ {\r
+ infoPtr->HasFocus = FALSE;\r
+ MonthCalRepaintDay(infoPtr,\r
+ infoPtr->Day);\r
+ break;\r
+ }\r
+\r
+ case WM_UPDATEUISTATE:\r
+ {\r
+ BOOL OldHideFocus = infoPtr->HideFocus;\r
+ switch (LOWORD(wParam))\r
+ {\r
+ case UIS_SET:\r
+ if (HIWORD(wParam) & UISF_HIDEFOCUS)\r
+ infoPtr->HideFocus = TRUE;\r
+ break;\r
+\r
+ case UIS_CLEAR:\r
+ if (HIWORD(wParam) & UISF_HIDEFOCUS)\r
+ infoPtr->HideFocus = FALSE;\r
+ break;\r
+ }\r
+\r
+ if (infoPtr->HideFocus != OldHideFocus)\r
+ {\r
+ MonthCalRepaintDay(infoPtr,\r
+ infoPtr->Day);\r
+ }\r
+ break;\r
+ }\r
+\r
+ case MCCM_SETDATE:\r
+ {\r
+ WORD Day, Month, Year, DaysCount;\r
+\r
+ Day = LOWORD(wParam);\r
+ Month = HIWORD(wParam);\r
+ Year = LOWORD(lParam);\r
+\r
+ if (Day == (WORD)-1)\r
+ Day = infoPtr->Day;\r
+ if (Month == (WORD)-1)\r
+ Month = infoPtr->Month;\r
+ if (Year == (WORD)-1)\r
+ Year = infoPtr->Year;\r
+\r
+ DaysCount = MonthCalMonthLength(Month,\r
+ Year);\r
+ if (Day > DaysCount)\r
+ Day = DaysCount;\r
+\r
+ if (MonthCalValidDate(Day,\r
+ Month,\r
+ Year))\r
+ {\r
+ if (Day != infoPtr->Day ||\r
+ Month != infoPtr->Month ||\r
+ Year != infoPtr->Year)\r
+ {\r
+ Ret = MonthCalSetDate(infoPtr,\r
+ Day,\r
+ Month,\r
+ Year);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+\r
+ case MCCM_GETDATE:\r
+ {\r
+ LPSYSTEMTIME lpSystemTime = (LPSYSTEMTIME)wParam;\r
+\r
+ lpSystemTime->wYear = infoPtr->Year;\r
+ lpSystemTime->wMonth = infoPtr->Month;\r
+ lpSystemTime->wDay = infoPtr->Day;\r
+\r
+ Ret = TRUE;\r
+ break;\r
+ }\r
+\r
+ case MCCM_RESET:\r
+ {\r
+ MonthCalSetLocalTime(infoPtr,\r
+ NULL);\r
+ Ret = TRUE;\r
+ break;\r
+ }\r
+\r
+ case MCCM_CHANGED:\r
+ {\r
+ Ret = infoPtr->Changed;\r
+ break;\r
+ }\r
+\r
+ case WM_TIMER:\r
+ {\r
+ switch (wParam)\r
+ {\r
+ case ID_DAYTIMER:\r
+ {\r
+ /* kill the timer */\r
+ KillTimer(hwnd,\r
+ ID_DAYTIMER);\r
+ infoPtr->DayTimerSet = FALSE;\r
+\r
+ if (!infoPtr->Changed)\r
+ {\r
+ /* update the system time and setup the new day timer */\r
+ MonthCalSetLocalTime(infoPtr,\r
+ NULL);\r
+\r
+ /* update the control */\r
+ MonthCalUpdate(infoPtr);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+\r
+ case WM_SETFONT:\r
+ {\r
+ Ret = (LRESULT)MonthCalChangeFont(infoPtr,\r
+ (HFONT)wParam,\r
+ (BOOL)LOWORD(lParam));\r
+ break;\r
+ }\r
+\r
+ case WM_SIZE:\r
+ {\r
+ infoPtr->ClientSize.cx = LOWORD(lParam);\r
+ infoPtr->ClientSize.cy = HIWORD(lParam);\r
+ infoPtr->CellSize.cx = infoPtr->ClientSize.cx / 7;\r
+ infoPtr->CellSize.cy = infoPtr->ClientSize.cy / 7;\r
+\r
+ /* repaint the control */\r
+ InvalidateRect(hwnd,\r
+ NULL,\r
+ TRUE);\r
+ break;\r
+ }\r
+\r
+ case WM_GETFONT:\r
+ {\r
+ Ret = (LRESULT)infoPtr->hFont;\r
+ break;\r
+ }\r
+\r
+ case WM_CREATE:\r
+ {\r
+ infoPtr = HeapAlloc(GetProcessHeap(),\r
+ 0,\r
+ sizeof(MONTHCALWND));\r
+ if (infoPtr == NULL)\r
+ {\r
+ Ret = (LRESULT)-1;\r
+ break;\r
+ }\r
+\r
+ SetWindowLongPtr(hwnd,\r
+ 0,\r
+ (DWORD_PTR)infoPtr);\r
+\r
+ ZeroMemory(infoPtr,\r
+ sizeof(MONTHCALWND));\r
+\r
+ infoPtr->hSelf = hwnd;\r
+ infoPtr->hNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;\r
+\r
+ MonthCalSetLocalTime(infoPtr,\r
+ NULL);\r
+\r
+ MonthCalReload(infoPtr);\r
+ break;\r
+ }\r
+\r
+ case WM_DESTROY:\r
+ {\r
+ HeapFree(GetProcessHeap(),\r
+ 0,\r
+ infoPtr);\r
+ SetWindowLongPtr(hwnd,\r
+ 0,\r
+ (DWORD_PTR)NULL);\r
+ break;\r
+ }\r
+\r
+ default:\r
+ {\r
+HandleDefaultMessage:\r
+ Ret = DefWindowProc(hwnd,\r
+ uMsg,\r
+ wParam,\r
+ lParam);\r
+ break;\r
+ }\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+BOOL\r
+RegisterMonthCalControl(IN HINSTANCE hInstance)\r
+{\r
+ WNDCLASS wc = {0};\r
+ \r
+ wc.style = CS_DBLCLKS;\r
+ wc.lpfnWndProc = MonthCalWndProc;\r
+ wc.cbWndExtra = sizeof(PMONTHCALWND);\r
+ wc.hInstance = hInstance;\r
+ wc.hCursor = LoadCursor(NULL,\r
+ (LPWSTR)IDC_ARROW);\r
+ wc.hbrBackground = (HBRUSH)(MONTHCAL_CTRLBG + 1);\r
+ wc.lpszClassName = szMonthCalWndClass;\r
+ \r
+ return RegisterClass(&wc) != 0;\r
+}\r
+\r
+VOID\r
+UnregisterMonthCalControl(IN HINSTANCE hInstance)\r
+{\r
+ UnregisterClass(szMonthCalWndClass,\r
+ hInstance);\r
+}\r
-#include "timedate.h"\r
+#include <timedate.h>\r
\r
SOCKET Sock;\r
SOCKADDR_IN myAddr, ntpAddr;\r
#define IDC_CPLICON 1
#define IDD_DATETIMEPAGE 100
-#define IDC_DATEPICKER 101
-#define IDC_MONTHCALENDAR 102
+#define IDC_MONTHCB 101
+#define IDC_YEAREDIT 102
+#define IDC_MONTHCALENDAR 103
#define IDC_TIMEZONE 106
#define IDC_TIMEPICKER 107
*
*/
-#include "timedate.h"
+#include <timedate.h>
typedef struct _TZ_INFO
{
static VOID
SetLocalSystemTime(HWND hwnd)
{
- SYSTEMTIME Date;
- SYSTEMTIME Time;
-
- if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_DATEPICKER), &Date) != GDT_VALID)
+ SYSTEMTIME Time;
+
+ if (DateTime_GetSystemTime(GetDlgItem(hwnd,
+ IDC_TIMEPICKER),
+ &Time) == GDT_VALID &&
+ SendMessage(GetDlgItem(hwnd,
+ IDC_MONTHCALENDAR),
+ MCCM_GETDATE,
+ (WPARAM)&Time,
+ 0))
{
- return;
+ /* Call SetLocalTime twice to ensure correct results */
+ SetLocalTime(&Time);
+ SetLocalTime(&Time);
+
+ SetWindowLong(hwnd,
+ DWL_MSGRESULT,
+ PSNRET_NOERROR);
+
+ SendMessage(GetDlgItem(hwnd,
+ IDC_MONTHCALENDAR),
+ MCCM_RESET,
+ (WPARAM)&Time,
+ 0);
+
+ /* broadcast the time change message */
+ SendMessage(HWND_BROADCAST,
+ WM_TIMECHANGE,
+ 0,
+ 0);
}
-
- if (DateTime_GetSystemTime(GetDlgItem(hwnd, IDC_TIMEPICKER), &Time) != GDT_VALID)
- {
- return;
- }
-
- Time.wYear = Date.wYear;
- Time.wMonth = Date.wMonth;
- Time.wDayOfWeek = Date.wDayOfWeek;
- Time.wDay = Date.wDay;
-
- SetLocalTime(&Time);
}
}
+static VOID
+FillMonthsComboBox(HWND hCombo)
+{
+ SYSTEMTIME LocalDate = {0};
+ WCHAR szBuf[64];
+ INT i;
+ UINT Month;
+
+ GetLocalTime(&LocalDate);
+
+ SendMessage(hCombo,
+ CB_RESETCONTENT,
+ 0,
+ 0);
+
+ for (Month = 1;
+ Month <= 13;
+ Month++)
+ {
+ i = GetLocaleInfoW(LOCALE_USER_DEFAULT,
+ ((Month < 13) ? LOCALE_SMONTHNAME1 + Month - 1 : LOCALE_SMONTHNAME13),
+ szBuf,
+ sizeof(szBuf) / sizeof(szBuf[0]));
+ if (i > 1)
+ {
+ i = (INT)SendMessage(hCombo,
+ CB_ADDSTRING,
+ 0,
+ (LPARAM)szBuf);
+ if (i != CB_ERR)
+ {
+ SendMessage(hCombo,
+ CB_SETITEMDATA,
+ (WPARAM)i,
+ Month);
+
+ if (Month == (UINT)LocalDate.wMonth)
+ {
+ SendMessage(hCombo,
+ CB_SETCURSEL,
+ (WPARAM)i,
+ 0);
+ }
+ }
+ }
+ }
+}
+
+
+static WORD
+GetCBSelectedMonth(HWND hCombo)
+{
+ INT i;
+ WORD Ret = (WORD)-1;
+
+ i = (INT)SendMessage(hCombo,
+ CB_GETCURSEL,
+ 0,
+ 0);
+ if (i != CB_ERR)
+ {
+ i = (INT)SendMessage(hCombo,
+ CB_GETITEMDATA,
+ (WPARAM)i,
+ 0);
+
+ if (i >= 1 && i <= 13)
+ Ret = (WORD)i;
+ }
+
+ return Ret;
+}
+
+
+static VOID
+ChangeMonthCalDate(HWND hMonthCal,
+ WORD Day,
+ WORD Month,
+ WORD Year)
+{
+ SendMessage(hMonthCal,
+ MCCM_SETDATE,
+ MAKEWPARAM(Day,
+ Month),
+ MAKELPARAM(Year,
+ 0));
+}
+
+static VOID
+AutoUpdateMonthCal(HWND hwndDlg,
+ PNMMCCAUTOUPDATE lpAutoUpdate)
+{
+ /* update the controls */
+ FillMonthsComboBox(GetDlgItem(hwndDlg,
+ IDC_MONTHCB));
+}
+
+
/* Property page dialog callback */
INT_PTR CALLBACK
DateTimePageProc(HWND hwndDlg,
switch (uMsg)
{
case WM_INITDIALOG:
+ FillMonthsComboBox(GetDlgItem(hwndDlg,
+ IDC_MONTHCB));
InitClockWindowClass();
CreateWindowExW(0,
L"ClockWndClass",
NULL);
break;
- case WM_NOTIFY:
- {
- LPNMHDR lpnm = (LPNMHDR)lParam;
-
- switch (lpnm->code)
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wParam))
+ {
+ case IDC_MONTHCB:
{
- case DTN_DATETIMECHANGE:
- case MCN_SELECT:
- /* Enable the 'Apply' button */
- PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ if (HIWORD(wParam) == CBN_SELCHANGE)
+ {
+ ChangeMonthCalDate(GetDlgItem(hwndDlg,
+ IDC_MONTHCALENDAR),
+ -1,
+ GetCBSelectedMonth((HWND)lParam),
+ -1);
+ }
break;
+ }
+ }
+ break;
+ }
- case PSN_SETACTIVE:
- SetTimeZoneName(hwndDlg);
- return 0;
+ case WM_NOTIFY:
+ {
+ LPNMHDR lpnm = (LPNMHDR)lParam;
- case PSN_APPLY:
- SetLocalSystemTime(hwndDlg);
- SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
- return TRUE;
+ switch (lpnm->idFrom)
+ {
+ case IDC_TIMEPICKER:
+ switch (lpnm->code)
+ {
+ case DTN_DATETIMECHANGE:
+ /* Enable the 'Apply' button */
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ break;
+ }
+ break;
+
+ case IDC_MONTHCALENDAR:
+ switch (lpnm->code)
+ {
+ case MCCN_SELCHANGE:
+ /* Enable the 'Apply' button */
+ PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
+ break;
+
+ case MCCN_AUTOUPDATE:
+ AutoUpdateMonthCal(hwndDlg,
+ (PNMMCCAUTOUPDATE)lpnm);
+ break;
+ }
+ break;
default:
- break;
- }
+ switch (lpnm->code)
+ {
+ case PSN_SETACTIVE:
+ SetTimeZoneName(hwndDlg);
+ break;
+
+ case PSN_APPLY:
+ SetLocalSystemTime(hwndDlg);
+ return TRUE;
+ }
+ }
}
break;
+
+ case WM_TIMECHANGE:
+ {
+ /* FIXME - we don't get this message as we're not a top-level window... */
+ SendMessage(GetDlgItem(hwndDlg,
+ IDC_MONTHCALENDAR),
+ MCCM_RESET,
+ 0,
+ 0);
+ break;
+ }
}
return FALSE;
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones",
0,
- KEY_ALL_ACCESS,
+ KEY_ENUMERATE_SUB_KEYS,
&hZonesKey))
return;
if (RegOpenKeyExW(hZonesKey,
szKeyName,
0,
- KEY_ALL_ACCESS,
+ KEY_QUERY_VALUE,
&hZoneKey))
break;
Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DateTime\\Servers",
0,
- KEY_READ,
+ KEY_QUERY_VALUE,
&hKey);
if (Ret != ERROR_SUCCESS)
return;
Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DateTime\\Servers",
0,
- KEY_READ,
+ KEY_SET_VALUE,
&hKey);
if (Ret != ERROR_SUCCESS)
return;
PROPSHEETHEADER psh;
PROPSHEETPAGE psp[3];
TCHAR Caption[256];
+ LONG Ret = 0;
- LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
-
- ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
- psh.dwSize = sizeof(PROPSHEETHEADER);
- psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
- psh.hwndParent = NULL;
- psh.hInstance = hApplet;
- psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
- psh.pszCaption = Caption;
- psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
- psh.nStartPage = 0;
- psh.ppsp = psp;
-
- InitPropSheetPage(&psp[0], IDD_DATETIMEPAGE, DateTimePageProc);
- InitPropSheetPage(&psp[1], IDD_TIMEZONEPAGE, TimeZonePageProc);
- InitPropSheetPage(&psp[2], IDD_INETTIMEPAGE, InetTimePageProc);
+ if (RegisterMonthCalControl(hApplet))
+ {
+ LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
+
+ ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+ psh.dwSize = sizeof(PROPSHEETHEADER);
+ psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
+ psh.hwndParent = NULL;
+ psh.hInstance = hApplet;
+ psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_CPLICON));
+ psh.pszCaption = Caption;
+ psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
+ psh.nStartPage = 0;
+ psh.ppsp = psp;
+
+ InitPropSheetPage(&psp[0], IDD_DATETIMEPAGE, DateTimePageProc);
+ InitPropSheetPage(&psp[1], IDD_TIMEZONEPAGE, TimeZonePageProc);
+ InitPropSheetPage(&psp[2], IDD_INETTIMEPAGE, InetTimePageProc);
+
+ Ret = (LONG)(PropertySheet(&psh) != -1);
+
+ UnregisterMonthCalControl(hApplet);
+ }
- return (LONG)(PropertySheet(&psh) != -1);
+ return Ret;
}
#define __CPL_SAMPLE_H
#include <windows.h>
+#include <windowsx.h>
+#include <tchar.h>
+#include <stdio.h>
#include <winsock2.h>
#include <math.h>
#include <commctrl.h>
BOOL SendData(VOID);
BOOL RecieveData(CHAR *);
+/* monthcal.c */
+#define MCCM_SETDATE (WM_USER + 1)
+#define MCCM_GETDATE (WM_USER + 2)
+#define MCCM_RESET (WM_USER + 3)
+#define MCCM_CHANGED (WM_USER + 4)
+
+#define MCCN_SELCHANGE (1)
+typedef struct _NMMCCSELCHANGE
+{
+ NMHDR hdr;
+ WORD OldDay;
+ WORD OldMonth;
+ WORD OldYear;
+ WORD NewDay;
+ WORD NewMonth;
+ WORD NewYear;
+} NMMCCSELCHANGE, *PNMMCCSELCHANGE;
+#define MCCN_AUTOUPDATE (2)
+typedef struct _NMMCCAUTOUPDATE
+{
+ NMHDR hdr;
+ SYSTEMTIME SystemTime;
+} NMMCCAUTOUPDATE, *PNMMCCAUTOUPDATE;
+
+BOOL RegisterMonthCalControl(IN HINSTANCE hInstance);
+VOID UnregisterMonthCalControl(IN HINSTANCE hInstance);
+
#endif /* __CPL_SAMPLE_H */
/* EOF */
<library>comctl32</library>
<library>ws2_32</library>
<library>iphlpapi</library>
- <file>ntpclient.c</file>
+ <library>ntdll</library>
<file>clock.c</file>
+ <file>ntpclient.c</file>
+ <file>monthcal.c</file>
<file>timedate.c</file>
<file>timedate.rc</file>
</module>