📄 s200807003_alarmclockdlg.cpp
字号:
// S200807003_AlarmClockDlg.cpp : implementation file
//
#include "stdafx.h"
#include "S200807003_AlarmClock.h"
#include "S200807003_AlarmClockDlg.h"
#include "Alarm.h" //add by xiewei
#include <atlconv.h> //add by xiewei for CString to char *
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CS200807003_AlarmClockDlg dialog
CS200807003_AlarmClockDlg::CS200807003_AlarmClockDlg(CWnd* pParent /*=NULL*/)
: CDialog(CS200807003_AlarmClockDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CS200807003_AlarmClockDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CS200807003_AlarmClockDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CS200807003_AlarmClockDlg)
DDX_Control(pDX, IDC_EDIT_TEXT, m_edit_text);
DDX_Control(pDX, IDC_CHECK_EVERY, m_is_everyday);
DDX_Control(pDX, IDC_LIST_SCHE, m_schedule_list);
DDX_Control(pDX, IDC_DATETIMEPICKER_SCHE, m_schedule_time);
DDX_Control(pDX, IDC_DATETIMEPICKER_CUR, m_current_time);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CS200807003_AlarmClockDlg, CDialog)
//{{AFX_MSG_MAP(CS200807003_AlarmClockDlg)
ON_BN_CLICKED(IDC_BUTTON_UPDATE, OnButtonUpdate)
ON_BN_CLICKED(IDC_BUTTON_SET, OnButtonSet)
ON_BN_CLICKED(IDC_BUTTON_EXIT, OnButtonExit)
ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
ON_BN_CLICKED(IDC_BUTTON_DELALL, OnButtonDelall)
ON_BN_CLICKED(IDC_CHECK_EVERY, OnCheckEvery)
ON_NOTIFY(NM_SETFOCUS, IDC_DATETIMEPICKER_CUR, OnSetfocusDatetimepickerCur)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CS200807003_AlarmClockDlg message handlers
BOOL CS200807003_AlarmClockDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 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
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
// 把显示时间设置为日期时间都显示的格式
m_current_time.SetFormat(L"yyyy-MM-dd HH:mm:ss");
m_schedule_time.SetFormat(L"yyyy-MM-dd HH:mm:ss");
// 创建实时时间刷新的线程
m_hThreadOne = CreateThread(NULL, 100, ThreadFunOne, (void *)this, 0, NULL);
SetThreadPriority(m_hThreadOne, THREAD_PRIORITY_NORMAL);
// 设置列表的风格
m_schedule_list.SetExtendedStyle(
LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE|
LVS_EX_HEADERDRAGDROP);
// 设置表头
m_schedule_list.InsertColumn(0,L"Index",LVCFMT_LEFT,50,0);
m_schedule_list.InsertColumn(1,L"Type",LVCFMT_LEFT,70,1);
m_schedule_list.InsertColumn(2,L"Time",LVCFMT_LEFT,150,2);
// 初始化记录文件
FILE *fptr;
int index,count;
CString index_text;
Alarm *tmp;
POSITION pos;
COleDateTime get_c_cur_time, get_c_list_time;
AlarmSet = new CObList(); //先建一个空表
if( (fptr = fopen("alarm_data.ini","r")) == NULL)
MessageBox(L"No existent record file");
else {
fclose(fptr);
// 从文件中读取记录到AlarmSet表里
File2AlarmSet();
// 从AlarmSet表里把过期的记录删除
pos = AlarmSet->GetHeadPosition();
get_c_cur_time = COleDateTime::GetCurrentTime();
count = 0;
while(pos) {
tmp = (Alarm *)AlarmSet->GetNext(pos);
if(!tmp->get_is_everyday()) {
get_c_list_time.SetDateTime(
(short)_ttoi(tmp->get_datetime().Mid(0, 4)),
(short)_ttoi(tmp->get_datetime().Mid(5, 2)),
(short)_ttoi(tmp->get_datetime().Mid(8, 2)),
(short)_ttoi(tmp->get_datetime().Mid(11, 2)),
(short)_ttoi(tmp->get_datetime().Mid(14, 2)),
(short)_ttoi(tmp->get_datetime().Mid(17, 2)));
if(get_c_cur_time > get_c_list_time) //在AlarmSet里删除过期的记录
AlarmSet->RemoveAt(AlarmSet->Find(tmp));
}
count++;
}
// 从AlarmSet表里把记录添加到列表框里
index = m_schedule_list.GetItemCount(); // 得到当前列表中的记录数
pos = AlarmSet->GetHeadPosition();
while(pos) {
index_text.Format(L"%d", index);
tmp = (Alarm *)AlarmSet->GetNext(pos);
m_schedule_list.InsertItem(index,index_text); // 插入新记录
if(tmp->get_is_everyday()) // 判定是每日闹铃还是一次闹铃
m_schedule_list.SetItemText(index, 1, L"EveryDay");
else
m_schedule_list.SetItemText(index, 1, L"Once");
m_schedule_list.SetItemText(index, 2, tmp->get_datetime());
index++;
}
}
// 创建闹铃列表检测的线程
m_hThreadTwo = CreateThread(NULL, 100, ThreadFunTwo, (void *)this, 0, NULL);
SetThreadPriority(m_hThreadTwo, THREAD_PRIORITY_NORMAL);
return TRUE; // return TRUE unless you set the focus to a control
}
void CS200807003_AlarmClockDlg::OnButtonUpdate()
{
// TODO: Add your control notification handler code here
COleDateTime get_c_cur_time;
SYSTEMTIME tm;
// 获取对话框中设置的时间
m_current_time.GetTime(get_c_cur_time);
// 截取对话框中所设置的时间存入SYSTEMTIME的结构中
tm.wYear = get_c_cur_time.GetYear();
tm.wMonth = get_c_cur_time.GetMonth();
tm.wDay = get_c_cur_time.GetDay();
tm.wHour = get_c_cur_time.GetHour();
tm.wMinute = get_c_cur_time.GetMinute();
tm.wSecond = get_c_cur_time.GetSecond();
tm.wMilliseconds = 0;
if(SetLocalTime(&tm) == 0) MessageBox(L"SetLocalTime Failed");
else MessageBox(L"SetLocalTime Success");
ResumeThread(m_hThreadOne);
}
void CS200807003_AlarmClockDlg::OnButtonSet()
{
// TODO: Add your control notification handler code here
COleDateTime get_c_cur_time, get_c_sche_time;
CString time_text, check_result;
bool valid_time = true;
CString index_text;
int index;
Alarm *add_alarm;
CString get_edit_text;
// 获取设置的时间,COleDateTime型的用来和当前时间比较
// CString型的用来检测是否在记录文件中的有冲突
m_schedule_time.GetWindowText(time_text);
m_schedule_time.GetTime(get_c_sche_time);
// 判断一次闹铃时间是否小于当前系统时间
if(m_is_everyday.GetCheck() == 0) { // 一次闹铃
get_c_cur_time = COleDateTime::GetCurrentTime();
if(get_c_sche_time < get_c_cur_time) {
valid_time = false;
check_result = "Sorry, the time you set is earlier than now time.";
}
}
// 判断设置的时间在记录文件中是否重复
if(is_conflict(time_text)) {
valid_time = false;
check_result = "Sorry, there has been a reminder at this time.";
}
//判断设置的时间所属类型的记录已经达到5个
if(is_overcount()) {
valid_time = false;
if(m_is_everyday.GetCheck() == 1)
check_result = "Sorry,every user has 5 everyday-reminder at most.";
else
check_result = "Sorry,every user has 5 once-reminder at most.";
}
// 新的记录加入AlarmSet
if(valid_time == true) {
m_edit_text.GetWindowText(get_edit_text);
if(m_is_everyday.GetCheck() == 1) // 判定是每日闹铃还是一次闹铃
add_alarm = new Alarm(true, time_text, get_edit_text);
else
add_alarm = new Alarm(false, time_text, get_edit_text);
AlarmSet->AddTail(add_alarm);
}
// 新的记录加入列表框
if(valid_time == true) {
index = m_schedule_list.GetItemCount(); // 得到当前列表中的记录数
index_text.Format(L"%d", index);
m_schedule_list.InsertItem(index,index_text); // 插入新记录
if(m_is_everyday.GetCheck() == 1)
m_schedule_list.SetItemText(index, 1, L"EveryDay");
else
m_schedule_list.SetItemText(index, 1, L"Once");
m_schedule_list.SetItemText(index, 2, time_text);
}
else
MessageBox(check_result);
}
void CS200807003_AlarmClockDlg::OnButtonExit()
{
// TODO: Add your control notification handler code here
// 从AlarmSet中读取闹铃记录写入文件里
int index = 1;
POSITION pos;
Alarm *tmp;
FILE *fptr;
CString get_s_text, get_s_datetime, write_tmp;
char *lpsz;
if( (fptr = fopen("alarm_data.ini","w")) != NULL) {
fputs("[RemindOnceInfo]\n", fptr); //先写入一次闹铃的记录
pos = AlarmSet->GetHeadPosition();
while(pos) {
tmp = (Alarm *)AlarmSet->GetNext(pos);
if(!(tmp->get_is_everyday())) { // 是一次闹铃
get_s_text = tmp->get_text();
get_s_datetime = tmp->get_datetime();
write_tmp.Format(L"task%d=%s\n", index, get_s_text);
USES_CONVERSION;
lpsz = (char*)W2A((LPCTSTR)write_tmp);
fputs(lpsz, fptr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -