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