⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calendardlg.cpp

📁 VC源代码大全(精华版)
💻 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 + -