📄 monthcal.c
字号:
SelDay = MonthCalPtToDay(infoPtr,
GET_X_LPARAM(lParam),
GET_Y_LPARAM(lParam));
if (SelDay != 0 && SelDay != infoPtr->Day)
{
MonthCalSetDate(infoPtr,
SelDay,
infoPtr->Month,
infoPtr->Year);
}
/* fall through */
}
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
{
if (!infoPtr->HasFocus)
{
SetFocus(hwnd);
}
break;
}
case WM_KEYDOWN:
{
WORD NewDay = 0;
switch (wParam)
{
case VK_UP:
{
if (infoPtr->Day > 7)
{
NewDay = infoPtr->Day - 7;
}
break;
}
case VK_DOWN:
{
if (infoPtr->Day + 7 <= MonthCalMonthLength(infoPtr->Month,
infoPtr->Year))
{
NewDay = infoPtr->Day + 7;
}
break;
}
case VK_LEFT:
{
if (infoPtr->Day > 1)
{
NewDay = infoPtr->Day - 1;
}
break;
}
case VK_RIGHT:
{
if (infoPtr->Day < MonthCalMonthLength(infoPtr->Month,
infoPtr->Year))
{
NewDay = infoPtr->Day + 1;
}
break;
}
}
/* update the selection */
if (NewDay != 0)
{
MonthCalSetDate(infoPtr,
NewDay,
infoPtr->Month,
infoPtr->Year);
}
goto HandleDefaultMessage;
}
case WM_GETDLGCODE:
{
INT virtKey;
virtKey = (lParam != 0 ? (INT)((LPMSG)lParam)->wParam : 0);
switch (virtKey)
{
case VK_TAB:
{
/* change the UI status */
SendMessageW(GetAncestor(hwnd,
GA_PARENT),
WM_CHANGEUISTATE,
MAKEWPARAM(UIS_INITIALIZE,
0),
0);
break;
}
}
Ret |= DLGC_WANTARROWS;
break;
}
case WM_SETFOCUS:
{
infoPtr->HasFocus = TRUE;
MonthCalRepaintDay(infoPtr,
infoPtr->Day);
break;
}
case WM_KILLFOCUS:
{
infoPtr->HasFocus = FALSE;
MonthCalRepaintDay(infoPtr,
infoPtr->Day);
break;
}
case WM_UPDATEUISTATE:
{
DWORD OldUIState = infoPtr->UIState;
switch (LOWORD(wParam))
{
case UIS_SET:
infoPtr->UIState |= HIWORD(wParam);
break;
case UIS_CLEAR:
infoPtr->UIState &= ~HIWORD(wParam);
break;
}
if (infoPtr->UIState != OldUIState)
{
MonthCalRepaintDay(infoPtr,
infoPtr->Day);
}
break;
}
case MCCM_SETDATE:
{
WORD Day, Month, Year, DaysCount;
Day = LOWORD(wParam);
Month = HIWORD(wParam);
Year = LOWORD(lParam);
if (Day == (WORD)-1)
Day = infoPtr->Day;
if (Month == (WORD)-1)
Month = infoPtr->Month;
if (Year == (WORD)-1)
Year = infoPtr->Year;
DaysCount = MonthCalMonthLength(Month,
Year);
if (Day > DaysCount)
Day = DaysCount;
if (MonthCalValidDate(Day,
Month,
Year))
{
if (Day != infoPtr->Day ||
Month != infoPtr->Month ||
Year != infoPtr->Year)
{
Ret = MonthCalSetDate(infoPtr,
Day,
Month,
Year);
}
}
break;
}
case MCCM_GETDATE:
{
LPSYSTEMTIME lpSystemTime = (LPSYSTEMTIME)wParam;
lpSystemTime->wYear = infoPtr->Year;
lpSystemTime->wMonth = infoPtr->Month;
lpSystemTime->wDay = infoPtr->Day;
Ret = TRUE;
break;
}
case MCCM_RESET:
{
MonthCalSetLocalTime(infoPtr,
NULL);
Ret = TRUE;
break;
}
case MCCM_CHANGED:
{
Ret = infoPtr->Changed;
break;
}
case WM_TIMER:
{
switch (wParam)
{
case ID_DAYTIMER:
{
/* kill the timer */
KillTimer(hwnd,
ID_DAYTIMER);
infoPtr->DayTimerSet = FALSE;
if (!infoPtr->Changed)
{
/* update the system time and setup the new day timer */
MonthCalSetLocalTime(infoPtr,
NULL);
/* update the control */
MonthCalUpdate(infoPtr);
}
break;
}
}
break;
}
case WM_SETFONT:
{
Ret = (LRESULT)MonthCalChangeFont(infoPtr,
(HFONT)wParam,
(BOOL)LOWORD(lParam));
break;
}
case WM_SIZE:
{
infoPtr->ClientSize.cx = LOWORD(lParam);
infoPtr->ClientSize.cy = HIWORD(lParam);
infoPtr->CellSize.cx = infoPtr->ClientSize.cx / 7;
infoPtr->CellSize.cy = infoPtr->ClientSize.cy / 7;
/* repaint the control */
InvalidateRect(hwnd,
NULL,
TRUE);
break;
}
case WM_GETFONT:
{
Ret = (LRESULT)infoPtr->hFont;
break;
}
case WM_ENABLE:
{
infoPtr->Enabled = ((BOOL)wParam != FALSE);
MonthCalReload(infoPtr);
break;
}
case WM_STYLECHANGED:
{
if (wParam == GWL_STYLE)
{
unsigned int OldEnabled = infoPtr->Enabled;
infoPtr->Enabled = !(((LPSTYLESTRUCT)lParam)->styleNew & WS_DISABLED);
if (OldEnabled != infoPtr->Enabled)
{
MonthCalReload(infoPtr);
}
}
break;
}
case WM_CREATE:
{
infoPtr = (MONTHCALWND*) HeapAlloc(GetProcessHeap(),
0,
sizeof(MONTHCALWND));
if (infoPtr == NULL)
{
Ret = (LRESULT)-1;
break;
}
SetWindowLongPtrW(hwnd,
0,
(LONG_PTR)infoPtr);
ZeroMemory(infoPtr,
sizeof(MONTHCALWND));
infoPtr->hSelf = hwnd;
infoPtr->hNotify = ((LPCREATESTRUCTW)lParam)->hwndParent;
infoPtr->Enabled = !(((LPCREATESTRUCTW)lParam)->style & WS_DISABLED);
MonthCalSetLocalTime(infoPtr,
NULL);
MonthCalReload(infoPtr);
break;
}
case WM_DESTROY:
{
HeapFree(GetProcessHeap(),
0,
infoPtr);
SetWindowLongPtrW(hwnd,
0,
(DWORD_PTR)NULL);
break;
}
default:
{
HandleDefaultMessage:
Ret = DefWindowProcW(hwnd,
uMsg,
wParam,
lParam);
break;
}
}
return Ret;
}
BOOL
RegisterMonthCalControl(IN HINSTANCE hInstance)
{
WNDCLASSW wc = {0};
wc.style = CS_DBLCLKS;
wc.lpfnWndProc = MonthCalWndProc;
wc.cbWndExtra = sizeof(PMONTHCALWND);
wc.hInstance = hInstance;
wc.hCursor = LoadCursorW(NULL,
(LPWSTR)IDC_ARROW);
wc.hbrBackground = (HBRUSH)(MONTHCAL_CTRLBG + 1);
wc.lpszClassName = szMonthCalWndClass;
return RegisterClassW(&wc) != 0;
}
VOID
UnregisterMonthCalControl(IN HINSTANCE hInstance)
{
UnregisterClassW(szMonthCalWndClass,
hInstance);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -