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

📄 calendarview.cpp

📁 女性安全期计算(VC版) 里面利用了来自cODEpROJECT的关于ppToolTip,CreditsCtrl,HighTime等有关的应用。
💻 CPP
字号:
// CalendarView.cpp : 实现文件
//

#include "stdafx.h"
#include "CalendarView.h"
#include "HighTime.h"


// CCalendarView

IMPLEMENT_DYNAMIC(CCalendarView, CWnd)

CCalendarView::CCalendarView()
: m_bShowTip(FALSE)
{
	SYSTEMTIME systime;
	::GetSystemTime(&systime);

	m_iYear  = systime.wYear;
	m_iMonth = systime.wMonth;
	m_iDay   = systime.wDay;

	m_iMin=28;

	m_colorBack=RGB(255,255,255);

	m_dwBackColor      = RGB(255,255,255);
	m_dwForeColor      = RGB(0,0,0);
	m_dwSelColor       = RGB(150,150,230);
	m_dwSelForeColor   = RGB(255,255,255);
	m_dwTitleBkColor     = RGB(0,0,255);
	m_dwTitleColor = RGB(255,255,255);
	
	m_crSafeDay	= RGB(0,153,51);
	m_crDangerousDay	= RGB(255,51,0);
	m_crMensesDay	= RGB(255,204,0);

	m_Font.CreatePointFont(96,_T("宋体"));

}

CCalendarView::~CCalendarView()
{
	while (!m_dayList1.IsEmpty())
	{
		CCalendarDay* pDay = m_dayList1.GetTail();
		ASSERT(pDay);
		delete pDay;
		m_dayList1.RemoveTail();

	}
	while (!m_dayList2.IsEmpty())
	{
		CCalendarDay* pDay = m_dayList2.GetTail();
		ASSERT(pDay);
		delete pDay;
		m_dayList2.RemoveTail();

	}
}


BEGIN_MESSAGE_MAP(CCalendarView, CWnd)
	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_ENTERIDLE()
END_MESSAGE_MAP()



// CCalendarView 消息处理程序



BOOL CCalendarView::OnEraseBkgnd(CDC* pDC)
{
	CRect rc;
	pDC->GetClipBox(rc);

	CBrush brBack(m_colorBack);
	CBrush* pOldBrush = pDC->SelectObject(&brBack);
	pDC->PatBlt(rc.left, rc.top, rc.Width(), rc.Height(), PATCOPY);	
	pDC->SelectObject(pOldBrush);

	//CRect rect ;
	//GetClientRect(&rect);
	//CPen pPen(PS_SOLID,1,RGB(102,102,102));
	//CPen* pOldPen = pDC ->SelectObject(&pPen);
	//pDC->MoveTo(rect.left+rect.Width()/2,rect.top);
	//pDC->LineTo(rect.left+rect.Width()/2,rect.bottom);
	//pDC->SelectObject(pOldPen);
	return TRUE;
}

void CCalendarView::OnPaint()
{
	CPaintDC dc(this); // device context for painting

	dc.SetBkMode(TRANSPARENT);
	CFont *pFont = dc.SelectObject(&m_Font);
	CRect rect ;
	GetClientRect(&rect);

	rect.right=rect.left+rect.Width()/2;
	rect.left ++;   rect.top ++;
	rect.right --;  rect.bottom = rect.top + 16;
	dc.FillRect(&rect, &CBrush(m_dwTitleBkColor));

	GetClientRect(&rect);
	rect.left=rect.left+rect.Width()/2;
	rect.left ++;   rect.top ++;
	rect.right --;  rect.bottom = rect.top + 16;
	dc.FillRect(&rect, &CBrush(m_dwTitleBkColor));

	dc.SetBkColor(m_dwTitleBkColor); 
	dc.SetTextColor(m_dwTitleColor); 

	GetClientRect(&rect);
	rect.left ++;   rect.top ++;
	rect.right =rect.left + 24;
	rect.bottom = rect.top + 16;

	int startx = rect.left +8;
	TCHAR sztext[][3]={_T("日"),_T("一"),_T("二"),_T("三"),_T("四"),_T("五"),_T("六")};
	for(int i=0; i <7; i++)
	{
		dc.DrawText(sztext[i],rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		rect.left += 24;
		rect.right += 24;
	}
	GetClientRect(&rect);
	rect.left=rect.left+rect.Width()/2;
	rect.left ++;   
	rect.top ++;
	rect.right =rect.left + 24;
	rect.bottom = rect.top + 16;

	for(int i=0; i <7; i++)
	{
		dc.DrawText(sztext[i],rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		rect.left += 24;
		rect.right += 24;
	}

	GetClientRect(&rect);
	rect.top+=16;
	rect.right=rect.left+rect.Width()/2;
	rect.left ++;   rect.top ++;
	rect.right --;  rect.bottom = rect.top + 120;
	CFont m_mFont;
	m_mFont.CreatePointFont(768,_T("宋体"));
	dc.SelectObject(&m_mFont);
	dc.SetTextColor(RGB(232,232,222) );
	TCHAR cBuff[5];
	_stprintf(cBuff,_T("%d"),m_iMonth);
	dc.DrawText(cBuff, rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	GetClientRect(&rect);
	rect.top+=16;
	rect.left=rect.left+rect.Width()/2;
	rect.left ++;   rect.top ++;
	rect.right --;  rect.bottom = rect.top + 120;
	_stprintf(cBuff,_T("%d"),m_iMonth+1);
	dc.DrawText(cBuff, rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	dc.SetTextColor(RGB(0,0,0) );
	dc.SelectObject(&m_Font);
	POSITION pos = m_dayList1.GetHeadPosition();
	while (pos)
	{
		CCalendarDay* pDay = m_dayList1.GetNext(pos);

		ASSERT(pDay);
		switch(pDay->m_nType)
		{
		case 0:
			dc.SetTextColor(m_crSafeDay );
			break;
		case 1:
			dc.SetTextColor(m_crMensesDay );
			break;
		case 2:
			dc.SetTextColor(m_crDangerousDay );
			break;
		case 3:
			dc.SetTextColor(RGB(0,0,0) );
			break;
		}

		pDay->DrawItem(&dc);

	}

	pos = m_dayList2.GetHeadPosition();
	while (pos)
	{
		CCalendarDay* pDay = m_dayList2.GetNext(pos);

		ASSERT(pDay);
		switch(pDay->m_nType)
		{
		case 0:
			dc.SetTextColor(m_crSafeDay );
			break;
		case 1:
			dc.SetTextColor(m_crMensesDay );
			break;
		case 2:
			dc.SetTextColor(m_crDangerousDay );
			break;
		case 3:
			dc.SetTextColor(RGB(0,0,0) );
			break;
		}

		pDay->DrawItem(&dc);

	}
	dc.SetTextColor(RGB(0,0,0) );
	dc.SelectObject(pFont);
}

int CCalendarView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	InitData();
	m_tooltip.Create(this);
	m_tooltip.SetNotify();
	return 0;
}

BOOL CCalendarView::PreTranslateMessage(MSG* pMsg)
{
	m_tooltip.RelayEvent(pMsg);

	return CWnd::PreTranslateMessage(pMsg);
}

void CCalendarView::OnEnterIdle(UINT nWhy, CWnd* pWho)
{
	CWnd::OnEnterIdle(nWhy, pWho);

	m_tooltip.OnEnterIdle(nWhy, pWho);
}

void CCalendarView::SetDate(int iYear, int iMonth, int iDay)
{
	m_iYear=iYear;
	m_iMonth=iMonth;
	m_iDay=iDay;
}

void CCalendarView::Show(bool bShowTip)
{
	m_bShowTip=bShowTip;
	InitData();
	Invalidate();
}

void CCalendarView::InitData(void)
{
	while (!m_dayList1.IsEmpty())
	{
		CCalendarDay* pDay = m_dayList1.GetTail();
		ASSERT(pDay);
		delete pDay;
		m_dayList1.RemoveTail();

	}
	while (!m_dayList2.IsEmpty())
	{
		CCalendarDay* pDay = m_dayList2.GetTail();
		ASSERT(pDay);
		delete pDay;
		m_dayList2.RemoveTail();

	}
	m_tooltip.RemoveAllTools();

	int nXPos=1;
	int nYPos=1;
	int m_nCharWidth=24;
	int m_nCharHeight=20;
	// Now create buttons
	CRect rcDay;
	int n;
 
	CHighTime	tmFirstDay(m_iYear,m_iMonth,1,0,0,0);
	INT		nDay	= tmFirstDay.GetDayOfWeek();
	INT		nMonth  = m_iMonth;
	INT		nYear	= m_iYear;

	CHighTimeSpan tmSpan(1,0,0,0);
	CHighTimeSpan tmSpan2((m_iMin)*2,0,0,0);
	CHighTime tmLast(m_iYear,m_iMonth,m_iDay,0,0,0);
	tmLast=tmLast-tmSpan2;
	tmSpan2.SetHighTimeSpan(nDay-1,0,0,0);
	CHighTime tmDays;
	tmDays=tmFirstDay-tmSpan2;
	int nDays;

	// Check for leap year 
	if( (nYear % 400) == 0 || ((nYear % 4) == 0 && (nYear % 100) !=0))
		nMonthDays[1] = 29;

	CString sTip; 
	for ( n=0;n < glbBtns;n++)
	{
		if (!(n % 7))
		{
			nXPos=1;
			nYPos+=m_nCharHeight;
		}

		rcDay.left		= nXPos;
		rcDay.top		= nYPos;
		rcDay.right		= rcDay.left + m_nCharWidth;
		rcDay.bottom	= rcDay.top + m_nCharHeight;

		tmSpan2=tmDays-tmLast;
		nDays=tmSpan2.GetDays()%m_iMin;
		if(tmDays.GetMonth()==m_iMonth)
		{
			CCalendarDay* pNew = new CCalendarDay(rcDay);
			if(m_bShowTip)
			{
				if(nDays>=0 &&nDays<=4)
				{
					pNew->SetDay(tmDays.GetDay(),1,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是月经期,要注意经期卫生,当然也要“节欲”,避免性事哦!");
				}
				else if(nDays>=5 &&nDays<=m_iMin-20)
				{
					pNew->SetDay(tmDays.GetDay(),0,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是安全期,性事一般不会受孕,您放心吧!");
				}
				else if(nDays>=m_iMin-19 &&nDays<=m_iMin-10)
				{
					pNew->SetDay(tmDays.GetDay(),2,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是危险期,亦称排卵期,性事受孕可能性大,千万要注意哦!");
				}
				else if(nDays>=m_iMin-9 &&nDays<=m_iMin-1)
				{
					pNew->SetDay(tmDays.GetDay(),0,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是安全期,性事一般不会受孕,您放心吧!");
				}
			}
			else
			{
				pNew->SetDay(tmDays.GetDay(),3,TRUE);
				sTip.Format(_T("<center><h2>提示</h2><br><hr color=blue></center><br><font color=red>%d年%d月%d日</font>"),tmDays.GetYear(),tmDays.GetMonth(),tmDays.GetDay());
			}				
			m_tooltip.AddTool(this, sTip, rcDay);
			m_dayList1.AddTail(pNew);
		}


		tmDays=tmDays+tmSpan;
		nXPos += m_nCharWidth;
	}
	CRect rect ;
	GetClientRect(&rect);
	nXPos=rect.left+rect.Width()/2 + 1;
	nYPos=1;
	nMonth++;
	tmFirstDay.SetDate(m_iYear,m_iMonth+1,1);
	nDay	= tmFirstDay.GetDayOfWeek();
	tmSpan2.SetHighTimeSpan(nDay-1,0,0,0);
	tmDays=tmFirstDay-tmSpan2;
	for ( n=0;n < glbBtns;n++)
	{
		if (!(n % 7))
		{
			nXPos=rect.left+rect.Width()/2 + 1;
			nYPos+=m_nCharHeight;
		}

		rcDay.left		= nXPos;
		rcDay.top		= nYPos;
		rcDay.right		= rcDay.left + m_nCharWidth;
		rcDay.bottom	= rcDay.top + m_nCharHeight;

		CCalendarDay* pNew = new CCalendarDay(rcDay);
		tmSpan2=tmDays-tmLast;
		nDays=tmSpan2.GetDays()%m_iMin;
		if(tmDays.GetMonth()==m_iMonth+1)
		{
			CCalendarDay* pNew = new CCalendarDay(rcDay);
			if(m_bShowTip)
			{
				if(nDays>=0 &&nDays<=4)
				{
					pNew->SetDay(tmDays.GetDay(),1,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是月经期,要注意经期卫生,当然也要“节欲”,避免性事哦!");
				}
				else if(nDays>=5 &&nDays<=m_iMin-20)
				{
					pNew->SetDay(tmDays.GetDay(),0,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是安全期,性事一般不会受孕,您放心吧!");
				}
				else if(nDays>=m_iMin-19 &&nDays<=m_iMin-10)
				{
					pNew->SetDay(tmDays.GetDay(),2,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是危险期,亦称排卵期,性事受孕可能性大,千万要注意哦!");
				}
				else if(nDays>=m_iMin-9 &&nDays<=m_iMin-1)
				{
					pNew->SetDay(tmDays.GetDay(),0,TRUE);
					sTip=_T("<center><h2>提示</h2><br><hr color=blue></center><br>这是安全期,性事一般不会受孕,您放心吧!");
				}
			}
			else
			{
				pNew->SetDay(tmDays.GetDay(),3,TRUE);
				sTip.Format(_T("<center><h2>提示</h2><br><hr color=blue></center><br><font color=red>%d年%d月%d日</font>"),tmDays.GetYear(),tmDays.GetMonth(),tmDays.GetDay());
			}				
			m_tooltip.AddTool(this, sTip, rcDay);
			m_dayList1.AddTail(pNew);
		}

		m_dayList2.AddTail(pNew);

		tmDays=tmDays+tmSpan;
		nXPos += m_nCharWidth;
	}
	nMonthDays[1] = 28;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -