?? 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
// 構(gòu)造函數(shù)
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;
}
// 析構(gòu)函數(shù)
CCalcBornDlg::~CCalcBornDlg()
{
}
// 數(shù)據(jù)交換
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
// 設(shè)置系統(tǒng)主標(biāo)題欄,加密的,有置標(biāo)志
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); // 主窗口標(biāo)題
}
// 設(shè)置主窗體始終位于其它窗體的最上方
void CCalcBornDlg::SetMainWndTopMost(void)
{
SetWindowPos(SysCfg.m_bAlwaysOnTop ? &CWnd::wndTopMost :
&CWnd::wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetMainTitle(); // 更新窗口標(biāo)題中的置頂標(biāo)記
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);
}
// 系統(tǒng)菜單命令響應(yīng)
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;
}
// 用戶按下“確認(rèn)”按鈕
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));
}
// 改變對話框的背景色(淡藍(lán)色)
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鍵的默認(rèn)響應(yīng),查找?guī)椭募?BOOL CCalcBornDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
// TODO: Add your message handler code here and/or call default
return (TRUE);
// return CDialog::OnHelpInfo(pHelpInfo);
}
/////////////////////////////////////////////////////////////////////////////
// 設(shè)置指定列表框ComboBox的當(dāng)前所選擇值
void CCalcBornDlg::SetCombo(int nID, int nSlct)
{
CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
if(pBox) pBox->SetCurSel(nSlct);
}
// 獲取指定列表框的當(dāng)前選擇是某列(0起始)
int CCalcBornDlg::GetCombo(int nID)
{
CComboBox *pBox = (CComboBox *)GetDlgItem(nID);
if(!pBox) return (0); return (pBox->GetCurSel());
}
// 設(shè)置單選按鈕的值(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);
}
// 顯示關(guān)于對話框有幫助信息,已初始化的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(); // 設(shè)置主標(biāo)題及窗口置頂
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); // 系統(tǒng)當(dāng)前日期
OnDatetimechangeDateBgn(0, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
/////////////////////////////////////////////////////////////////////////////
// 預(yù)處理分發(fā)消息(主要是按鍵事件)
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;
// 獲取懷孕開始,及結(jié)束日期
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;
// 設(shè)置當(dāng)前日期的工作范圍,并給定預(yù)產(chǎn)日期
m_DateCur.SetRange(&bgnTm, &endTm);
m_DateEnd.SetTime(&endTm);
OnDatetimechangeDateCur(0, 0);
}
// 選擇-預(yù)產(chǎn)日期
void CCalcBornDlg::OnDatetimechangeDateEnd(NMHDR* pNMHDR, LRESULT* pResult)
{
if(pResult) *pResult = 0;
// 獲取懷孕結(jié)束,及開始日期
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;
// 設(shè)置當(dāng)前日期的工作范圍,并給定開始日期
m_DateCur.SetRange(&bgnTm, &endTm);
m_DateBgn.SetTime(&bgnTm);
OnDatetimechangeDateCur(0, 0);
}
// 選擇-當(dāng)前日期
void CCalcBornDlg::OnDatetimechangeDateCur(NMHDR* pNMHDR, LRESULT* pResult)
{
if(pResult) *pResult = 0;
// 獲取開始,及當(dāng)前日期
CTime bgnTm, curTm;
m_DateBgn.GetTime(bgnTm);
m_DateCur.GetTime(curTm);
if(pNMHDR && pResult && curTm == m_curLast) return;
m_curLast = curTm;
// 計算已經(jīng)使用的天數(shù)并更新顯示
CTimeSpan ts = curTm - bgnTm;
SetShowByDays(ts.GetDays() + 1);
}
/////////////////////////////////////////////////////////////////////////////
// 選擇-已用天數(shù)
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);
}
/////////////////////////////////////////////////////////////////////////////
// 自定義獲取當(dāng)前系統(tǒng)的時間:時分秒毫秒4項清零
void GetSckLocalTime(LPSYSTEMTIME lpSystemTime)
{
if(!lpSystemTime) return;
GetLocalTime(lpSystemTime);
lpSystemTime->wHour = 0;
lpSystemTime->wMinute = 0;
lpSystemTime->wSecond = 0;
lpSystemTime->wMilliseconds = 0;
}
// 由當(dāng)前的已經(jīng)過的天數(shù)[1, 280],設(shè)置顯示諸元
void CCalcBornDlg::SetShowByDays(int nDays)
{
// 如果給定的已過天數(shù)不合理,則修正它
if(nDays < 1) nDays = 1;
else if(nDays > BORN_DAYS) nDays = BORN_DAYS;
// 獲取開始日期,并計算當(dāng)前日期
CTime tm; m_DateBgn.GetTime(tm);
CTimeSpan ts(nDays - 1, 0, 0, 0);
tm += ts; m_DateCur.SetTime(&tm);
// 當(dāng)前天數(shù)、孕月、孕周等
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);
// 孕月余天數(shù)、孕周余天數(shù)、剩余天數(shù)等
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.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -