計算器日期計算模塊(運行效果圖參見計算器項目綜述)
主要實現兩個功能(與windows計算器中的日期計算功能一致)
1.給定兩個時間,計算日期差
2.給出基礎時間和時間差,計算目標時間
該模塊開發文檔截圖
核心代碼如下:
// MyDlg_1.cpp : implementation file
//
#include "stdafx.h"
#include "簡化調試.h"
//#include "MyDlg_1.h"
#include "cstdlib"
#include "簡化調試Dlg.h"
#include "MyDlg_1.h"
#include "MyDlg_2.h"
#include "MyDlg_3.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int y,m,d,ny,nm,nd;
/////////////////////////////////////////////////////////////////////////////
// CMyDlg_1 dialog
CMyDlg_1::CMyDlg_1(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg_1::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg_1)
m_time1 = 0;
m_time2 = 0;
m_difference = 0;
m_strdiff = _T("");
m_strtime = _T("");
m_gap = 0;
m_time3 = 0;
//}}AFX_DATA_INIT
}
void CMyDlg_1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg_1)
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_time1);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER2, m_time2);
DDX_Text(pDX, IDC_EDIT2, m_difference);
DDX_Text(pDX, IDC_EDIT1, m_strdiff);
DDX_Text(pDX, IDC_EDIT4, m_strtime);
DDX_Text(pDX, IDC_EDIT3, m_gap);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER3, m_time3);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg_1, CDialog)
//{{AFX_MSG_MAP(CMyDlg_1)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_COMMAND(ID_MENUITEM1, OnMenuitem1)
ON_COMMAND(ID_MENUITEM0, OnMenuitem0)
ON_COMMAND(ID_MENUITEM2, OnMenuitem2)
ON_COMMAND(ID_MENUITEM3, OnMenuitem3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg_1 message handlers
void CMyDlg_1::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData();
months[2] = 28;
y = m_time1.GetYear();
m = m_time1.GetMonth();
d = m_time1.GetDay();
int days1 = caldays(y,m,d);
y= m_time2.GetYear();
m = m_time2.GetMonth();
d = m_time2.GetDay();
int days2 = caldays(y,m,d);
m_difference = abs(days2-days1);
int weeks = m_difference / 7;
int days = m_difference % 7 ;
m_strdiff.Format("%d周 %d天",weeks,days);
UpdateData(FALSE);
}
int CMyDlg_1::caldays(int y, int m, int d)
{
int days=1;
int year=1,month=1,day=1;
months[2] = 28;
while(1)
{
if(isleap(year))//判斷閏年
months[2]=29;
else
months[2]=28;
if(year==y&&month==m&&day==d)
break; //達到日期
days++;day++;
if(day==months[month])
{
if(year==y&&month==m&&day==d)
break;
day=1;days++;
month++;
if(month==13)
{
month=1;
year++;
}
}
}
return days;
}
bool CMyDlg_1::isleap(int year)
{
if(year%400==0 || (year%4==0 && year%100!=0))
return 1;
return 0;
}
void CMyDlg_1::OnButton2()
{
// TODO: Add your control notification handler code here
UpdateData();
months[2] = 28;
y = m_time3.GetYear();
m = m_time3.GetMonth();
d = m_time3.GetDay();
result(caldays(y,m,d)+m_gap);
m_strtime.Format("%d年 %d月 %d日",ny,nm,nd);
UpdateData(FALSE);
}
void CMyDlg_1::result(int day)
{
ny = nm = 1;
nd = 0;
months[2] = 28;
while(day>365 + isleap(ny))
{
day-=(365+isleap(ny));
ny++;
}
if(isleap(ny))
months[2] = 29;
while(day>months[nm])
{
day-=months[nm];
nm++;
}
nd = day;
}
void CMyDlg_1::OnMenuitem1()
{
// TODO: Add your command handler code here
MessageBox("您已處於日期計算模式!");
}
void CMyDlg_1::OnMenuitem0()
{
// TODO: Add your command handler code here
CMyDlg_1::OnCancel();
CMyDlg dlg;
dlg.DoModal();
}
void CMyDlg_1::OnMenuitem2()
{
// TODO: Add your command handler code here
CMyDlg_1::OnCancel();
CMyDlg_2 dlg;
dlg.DoModal();
}
void CMyDlg_1::OnMenuitem3()
{
// TODO: Add your command handler code here
CMyDlg_1::OnCancel();
CMyDlg_3 dlg;
dlg.DoModal();
}