📄 calendarview.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 + -