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

📄 calcborndlg.cpp

📁 预产期的计算
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////
// CalcBornDlg.cpp : implementation file
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CalcBorn.h"
#include "CalcBornDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////

CSysCfgAuto SysCfg;									// 自动配置对象

// 明文(字符串):"坤宁小宝宝成长咨讯"=一般加密
static const BYTE TCSY_MAIN_TITLE[] =
{
	0x65, 0x01, 0x61, 0x5B, 0x75, 0x04, 0x14, 0x03, 0x14, 0x03,
	0x16, 0x6C, 0x16, 0x01, 0x72, 0x6C, 0x74, 0x13, 0xA5
};

/////////////////////////////////////////////////////////////////////////////
// CCalcBornDlg dialog

// 构造函数
CCalcBornDlg::CCalcBornDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCalcBornDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCalcBornDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_posLast = -1;
}

// 析构函数
CCalcBornDlg::~CCalcBornDlg()
{
}

// 数据交换
void CCalcBornDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCalcBornDlg)
	DDX_Control(pDX, IDC_DATE_CUR, m_DateCur);
	DDX_Control(pDX, IDC_SLIDER_DAYS, m_SliderDays);
	DDX_Control(pDX, IDC_DATE_END, m_DateEnd);
	DDX_Control(pDX, IDC_DATE_BGN, m_DateBgn);
	//}}AFX_DATA_MAP
}

// 消息映射
BEGIN_MESSAGE_MAP(CCalcBornDlg, CDialog)
	//{{AFX_MSG_MAP(CCalcBornDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_LBUTTONDOWN()
	ON_WM_CTLCOLOR()
	ON_WM_HELPINFO()
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE_BGN, OnDatetimechangeDateBgn)
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE_CUR, OnDatetimechangeDateCur)
	ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE_END, OnDatetimechangeDateEnd)
	ON_CBN_SELCHANGE(IDC_NEED_MONTH, OnSelchangeNeedMonth)
	ON_CBN_SELCHANGE(IDC_NEED_WEEK, OnSelchangeNeedWeek)
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER_DAYS, OnCustomdrawSliderDays)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalcBornDlg message handlers

// 设置系统主标题栏,加密的,有置标志
void CCalcBornDlg::SetMainTitle(void)
{
	char chTitle[sizeof(TCSY_MAIN_TITLE)];
	CryptXOR(chTitle, TCSY_MAIN_TITLE, sizeof(TCSY_MAIN_TITLE));
	CString sTitle; SYSTEMTIME tm; GetSckLocalTime(&tm);
	sTitle.Format("%s - [%s] - [%04d.%02d.%02d %s] %s", chTitle,
		SYS_UPD_DATE, tm.wYear, tm.wMonth, tm.wDay,
		MyZnnWeek[tm.wDayOfWeek], SysCfg.m_bAlwaysOnTop ? "*" : "");
	SetWindowText(sTitle); // 主窗口标题
}

// 设置主窗体始终位于其它窗体的最上方
void CCalcBornDlg::SetMainWndTopMost(void)
{
	SetWindowPos(SysCfg.m_bAlwaysOnTop ? &CWnd::wndTopMost :
		&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
	SetMainTitle(); // 更新窗口标题中的置顶标记
	CMenu *pSysMenu = GetSystemMenu(FALSE);
	if(pSysMenu == NULL) return; // Always Top 置顶
	UINT nFlags =  SysCfg.m_bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED;
	pSysMenu->CheckMenuItem(IDM_ALWAYTOP, MF_BYCOMMAND | nFlags);
}

// 系统菜单命令响应
void CCalcBornDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		ShowAboutDialog();
	}
	else if ((nID & 0xFFF0) == IDM_ALWAYTOP)
	{
		SysCfg.m_bAlwaysOnTop = !SysCfg.m_bAlwaysOnTop;
		SetMainWndTopMost(); // 主窗体置顶
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
void CCalcBornDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting
		
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;
		
		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCalcBornDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

// 用户按下“确认”按钮
void CCalcBornDlg::OnOK() 
{
//	CDialog::OnOK();
}

// 点击左键,可以移动窗体
void CCalcBornDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
	SetCursor(LoadCursor(NULL, IDC_SIZEALL));
	PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}

// 改变对话框的背景色(淡蓝色)
HBRUSH CCalcBornDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	static CBrush bckBrush(RGB(0xA5, 0xCB, 0xF7));
	if(nCtlColor == CTLCOLOR_DLG)
		return ((HBRUSH)bckBrush.GetSafeHandle());
	else return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

// 取消对话框的F1键的默认响应,查找帮助文件
BOOL CCalcBornDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	// TODO: Add your message handler code here and/or call default
	return (TRUE);
//	return CDialog::OnHelpInfo(pHelpInfo);
}

/////////////////////////////////////////////////////////////////////////////

// 设置指定列表框ComboBox的当前所选择值
void CCalcBornDlg::SetCombo(int nID, int nSlct)
{
	CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
	if(pBox) pBox->SetCurSel(nSlct);
}

// 获取指定列表框的当前选择是某列(0起始)
int CCalcBornDlg::GetCombo(int nID)
{
	CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
	if(!pBox) return (0); return (pBox->GetCurSel());
}

// 设置单选按钮的值(Check Box)
void CCalcBornDlg::SetCheck(int nID, int nChk)
{
	CButton *pButt = (CButton *)GetDlgItem(nID);
	if(pButt) pButt->SetCheck(nChk);
}

// 获取单选按钮的值(Check Box)
int CCalcBornDlg::GetCheck(int nID)
{
	CButton *pButt = (CButton *)GetDlgItem(nID);
	if(!pButt) return (0); return (pButt->GetCheck());
}

// 通用信息输出:子窗口ID,信息字符串,仿sprintf方式
void CCalcBornDlg::MsgOut(int nID, LPCTSTR chInfor, ...)
{
	CString sInfor = "";
	if(chInfor && chInfor[0])
	{
		va_list argptr;
		va_start(argptr, chInfor);
		sInfor.FormatV(chInfor, argptr);
		va_end(argptr);
	}
	SetDlgItemText(nID, sInfor);
}

// 显示关于对话框有帮助信息,已初始化的EDIT显示和隐藏
void CCalcBornDlg::ShowAboutDialog(void)
{
	CAboutDlg dlgAbout;
	dlgAbout.m_sHelps = 
		"	 本工具帮助信息公告栏(Ctrl+H,Ctrl+/)\r\n\r\n"
		"----- 常用的快捷键及功能简述 -------------------------\r\n\r\n";
	dlgAbout.DoModal();
}

/////////////////////////////////////////////////////////////////////////////

// 用户按下“取消”按钮
void CCalcBornDlg::OnCancel() 
{
	ReadWndRect(SysCfg.m_rcMainDlg, this);
	m_DateBgn.GetTime(&SysCfg.m_BgnDate);
	CDialog::OnCancel();
}

// 初始化对话框
BOOL CCalcBornDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);
	
	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
		UINT nFlags = SysCfg.m_bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED;
		pSysMenu->AppendMenu(MF_STRING | nFlags, IDM_ALWAYTOP, "Always On &Top (置顶)");
	}
	
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	SetMainWndTopMost(); // 设置主标题及窗口置顶
	WritWndRect(SysCfg.m_rcMainDlg, this); // 主窗口位置
	
	m_SliderDays.SetRange(1, BORN_DAYS, TRUE);
	m_DateBgn.SetTime(&SysCfg.m_BgnDate); // 上次开始日期
	
	SYSTEMTIME tm; GetSckLocalTime(&tm);
	m_DateCur.SetTime(&tm); // 系统当前日期
	OnDatetimechangeDateBgn(0, 0);
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

/////////////////////////////////////////////////////////////////////////////

// 预处理分发消息(主要是按键事件)
BOOL CCalcBornDlg::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYDOWN)
	{
		BOOL bCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0;
		BOOL bShft = (GetKeyState(VK_SHIFT) & 0x8000) != 0;
		WORD wKey = (WORD)pMsg->wParam;
		
		switch(wKey)
		{
		case 'H': case 0xBF: /* 显示帮助信息 */
			if(!bCtrl) break;
			ShowAboutDialog(); return (TRUE);
			break;
		
		case VK_ESCAPE: /* ESC键的处理 */
			return (TRUE);
			break;
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}

/////////////////////////////////////////////////////////////////////////////

// 选择-开始日期
void CCalcBornDlg::OnDatetimechangeDateBgn(NMHDR* pNMHDR, LRESULT* pResult) 
{
	if(pResult) *pResult = 0;
	
	// 获取怀孕开始,及结束日期
	CTime bgnTm, endTm;
	m_DateBgn.GetTime(bgnTm);
	
	if(bgnTm == m_bgnLast) return;
	m_bgnLast = bgnTm;
	
	CTimeSpan ts(BORN_DAYS - 1, 0, 0, 0);
	endTm = bgnTm + ts;
	
	// 设置当前日期的工作范围,并给定预产日期
	m_DateCur.SetRange(&bgnTm, &endTm);
	m_DateEnd.SetTime(&endTm);
	OnDatetimechangeDateCur(0, 0);
}

// 选择-预产日期
void CCalcBornDlg::OnDatetimechangeDateEnd(NMHDR* pNMHDR, LRESULT* pResult) 
{
	if(pResult) *pResult = 0;
	
	// 获取怀孕结束,及开始日期
	CTime bgnTm, endTm;
	m_DateEnd.GetTime(endTm);
	
	if(endTm == m_endLast) return;
	m_endLast = endTm;
	
	CTimeSpan ts(BORN_DAYS - 1, 0, 0, 0);
	bgnTm = endTm - ts;
	
	// 设置当前日期的工作范围,并给定开始日期
	m_DateCur.SetRange(&bgnTm, &endTm);
	m_DateBgn.SetTime(&bgnTm);
	OnDatetimechangeDateCur(0, 0);
}

// 选择-当前日期
void CCalcBornDlg::OnDatetimechangeDateCur(NMHDR* pNMHDR, LRESULT* pResult) 
{
	if(pResult) *pResult = 0;
	
	// 获取开始,及当前日期
	CTime bgnTm, curTm;
	m_DateBgn.GetTime(bgnTm);
	m_DateCur.GetTime(curTm);
	
	if(pNMHDR && pResult && curTm == m_curLast) return;
	m_curLast = curTm;
	
	// 计算已经使用的天数并更新显示
	CTimeSpan ts = curTm - bgnTm;
	SetShowByDays(ts.GetDays() + 1);
}

/////////////////////////////////////////////////////////////////////////////

// 选择-已用天数
void CCalcBornDlg::OnCustomdrawSliderDays(NMHDR* pNMHDR, LRESULT* pResult) 
{
	if(pResult) *pResult = 0;
	int nPos = m_SliderDays.GetPos();
	if(nPos == m_posLast) return;
	m_posLast = nPos;
	SetShowByDays(m_posLast);
}

// 选择-已用孕月
void CCalcBornDlg::OnSelchangeNeedMonth() 
{
	SetShowByDays(GetCombo(IDC_NEED_MONTH) * BORN_MONTH_DAYS + 1);
}

// 选择-已用孕周
void CCalcBornDlg::OnSelchangeNeedWeek() 
{
	SetShowByDays(GetCombo(IDC_NEED_WEEK) * BORN_WEEK_DAYS + 1);
}

/////////////////////////////////////////////////////////////////////////////

// 自定义获取当前系统的时间:时分秒毫秒4项清零
void GetSckLocalTime(LPSYSTEMTIME lpSystemTime)
{
	if(!lpSystemTime) return;
	GetLocalTime(lpSystemTime);
	lpSystemTime->wHour = 0;
	lpSystemTime->wMinute = 0;
	lpSystemTime->wSecond = 0;
	lpSystemTime->wMilliseconds = 0;
}

// 由当前的已经过的天数[1, 280],设置显示诸元
void CCalcBornDlg::SetShowByDays(int nDays)
{
	// 如果给定的已过天数不合理,则修正它
	if(nDays < 1) nDays = 1;
	else if(nDays > BORN_DAYS) nDays = BORN_DAYS;
	
	// 获取开始日期,并计算当前日期
	CTime tm; m_DateBgn.GetTime(tm);
	CTimeSpan ts(nDays - 1, 0, 0, 0);
	tm += ts; m_DateCur.SetTime(&tm);
	
	// 当前天数、孕月、孕周等
	m_SliderDays.SetPos(nDays);
	SetCombo(IDC_NEED_MONTH, nDays / BORN_MONTH_DAYS);
	SetCombo(IDC_NEED_WEEK, nDays / BORN_WEEK_DAYS);
	SetDlgItemInt(IDC_NEED_DAYS, nDays);
	
	// 孕月余天数、孕周余天数、剩余天数等
	SetDlgItemInt(IDC_REMN_MONTH, nDays % BORN_MONTH_DAYS);
	SetDlgItemInt(IDC_REMN_WEEK, nDays % BORN_WEEK_DAYS);
	SetDlgItemInt(IDC_REMN_DAYS, BORN_DAYS - nDays);
}

/////////////////////////////////////////////////////////////////////////////
// The end of this file.

⌨️ 快捷键说明

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