MFC計算器項目——日期計算模塊

計算器日期計算模塊(運行效果圖參見計算器項目綜述

主要實現兩個功能(與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();
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章