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

📄 optionsdlg.cpp

📁 一个很漂亮的数字时钟程序,你一定会喜欢的.
💻 CPP
字号:
// OptionsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "alarm.h"
#include "OptionsDlg.h"
#include "ClockChangeDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// COptionsDlg dialog

extern CAlarmApp *pAlarmApp;

COptionsDlg::COptionsDlg(CWnd* pParent /*=NULL*/)
	: CDialog(COptionsDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(COptionsDlg)
	m_bSetZOrder	= pAlarmApp->m_bWindowIsTopmost;
	m_iAlarmAM		= 1;
	m_bSpeakClock	= pAlarmApp->m_bSpeakClock;
	m_iStyle		= pAlarmApp->m_iStyle;
	m_bAlarmActive	= pAlarmApp->m_bAlarmActive;
	m_bGrayLetters	= pAlarmApp->m_bGrayLetters;
	m_iSpeakIntervals = pAlarmApp->m_iSpeakIntervals;
	m_iSnap			= pAlarmApp->m_iSnap;
	//}}AFX_DATA_INIT

	m_b12HourBase = pAlarmApp->m_b12HourBase;
	m_iHoursRange = m_b12HourBase ? 0 : 1;

	m_uiCurrentClock = 0;
	
	SetAlarmTime();
}

void COptionsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COptionsDlg)
	DDX_Check(pDX, IDC_CHECK_SETZORDER, m_bSetZOrder);
	DDX_CBIndex(pDX, IDC_COMBO_ALARM, m_iAlarmAM);
	DDX_Check(pDX, IDC_CHECK_SPEAKCLOCK, m_bSpeakClock);
	DDX_CBIndex(pDX, IDC_COMBO_STYLES, m_iStyle);
	DDX_Check(pDX, IDC_CHECK_ALARMACTIVE, m_bAlarmActive);
	DDX_Check(pDX, IDC_CHECK_GRAYLETTERS, m_bGrayLetters);
	DDX_CBIndex(pDX, IDC_COMBO_INTERVALS, m_iSpeakIntervals);
	DDX_Radio(pDX, IDC_RADIO_RANGE1, m_iHoursRange);
	DDX_Radio(pDX, IDC_RADIO_SNAP1, m_iSnap);
	//}}AFX_DATA_MAP

	DDX_CmEdit(pDX, IDC_EDIT_ALARM, m_EditAlarm, m_sAlarm);
}

BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)
	//{{AFX_MSG_MAP(COptionsDlg)
	ON_BN_CLICKED(IDC_CHECK_SETZORDER, OnCheckSetzorder)
	ON_BN_CLICKED(IDC_APPLY, OnApply)
	ON_EN_CHANGE(IDC_EDIT_ALARM, OnChangeEditAlarm)
	ON_BN_CLICKED(IDC_CHECK_SPEAKCLOCK, OnCheckSpeakclock)
	ON_CBN_SELCHANGE(IDC_COMBO_ALARM, OnSelchangeComboAlarm)
	ON_CBN_SELCHANGE(IDC_COMBO_STYLES, OnSelchangeComboStyles)
	ON_BN_CLICKED(IDC_CHECK_ALARMACTIVE, OnCheckAlarmactive)
	ON_BN_CLICKED(IDC_CHECK_GRAYLETTERS, OnCheckGrayletters)
	ON_CBN_SELCHANGE(IDC_COMBO_INTERVALS, OnSelchangeComboIntervals)
	ON_BN_CLICKED(IDC_BUTTON_CHANGETIME, OnButtonChangetime)
	ON_WM_DESTROY()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_RADIO_RANGE1, OnRadioRange1)
	ON_BN_CLICKED(IDC_RADIO_RANGE2, OnRadioRange2)
	ON_BN_CLICKED(IDOK, OnOK)
	ON_BN_CLICKED(IDC_RADIO_SNAP1, OnRadioSnap1)
	ON_BN_CLICKED(IDC_RADIO_SNAP2, OnRadioSnap2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptionsDlg message handlers

void COptionsDlg::OnOK()
{
	if (OnApply())
		CDialog::OnOK();
}

void COptionsDlg::OnCheckSetzorder() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnChangeEditAlarm() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnCheckSpeakclock() 
{
	UpdateData();

	GetDlgItem(IDC_STATIC_INTERVALS)->EnableWindow(m_bSpeakClock);
	GetDlgItem(IDC_COMBO_INTERVALS)->EnableWindow(m_bSpeakClock);

	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnSelchangeComboAlarm() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnSelchangeComboStyles() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnSelchangeComboIntervals() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();	
}

void COptionsDlg::OnCheckAlarmactive() 
{
	UpdateData();

	GetDlgItem(IDC_STATIC_ALARM)->EnableWindow(m_bAlarmActive);
	GetDlgItem(IDC_EDIT_ALARM)->EnableWindow(m_bAlarmActive);
	
	if (m_b12HourBase)
		GetDlgItem(IDC_COMBO_ALARM)->EnableWindow(m_bAlarmActive);
	else
	{
		GetDlgItem(IDC_COMBO_ALARM)->EnableWindow(FALSE);
	}
	
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnCheckGrayletters() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::HourRangeChange()
{
	UpdateData();
	
	if (m_b12HourBase)
	{
		if (m_bAlarmActive)
			GetDlgItem(IDC_COMBO_ALARM)->EnableWindow(TRUE);
	}
	else
	{
		if (m_bAlarmActive)
			GetDlgItem(IDC_COMBO_ALARM)->EnableWindow(FALSE);
	}

	ApplyWhat aw;
	memset(&aw, 0, sizeof(aw));
	
	if (m_b12HourBase != pAlarmApp->m_b12HourBase)
	{
		pAlarmApp->m_b12HourBase	= m_b12HourBase;
		aw.bHourBaseChange			= TRUE;;
	}

	AfxGetMainWnd()->SendMessage(WM_USER_APPLY, (WPARAM) &aw);

	AdjustAlarmTime();
	UpdateData(FALSE);
}

void COptionsDlg::OnRadioRange1() 
{
	UpdateData(TRUE);
	m_b12HourBase = (m_iHoursRange == 0) ? TRUE : FALSE;
	HourRangeChange();
}

void COptionsDlg::OnRadioRange2() 
{
	UpdateData(TRUE);
	m_b12HourBase = (m_iHoursRange == 0) ? TRUE : FALSE;
	HourRangeChange();
}

BOOL COptionsDlg::OnApply()
{
	CString		sAlarm, sMessage = "";
	int			iAlarmHour=-1, iAlarmMin=-1;
	ApplyWhat	aw;

	memset(&aw, 0, sizeof(aw));

	UpdateData();
	
	GetDlgItem(IDC_EDIT_ALARM)->GetWindowText(sAlarm);
	sscanf(sAlarm.GetBuffer(80), "%d:%d", &iAlarmHour, &iAlarmMin);
	sAlarm.ReleaseBuffer();

	BOOL bAlarmAM = (m_iAlarmAM == 0) ? TRUE : FALSE;	// Convert comboidx to boolean.

	if (m_b12HourBase)
	{
		if ((iAlarmHour >= 1 && iAlarmHour <= 12) && (iAlarmMin >= 0 && iAlarmMin <= 59))
		{
			aw.bAlarmChange	= TRUE;
		}
		else
		{
			if (iAlarmHour < 1 || iAlarmHour > 12)
			{
				sMessage = "Hour should be an integer between 1 and 12.";
			}
			if (iAlarmMin < 0 || iAlarmMin > 59)
			{
				if (sMessage.GetLength() == 0)
				{
					sMessage = "Minute should be an integer between 0 and 59";
				}
				else
					sMessage += CString("\nMinute should be an integer between 0 and 59");
			}
			
			MessageBox(sMessage, AfxGetAppName());
			
			return FALSE;
		}
	}
	else
	{
		if ((iAlarmHour >= 0 && iAlarmHour <= 23) && (iAlarmMin >= 0 && iAlarmMin <= 59))
		{
			aw.bAlarmChange	= TRUE;
		}
		else
		{
			if (iAlarmHour < 0 || iAlarmHour > 23)
			{
				sMessage = "Hour should be an integer between 0 and 23.";
			}
			if (iAlarmMin < 0 || iAlarmMin > 59)
			{
				if (sMessage.GetLength() == 0)
				{
					sMessage = "Minute should be an integer between 0 and 59";
				}
				else
					sMessage += CString("\nMinute should be an integer between 0 and 59");
			}
			
			MessageBox(sMessage, AfxGetAppName());
			
			return FALSE;
		}
	}

	if (aw.bAlarmChange)
	{
		int iNewHour;
		
		if (m_b12HourBase)
			TimeAPto24(iAlarmHour, bAlarmAM, iNewHour);
		else
			iNewHour = iAlarmHour;

		pAlarmApp->m_iAlarm24Hour = iNewHour;
		pAlarmApp->m_iAlarmMinute = iAlarmMin;
	}

	if (m_iStyle != pAlarmApp->m_iStyle)
	{
		pAlarmApp->m_iStyle = m_iStyle;
		aw.bStyleChange		= TRUE;
	}

	if (m_bSpeakClock != pAlarmApp->m_bSpeakClock)
	{
		pAlarmApp->m_bSpeakClock = m_bSpeakClock;
	}

	if (m_bSetZOrder != pAlarmApp->m_bWindowIsTopmost)
	{
		pAlarmApp->m_bWindowIsTopmost	= m_bSetZOrder;
		aw.bZOrderChange				= TRUE;
	}

	if (m_bAlarmActive != pAlarmApp->m_bAlarmActive)
	{
		pAlarmApp->m_bAlarmActive		= m_bAlarmActive;
		aw.bAlarmActiveChange			= TRUE;
	}

	if (m_bGrayLetters != pAlarmApp->m_bGrayLetters)
	{
		pAlarmApp->m_bGrayLetters	= m_bGrayLetters;
		aw.bGrayChange						= TRUE;
	}

	if (m_iSpeakIntervals != pAlarmApp->m_iSpeakIntervals)
	{
		pAlarmApp->m_iSpeakIntervals	= m_iSpeakIntervals;
		aw.bSpeakChange					= TRUE;;
	}

	if (m_b12HourBase != pAlarmApp->m_b12HourBase)
	{
		pAlarmApp->m_b12HourBase	= m_b12HourBase;
		aw.bHourBaseChange			= TRUE;;
	}

	pAlarmApp->m_iSnap = m_iSnap;

	AfxGetMainWnd()->SendMessage(WM_USER_APPLY, (WPARAM) &aw);

	GetDlgItem(IDC_APPLY)->EnableWindow(FALSE);

	return TRUE;
}

BOOL COptionsDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_EditAlarm.Init("[012][0-9]:[0-5][0-9]");
	m_EditAlarm.SetData(m_sAlarm);
	
	GetDlgItem(IDC_APPLY)->EnableWindow(FALSE);					// Above data toggles Apply button.

	GetDlgItem(IDC_STATIC_ALARM)->EnableWindow(m_bAlarmActive);
	GetDlgItem(IDC_EDIT_ALARM)->EnableWindow(m_bAlarmActive);
	GetDlgItem(IDC_COMBO_ALARM)->EnableWindow(m_bAlarmActive);

	GetDlgItem(IDC_COMBO_INTERVALS)->EnableWindow(m_bGrayLetters);
	GetDlgItem(IDC_STATIC_INTERVALS)->EnableWindow(m_bGrayLetters);

	GetDlgItem(IDC_STATIC_INTERVALS)->EnableWindow(m_bSpeakClock);
	GetDlgItem(IDC_COMBO_INTERVALS)->EnableWindow(m_bSpeakClock);

	CRect rParent, rDlg;
	GetParent()->GetWindowRect(&rParent);
	GetWindowRect(&rDlg);

	int x = rParent.Width() - rDlg.Width();
	if (x > 0)
		x /= 2;
	
	if ((rDlg.Height() + rParent.bottom) < GetSystemMetrics(SM_CYSCREEN))
		SetWindowPos(NULL, rParent.left+x, rParent.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	m_uiCurrentClock = SetTimer(3, 1000, NULL);
	SetCurrentClock();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void COptionsDlg::OnButtonChangetime() 
{
	UpdateData();
	
	CClockChangeDlg dlg(this);
	dlg.DoModal();	
}

void COptionsDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if (m_uiCurrentClock)
		KillTimer(m_uiCurrentClock);
}

void COptionsDlg::OnTimer(UINT nIDEvent) 
{
	if (nIDEvent == m_uiCurrentClock)
	{
		SetCurrentClock();
	}
}

void COptionsDlg::SetCurrentClock()
{
	int		iCurrentHour, iCurrentMinute, iCurrentSecond;
	BOOL	bAM = TRUE;
	CTime t = CTime::GetCurrentTime();
	
	iCurrentMinute	= t.GetMinute();
	iCurrentSecond	= t.GetSecond();
	
	CString sCurrentClock;
	
	if (m_b12HourBase)
	{
		Time24toAP(t.GetHour(), bAM, iCurrentHour);
		sCurrentClock.Format("%02d:%02d.%02d %s", iCurrentHour, iCurrentMinute, iCurrentSecond, bAM ? "A&M" : "P&M");
	}
	else
	{
		sCurrentClock.Format("%02d:%02d.%02d", t.GetHour(), iCurrentMinute, iCurrentSecond);
	}
	
	GetDlgItem(IDC_BUTTON_CHANGETIME)->SetWindowText(sCurrentClock);
}

void COptionsDlg::SetAlarmTime()
{
	int	 iAlarmHour = pAlarmApp->m_iAlarm24Hour;
	BOOL bAM;

	if (m_b12HourBase)
	{
		Time24toAP(pAlarmApp->m_iAlarm24Hour, bAM, iAlarmHour);
	
		if (bAM)
			m_iAlarmAM = 0;
		else
			m_iAlarmAM = 1;
	}

	m_sAlarm.Format("%02d%02d", iAlarmHour, pAlarmApp->m_iAlarmMinute);
}

void COptionsDlg::AdjustAlarmTime()
{
	CString sAlarm;
	int		iAlarmHour=-1, iAlarmMin=-1, iNewHour;
	
	GetDlgItem(IDC_EDIT_ALARM)->GetWindowText(sAlarm);
	sscanf(sAlarm.GetBuffer(80), "%d:%d", &iAlarmHour, &iAlarmMin);
	sAlarm.ReleaseBuffer();

	if (! m_b12HourBase)
	{
		BOOL bAlarmAM = (m_iAlarmAM == 0) ? TRUE : FALSE;	// Convert comboidx to boolean.

		TimeAPto24(iAlarmHour, bAlarmAM, iNewHour);
		iAlarmHour = iNewHour;

		m_sAlarm.Format("%02d%02d", iAlarmHour, pAlarmApp->m_iAlarmMinute);
	}
	else
	{
		BOOL bAM;

		Time24toAP(iAlarmHour, bAM, iNewHour);
		iAlarmHour = iNewHour;

		m_sAlarm.Format("%02d%02d", iAlarmHour, pAlarmApp->m_iAlarmMinute);

		if (bAM)
			m_iAlarmAM = 0;
		else
			m_iAlarmAM = 1;
	}
}

void COptionsDlg::OnRadioSnap1() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();
}

void COptionsDlg::OnRadioSnap2() 
{
	GetDlgItem(IDC_APPLY)->EnableWindow();	
}

⌨️ 快捷键说明

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