📄 monthcalendar.c
字号:
PMCCOLORINFO pmcci; //int bk_color = GetWindowBkColor (hWnd); UINT uFormat; pmcci = (PMCCOLORINFO) mc_data->dwClrData; dwStyle = GetWindowStyle (hWnd); mcGetRects (hWnd, &rcClient, &rcMonth, &rcYear, &rcMDay); #ifdef _FLAT_WINDOW_STYLE DrawFlatControlFrameEx (hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, pmcci->clr_daybk, 1, -1); DrawFlatControlFrameEx (hdc, rcClient.left+2, rcClient.top+2, rcClient.right-2, rcClient.top+2+DATECAP_H(hWnd), pmcci->clr_titlebk, 1, -1);#else/* mcDraw3DMCDownFrame (hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, pmcci->clr_daybk);*/ Draw3DDownFrame (hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom, pmcci->clr_daybk); Draw3DUpFrame (hdc, rcClient.left+2, rcClient.top+2, rcClient.right-2, rcClient.top+2+DATECAP_H(hWnd), pmcci->clr_titlebk);#endif mcGetArrowRects (&rcMonth, &rcYear, &rcAML, &rcAMR, &rcAYL, &rcAYR); mcDrawPageArrow (mc_data, hdc, &rcAML, FALSE, FALSE); mcDrawPageArrow (mc_data, hdc, &rcAMR, TRUE, FALSE); mcDrawPageArrow (mc_data, hdc, &rcAYL, FALSE, FALSE); mcDrawPageArrow (mc_data, hdc, &rcAYR, TRUE, FALSE); { char chYear[5]; const char* pchMon; uFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER; if ((dwStyle & MCS_LANG) == MCS_CHN) pchMon = chMon_C[mc_data->cur_month-1]; else if ((dwStyle & MCS_LANG) == MCS_ENG_L) pchMon = chMon_EL[mc_data->cur_month-1]; else if ((dwStyle & MCS_LANG) == MCS_ENG_S) pchMon = chMon_ES[mc_data->cur_month-1]; else pchMon = chMon_C[mc_data->cur_month-1]; mcTextOutCenter (hdc, &rcMonth, pchMon); sprintf(chYear, "%d", mc_data->cur_year); mcTextOutCenter (hdc, &rcYear, chYear); } // draw weekday caption { int i, weekitem_w; const char *pchDay; RECT rcWeek, rcWeekItem; rcWeek.left = rcClient.left + WEEK_BORDER; rcWeek.right = rcClient.right-WEEK_BORDER; rcWeek.top = rcClient.top + 2 + WEEK_VBORDER1 + DATECAP_H(hWnd); rcWeek.bottom = rcWeek.top + WEEKFIELD_H(hWnd); weekitem_w = (rcWeek.right - rcWeek.left)/7; rcWeekItem.left = rcWeek.left; rcWeekItem.right = rcWeekItem.left + weekitem_w; rcWeekItem.top = rcWeek.top; rcWeekItem.bottom = rcWeek.bottom; SetBrushColor (hdc, pmcci->clr_weekcaptbk); FillBox (hdc, rcWeek.left, rcWeek.top, rcWeek.right-rcWeek.left, rcWeek.bottom-rcWeek.top); SetBkColor (hdc, pmcci->clr_weekcaptbk); SetTextColor (hdc, pmcci->clr_weekcapttext); for (i = 0; i <= 6; i++) { //RECT tmp; if ((dwStyle & MCS_LANG) == MCS_CHN) { pchDay = chWeek_C[i]; } else if ((dwStyle & MCS_LANG) == MCS_ENG_L) pchDay = chWeek_E[i]; else if ((dwStyle & MCS_LANG) == MCS_ENG_S) pchDay = chWeek_E_S[i]; else { pchDay = chWeek_C[i]; } //tmp = rcWeekItem; TextOut (hdc, rcWeekItem.left+11, rcWeekItem.top+1, pchDay); //mcTextOutCenter (hdc, &rcWeekItem, pchDay); //mcTextOutCenter (hdc, &tmp, pchDay); OffsetRect (&rcWeekItem, weekitem_w, 0); } } // draw month day text { mcDrawMonthDay (hdc, &rcMDay, mc_data); }}// initialize mc_data static BOOL mcInitMonthCalendarData (HWND hWnd, MONCALDDATA* mc_data){ time_t nowtime; struct tm *pnt; RECT rcClient, rcMDay; PMCCOLORINFO pmcci; time(&nowtime); pnt = localtime(&nowtime); mc_data->sys_year = mc_data->cur_year = pnt->tm_year + 1900; mc_data->sys_month = mc_data->cur_month = pnt->tm_mon + 1; mc_data->sys_day = mc_data->cur_day = pnt->tm_mday; mcGetRects (hWnd, &rcClient, NULL, NULL, &rcMDay); mc_data->item_w = (rcMDay.right - rcMDay.left) / 7; mc_data->item_h = (rcMDay.bottom - rcMDay.top) / 6; mc_data->WeekDay1 = GetWeekDay(mc_data->cur_year, mc_data->cur_month, 1); mcGetCurDayPos (mc_data, mc_data->cur_day, &mc_data->cur_line, &mc_data->cur_WeekDay); mc_data->sys_WeekDay = mc_data->cur_WeekDay; mc_data->monlen = GetMonLen (mc_data->cur_year, mc_data->cur_month); // color info pmcci = (PMCCOLORINFO) mc_data->dwClrData; pmcci->clr_titlebk = MCCLR_DF_TITLEBK; pmcci->clr_titletext = MCCLR_DF_TITLETEXT; pmcci->clr_arrow = MCCLR_DF_ARROW; pmcci->clr_arrowHibk = MCCLR_DF_ARROWHIBK; pmcci->clr_daybk = MCCLR_DF_DAYBK; pmcci->clr_dayHibk = MCCLR_DF_DAYHIBK; pmcci->clr_daytext = MCCLR_DF_DAYTEXT; pmcci->clr_trailingtext = MCCLR_DF_TRAILINGTEXT; pmcci->clr_dayHitext = MCCLR_DF_DAYHITEXT; pmcci->clr_weekcaptbk = MCCLR_DF_WEEKCAPTBK; pmcci->clr_weekcapttext = MCCLR_DF_WEEKCAPTTEXT; return TRUE;}/********************************************************************************/static int MonthCalendarCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){ HDC hdc; //PCONTROL pCtrl; PMONCALDDATA mc_data; DWORD dwStyle = GetWindowStyle (hWnd); //pCtrl = Control (hWnd); switch (message) { case MSG_CREATE: { RECT rcWnd; int rc_w, rc_h; PMCCOLORINFO pmcci; GetWindowRect (hWnd, &rcWnd); rc_w = rcWnd.right - rcWnd.left; rc_h = rcWnd.bottom - rcWnd.top; if (rc_w < MINWNDRECT_W) { rc_w = MINWNDRECT_W; MoveWindow (hWnd, rcWnd.left, rcWnd.top, rc_w, rc_h, FALSE); } if (rc_h < MINWNDRECT_H) { rc_h = MINWNDRECT_H; MoveWindow (hWnd, rcWnd.left, rcWnd.top, rc_w, rc_h, FALSE); } if ((mc_data = (MONCALDDATA *) malloc (sizeof(MONCALDDATA))) == NULL) return -1; SetWindowAdditionalData2 (hWnd, (DWORD) mc_data); if ((pmcci = (MCCOLORINFO*) malloc (sizeof(MCCOLORINFO))) == NULL) { free (mc_data); return -1; } mc_data->dwClrData = (DWORD) pmcci; if (!mcInitMonthCalendarData (hWnd, mc_data)) { free (pmcci); free (mc_data); return -1; } } break; case MCM_GETCURDAY: { mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); return mc_data->cur_day; } break; case MCM_GETCURMONTH: mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); return mc_data->cur_month; break; case MCM_GETCURYEAR: mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); return mc_data->cur_year; break; case MCM_GETCURMONLEN: mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); return mc_data->monlen; break; case MCM_SETCURDAY: { int newday = (int) wParam; RECT rcClient, rcMDay; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); if (newday < 1) newday = 1; else if (newday > mc_data->monlen) newday = mc_data->monlen; mcGetRects (hWnd, &rcClient, NULL, NULL, &rcMDay); hdc = GetClientDC (hWnd); mcDrawDay (hdc, mc_data, &rcMDay, newday); ReleaseDC (hdc); // draw day } break; case MCM_SETCURMONTH: { int newmonth = (int) wParam; RECT rcClient, rcMonth, rcMDay; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); if (newmonth > 12) newmonth = 12; else if (newmonth < 1) newmonth = 1; mcGetRects (hWnd, &rcClient, &rcMonth, NULL, &rcMDay); hdc = GetClientDC (hWnd); mcDrawMonth (hWnd, hdc, mc_data, &rcMDay, &rcMonth, newmonth); ReleaseDC (hdc); } break; case MCM_SETCURYEAR: { int newyear = (int) wParam; RECT rcClient, rcYear, rcMDay; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); if (newyear < 1902) newyear = 1902; mcGetRects (hWnd, &rcClient, NULL, &rcYear, &rcMDay); hdc = GetClientDC (hWnd); mcDrawYear (hWnd, hdc, mc_data, &rcMDay, &rcYear, newyear); ReleaseDC (hdc); } break; case MCM_SETTODAY: { RECT rcClient, rcYear, rcMonth, rcMDay; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); mcGetRects (hWnd, &rcClient, &rcMonth, &rcYear, &rcMDay); mc_data->cur_day = mc_data->sys_day; mc_data->cur_month = mc_data->sys_month; mc_data->cur_year = mc_data->sys_year; mc_data->WeekDay1 = GetWeekDay(mc_data->cur_year, mc_data->cur_month, 1); mcGetCurDayPos (mc_data, mc_data->cur_day, &mc_data->cur_line, &mc_data->cur_WeekDay); mc_data->monlen = GetMonLen (mc_data->cur_year, mc_data->cur_month); InvalidateRect (hWnd, &rcYear, FALSE); InvalidateRect (hWnd, &rcMonth, FALSE); InvalidateRect (hWnd, &rcMDay, FALSE); } break; case MCM_SETCURDATE: { RECT rcClient, rcYear, rcMonth, rcMDay; PSYSTEMTIME pcurdate = NULL; mcGetRects (hWnd, &rcClient, &rcMonth, &rcYear, &rcMDay); pcurdate = (PSYSTEMTIME) lParam; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); mc_data->cur_year = pcurdate->year; mc_data->cur_month = pcurdate->month; mc_data->cur_day = pcurdate->day; mc_data->WeekDay1 = GetWeekDay (mc_data->cur_year, mc_data->cur_month, 1); mcGetCurDayPos (mc_data, mc_data->cur_day, &mc_data->cur_line, &mc_data->cur_WeekDay); mc_data->monlen = GetMonLen (mc_data->cur_year, mc_data->cur_month); InvalidateRect (hWnd, &rcYear, FALSE); InvalidateRect (hWnd, &rcMonth, FALSE); InvalidateRect (hWnd, &rcMDay, FALSE); } break; case MCM_GETFIRSTWEEKDAY: mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); return mc_data->WeekDay1; break; case MCM_GETCURDATE: { PSYSTEMTIME pcurdate = NULL; pcurdate = (PSYSTEMTIME) lParam; mc_data = (PMONCALDDATA) GetWindowAdditionalData2 (hWnd); pcurdate->year = mc_data->cur_year; pcurdate->month = mc_data->cur_month; pcurdate->day = mc_data->cur_day; pcurdate->weekday = mc_data->cur_WeekDay; } break; case MCM_GETTODAY: {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -