📄 calendardlg.cpp
字号:
// CalendarDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Controls.h"
#include "CalendarDlg.h"
#include <stdarg.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCalendarDlg property page
static TCHAR *szMonths[] =
{
"January", "February", "March", "April", "May",
"June", "July", "August", "September",
"October", "November","December"
};
static TCHAR *szDays[] =
{
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"
};
IMPLEMENT_DYNCREATE(CCalendarDlg, CPropertyPage)
CCalendarDlg::CCalendarDlg() : CPropertyPage(CCalendarDlg::IDD)
{
//{{AFX_DATA_INIT(CCalendarDlg)
m_bDayState = FALSE;
m_bMultiselect = FALSE;
m_bNoToday = FALSE;
m_bNoTodayCircle = FALSE;
m_bWeekNumbers = FALSE;
m_nFirstWeekDay = 0;
m_nMonthDelta = 0;
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP;
}
CCalendarDlg::~CCalendarDlg()
{
}
void CCalendarDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalendarDlg)
DDX_Control(pDX, IDC_CALENDAR_CALENDAR, m_ctlCalendar);
DDX_Check(pDX, IDC_CALENDAR_DAYSTATE, m_bDayState);
DDX_Check(pDX, IDC_CALENDAR_MULTISELECT, m_bMultiselect);
DDX_Check(pDX, IDC_CALENDAR_NOTODAY, m_bNoToday);
DDX_Check(pDX, IDC_CALENDAR_NOTODAYCIRCLE, m_bNoTodayCircle);
DDX_Check(pDX, IDC_CALENDAR_WEEKNUMBERS, m_bWeekNumbers);
DDX_CBIndex(pDX, IDC_CALENDAR_FIRSTWEEKDAY, m_nFirstWeekDay);
DDX_Text(pDX, IDC_CALENDAR_DELTA, m_nMonthDelta);
DDV_MinMaxInt(pDX, m_nMonthDelta, 0, 1200);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalendarDlg, CPropertyPage)
//{{AFX_MSG_MAP(CCalendarDlg)
ON_BN_CLICKED(IDC_CALENDAR_NOTODAY, OnNoToday)
ON_BN_CLICKED(IDC_CALENDAR_NOTODAYCIRCLE, OnNoTodayCircle)
ON_BN_CLICKED(IDC_CALENDAR_DAYSTATE, OnDayState)
ON_BN_CLICKED(IDC_CALENDAR_MULTISELECT, OnMultiselect)
ON_BN_CLICKED(IDC_CALENDAR_WEEKNUMBERS, OnWeekNumbers)
ON_CBN_SELCHANGE(IDC_CALENDAR_FIRSTWEEKDAY, OnSelchangeFirstWeekDay)
ON_EN_CHANGE(IDC_CALENDAR_DELTA, OnChangeCalendarDelta)
ON_NOTIFY(MCN_GETDAYSTATE, IDC_CALENDAR_CALENDAR, OnGetdaystateCalendarCalendar)
ON_NOTIFY(MCN_SELCHANGE, IDC_CALENDAR_CALENDAR, OnSelchangeCalendarCalendar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalendarDlg message handlers
BOOL CCalendarDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
CRect rc;
m_ctlCalendar.SetMaxSelCount (3);
m_ctlCalendar.SizeMinReq(TRUE);
m_ctlCalendar.SetCurSel (CTime::GetCurrentTime ());
m_dwStyle = m_ctlCalendar.GetStyle ();
m_DayState = 0;
SetDayStateBits (m_DayState, 3, 2, 12, 18);
UpdateData (FALSE);
return TRUE;
}
void CCalendarDlg::OnNoToday()
{
UpdateData (TRUE);
if (m_bNoToday)
{
m_dwStyle |= MCS_NOTODAY;
m_ctlCalendar.ModifyStyle (0, MCS_NOTODAY, TRUE);
}
else
{
m_dwStyle &= ~MCS_NOTODAY;
m_ctlCalendar.ModifyStyle (MCS_NOTODAY, 0, TRUE);
}
m_ctlCalendar.SizeMinReq(TRUE);
}
void CCalendarDlg::OnNoTodayCircle()
{
UpdateData (TRUE);
if (m_bNoTodayCircle)
{
m_dwStyle |= MCS_NOTODAYCIRCLE;
m_ctlCalendar.ModifyStyle (0, MCS_NOTODAYCIRCLE, TRUE);
}
else
{
m_dwStyle &= ~MCS_NOTODAYCIRCLE;
m_ctlCalendar.ModifyStyle (MCS_NOTODAYCIRCLE, 0, TRUE);
}
}
void CCalendarDlg::OnDayState()
{
UpdateData (TRUE);
if (m_bDayState)
{
m_dwStyle |= MCS_DAYSTATE;
m_ctlCalendar.ModifyStyle (0, MCS_DAYSTATE, TRUE);
}
else
{
m_dwStyle &= ~MCS_DAYSTATE;
m_ctlCalendar.ModifyStyle (MCS_DAYSTATE, 0, TRUE);
}
RecreateControl ();
}
void CCalendarDlg::OnMultiselect()
{
UpdateData (TRUE);
if (m_bMultiselect)
m_dwStyle |= MCS_MULTISELECT;
else
m_dwStyle &= ~MCS_MULTISELECT;
RecreateControl ();
}
void CCalendarDlg::OnWeekNumbers()
{
UpdateData (TRUE);
if (m_bWeekNumbers)
{
m_dwStyle |= MCS_WEEKNUMBERS;
m_ctlCalendar.ModifyStyle (0, MCS_WEEKNUMBERS, TRUE);
}
else
{
m_dwStyle &= ~MCS_WEEKNUMBERS;
m_ctlCalendar.ModifyStyle (MCS_WEEKNUMBERS, 0, TRUE);
}
m_ctlCalendar.SizeMinReq(TRUE);
}
void CCalendarDlg::RecreateControl()
{
UpdateData (TRUE);
CRect rc;
m_ctlCalendar.GetWindowRect (rc);
ScreenToClient (rc);
CTime dateStart, dateEnd;
DWORD dwStyle = m_ctlCalendar.GetStyle ();
bool bMultisel = false;
if (dwStyle & MCS_MULTISELECT)
{
bMultisel = true;
m_ctlCalendar.GetSelRange (dateStart, dateEnd);
}
else
{
SYSTEMTIME st;
m_ctlCalendar.GetCurSel (&st);
st.wHour = 8;
st.wMinute = st.wSecond = st.wMilliseconds = 0;
CTime sel(st);
dateStart = sel;
dateEnd = sel;
}
m_ctlCalendar.DestroyWindow ();
m_ctlCalendar.Create (m_dwStyle, rc,
this, IDC_CALENDAR_CALENDAR);
if (m_dwStyle & MCS_MULTISELECT)
m_ctlCalendar.SetSelRange (dateStart, dateStart);
else
m_ctlCalendar.SetCurSel (dateStart);
ShowDates (dateStart, dateEnd);
m_ctlCalendar.SetFirstDayOfWeek (m_nFirstWeekDay == 0 ? 6 : (m_nFirstWeekDay - 1));
m_ctlCalendar.SizeMinReq(TRUE);
}
void CCalendarDlg::OnSelchangeFirstWeekDay()
{
UpdateData (TRUE);
int nWeekDay = m_nFirstWeekDay;
if (nWeekDay == 0)
nWeekDay = 0;
--nWeekDay;
if (nWeekDay < 0)
return;
m_ctlCalendar.SetFirstDayOfWeek (nWeekDay);
m_ctlCalendar.SetFocus();
}
void CCalendarDlg::OnChangeCalendarDelta()
{
UpdateData (TRUE);
m_ctlCalendar.SetMonthDelta (m_nMonthDelta);
}
void CCalendarDlg::SetDayStateBits(MONTHDAYSTATE &month, int nCount, ...)
{
va_list va;
int i;
int count;
va_start (va, nCount);
for (count = 0; count < nCount; ++count)
{
i = va_arg(va, int);
if (i < 32)
month |= 1 << (i - 1);
}
va_end (va);
}
BOOL CCalendarDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR *pNMHDR = (NMHDR *) lParam;
if (pNMHDR->idFrom == IDC_CALENDAR_CALENDAR)
{
NMSELCHANGE *nmDT = (NMSELCHANGE *) pNMHDR;
switch (nmDT->nmhdr.code)
{
case MCN_SELCHANGE:
break;
{
CTime selStart (nmDT->stSelStart);
CTime selEnd (nmDT->stSelEnd);
ShowDates (selStart, selEnd);
}
if (!(m_ctlCalendar.GetStyle() & MCS_DAYSTATE))
{
// m_ctlCalendar.ModifyStyle (MCS_DAYSTATE, 0, TRUE);
m_ctlCalendar.ModifyStyle (0, MCS_DAYSTATE, TRUE);
}
break;
case MCN_SELECT:
{
//
// Handle any day selection processing here.
//
}
break;
case MCN_GETDAYSTATE:
break;
{
NMDAYSTATE* pDayState = (NMDAYSTATE *)pNMHDR;
MONTHDAYSTATE pState[3];
SYSTEMTIME st;
if (m_ctlCalendar.GetStyle() & MCS_MULTISELECT)
{
CTime timeStart, timeEnd;
m_ctlCalendar.GetSelRange (timeStart, timeEnd);
st.wYear = timeStart.GetYear();
st.wMonth = timeStart.GetMonth ();
}
else
m_ctlCalendar.GetCurSel (&st);
CTime Now = CTime::GetCurrentTime ();
if (st.wYear != Now.GetYear())
{
pState[0] = pState[1] = pState[2] = 0;
pDayState->prgDayState = pState;
break;
}
for(int i = 0; i < pDayState->cDayState; ++i)
{
if (i > 2)
break;
pState[i] = 0;
switch (i)
{
case 0:
SetDayStateBits (pState[i], 3, 2, 12, 18);
break;
case 1:
SetDayStateBits (pState[i], 3, 4, 16, 28);
break;
case 2:
SetDayStateBits (pState[i], 3, 1, 8, 28);
break;
}
}
pDayState->prgDayState = pState;
}
break;
}
}
BOOL bResult = CPropertyPage::OnNotify(wParam, lParam, pResult);
return (bResult);
}
void CCalendarDlg::ShowDates(CTime &timeStart, CTime &timeEnd)
{
CString strStart, strEnd;
bool bMultisel = (m_ctlCalendar.GetStyle() & MCS_MULTISELECT)
? true : false;
strStart.Format ("%sSelection: %s %s %d, %04d",
bMultisel ? "Begin " : "",
szDays[timeStart.GetDayOfWeek() - 1],
szMonths[timeStart.GetMonth() - 1],
timeStart.GetDay(), timeStart.GetYear());
if (bMultisel)
{
strEnd.Format ("End Selection: %s %s %d, %04d",
szDays[timeEnd.GetDayOfWeek() - 1],
szMonths[timeEnd.GetMonth() - 1],
timeEnd.GetDay(), timeEnd.GetYear());
}
else
strEnd = _T("");
::SetWindowText (
GetDlgItem(IDC_CALENDAR_SELBEGIN)->m_hWnd,
(LPCSTR) strStart);
::SetWindowText (
GetDlgItem(IDC_CALENDAR_SELEND)->m_hWnd,
(LPCSTR) strEnd);
}
void CCalendarDlg::OnGetdaystateCalendarCalendar(NMHDR* pNMHDR, LRESULT* pResult)
{
NMDAYSTATE* pDayState = (NMDAYSTATE *)pNMHDR;
MONTHDAYSTATE pState[3] = {0, 0, 0};
INT i;
SYSTEMTIME st;
if (m_ctlCalendar.GetStyle() & MCS_MULTISELECT)
{
CTime timeStart, timeEnd;
m_ctlCalendar.GetSelRange (timeStart, timeEnd);
st.wYear = timeStart.GetYear();
st.wMonth = timeStart.GetMonth ();
}
else
m_ctlCalendar.GetCurSel (&st);
CTime Now = CTime::GetCurrentTime ();
if (st.wYear != Now.GetYear())
{
pState[0] = pState[1] = pState[2] = 0;
pDayState->prgDayState = pState;
*pResult = 0;
return;
}
for(i=0; i < pDayState->cDayState; i++)
{
if (i > 2)
break;
switch (i)
{
case 0:
SetDayStateBits (pState[i], 3, 26, 28, 30);
break;
case 1:
SetDayStateBits (pState[i], 3, 4, 16, 28);
break;
case 2:
SetDayStateBits (pState[i], 3, 1, 3, 28);
break;
}
}
pDayState->prgDayState = pState;
*pResult = 0;
}
void CCalendarDlg::OnSelchangeCalendarCalendar(NMHDR* pNMHDR, LRESULT* pResult)
{
NMSELCHANGE *nmDT = (NMSELCHANGE *) pNMHDR;
CTime selStart (nmDT->stSelStart);
CTime selEnd (nmDT->stSelEnd);
ShowDates (selStart, selEnd);
if (!(m_ctlCalendar.GetStyle() & MCS_DAYSTATE))
{
m_ctlCalendar.ModifyStyle (MCS_DAYSTATE, 0, TRUE);
m_ctlCalendar.ModifyStyle (0, MCS_DAYSTATE, TRUE);
}
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -