clockset.cpp
来自「个人计算机定时自动执行软件,是 一个值得看看的程序。」· C++ 代码 · 共 767 行 · 第 1/2 页
CPP
767 行
// ClockSet.cpp : implementation file
//
#include "stdafx.h"
#include <commctrl.h>
#include "clock.h"
#include "ClockSet.h"
#include "TimerPage.h"
#include "ChoicePage.h"
#include "Mmsystem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CClockSet dialog
CClockSet::CClockSet(CWnd* pParent /*=NULL*/)
: CDialog(CClockSet::IDD, pParent)
{
//{{AFX_DATA_INIT(CClockSet)
m_strPath = _T("");
m_usingreport = TRUE;
m_standardbell = 0;
m_combo1 = 0;
//}}AFX_DATA_INIT
m_flagInitOver=FALSE;
}
void CClockSet::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CClockSet)
DDX_Control(pDX, IDC_SET_LIST, m_list);
DDX_Text(pDX, IDC_SET_USINGTIMEREPORTEDIT, m_strPath);
DDX_Check(pDX, IDC_SET_USINGTIMEREPORT, m_usingreport);
DDX_Radio(pDX, IDC_SET_STANDARDBELL, m_standardbell);
DDX_CBIndex(pDX, IDC_COMBO1, m_combo1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CClockSet, CDialog)
//{{AFX_MSG_MAP(CClockSet)
ON_BN_CLICKED(IDC_SET_NEWADD, OnNewAdd)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
ON_BN_CLICKED(IDC_SET_AUDITION, OnAudition)
ON_BN_CLICKED(IDC_SET_USINGTIMEREPORT, OnUsingReport)
ON_BN_CLICKED(IDC_SET_SOUNDBELL, OnSoundBell)
ON_BN_CLICKED(IDC_SET_STANDARDBELL, OnStandardBell)
ON_BN_CLICKED(IDC_SET_DEFINEDBELL, OnDefinedBell)
ON_BN_CLICKED(IDC_SET_EDIT, OnSetEdit)
ON_BN_CLICKED(IDC_SET_DEL, OnSetDel)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_SET_LIST, OnItemchangedSetList)
ON_NOTIFY(NM_DBLCLK, IDC_SET_LIST, OnDblclkSetList)
ON_WM_SHOWWINDOW()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CClockSet message handlers
BOOL CClockSet::OnInitDialog()//初始化
{
CDialog::OnInitDialog();
UpdateData(FALSE);
//OnUsingReport();//调用"启用整点报时"函数
//OnStandardBell();//标准铃声
char files_path[512];
GetModuleFileName(NULL,files_path,512);
char *fp = strrchr(files_path,'\\');
fp[1]='\0';
strcat(files_path,"Settings.ini");
m_usingreport = GetPrivateProfileInt("Sound","m_usingreport",0,files_path);
m_standardbell= GetPrivateProfileInt("Sound","m_standardbell",0,files_path);
if(m_usingreport)
{
if(m_standardbell==0)//判断选择点在哪个上面
OnStandardBell();
if(m_standardbell==1)
OnDefinedBell();
if(m_standardbell==2)
OnSoundBell();
}
else
{
GetDlgItem(IDC_SET_STANDARDBELL)->EnableWindow(false);
GetDlgItem(IDC_SET_DEFINEDBELL)->EnableWindow(false);
GetDlgItem(IDC_SET_SOUNDBELL)->EnableWindow(false);
GetDlgItem(IDC_BROWSE)->EnableWindow(false);
GetDlgItem(IDC_SET_AUDITION)->EnableWindow(false);
GetDlgItem(IDC_SET_USINGTIMEREPORTEDIT)->EnableWindow(false);
GetDlgItem(IDC_COMBO1)->EnableWindow(false);
}
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES |LVS_EX_CHECKBOXES );
//扩展风格LVS_EX_CHECKBOXES表示可以Checked
m_list.InsertColumn(0,"闹铃主题",LVCFMT_IMAGE|LVCFMT_LEFT,120);//LVCFMT_IMAGE表示可以加入图标
m_list.InsertColumn(1,"闹铃类型",LVCFMT_LEFT,80);
m_list.InsertColumn(3,"闹铃时间",LVCFMT_LEFT,120);
m_list.InsertColumn(4,"闹铃方式及状态",LVCFMT_LEFT,180);
//先将图标载入内存,用于列表框显示用。
m_imagelist.Create(16,16,ILC_COLORDDB|ILC_MASK,0,4);
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
m_list.SetImageList(&m_imagelist,LVSIL_SMALL);
//从文件中读取数据
char out_path[512];
GetModuleFileName(NULL,out_path,512);//得到程序运行所在位置
char *p = strrchr(out_path,'\\');
p[1]='\0';
strcat(out_path,"Mission.dat");
CFile file;
if(file.Open(out_path,CFile::modeRead|CFile::typeBinary))
{
long listcount=0;
BYTE length[4];
long *plength=(long*)length;
file.Read((void*)length,4);
listcount=*plength;
for(int i=0;i<listcount;i++)
{
MISSION savemission;
file.Read((void*)&savemission,sizeof(MISSION));
//m_list.SetItemData(i,(DWORD)savemission);
AddList(savemission,i);
}
file.Close();
}
//初始化时将编辑与删除按钮设为不可用状态
GetDlgItem(IDC_SET_EDIT)->EnableWindow(false);
GetDlgItem(IDC_SET_DEL)->EnableWindow(false);
UpdateData(FALSE);
//m_flagInitOver=TRUE;//判断列表框初始化是否结束,结束赋true
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
//闹钟设置的函数:新增,删除,编辑
void CClockSet::OnNewAdd() //新增定时任务
{
CPropertySheet mysheet("新增定时任务");
CChoicePage choicepage;
CTimerPage timerpage;
mysheet.AddPage(&timerpage);
mysheet.AddPage(&choicepage);
mysheet.m_psh.dwFlags|=PSH_NOAPPLYNOW;//移除"应用"按钮
int nResponse = mysheet.DoModal();
if (nResponse == IDOK)
{
//m_flagInitOver=FALSE;
MISSION mission;
//结构初始化
memset((void*)&mission,0,sizeof(MISSION));
//读取窗口数据到结构
timerpage.ReadData(&mission);
choicepage.ReadData(&mission);
//在第0个位置新加一个列表项
AddList(mission,0);
//m_flagInitOver=TRUE;
}
else if (nResponse == IDCANCEL)
{
}
}
void CClockSet::AddList(MISSION mission,long cursel)//新加一项列表
{
m_flagInitOver=FALSE;
switch(mission.set_books)//显示类型及图示
{
case 0:
m_list.InsertItem(cursel,mission.set_topic,0);
m_list.SetItemText(cursel,1,"会议");
break;
case 1:
m_list.InsertItem(cursel,mission.set_topic,1);
m_list.SetItemText(cursel,1,"约会");
break;
case 2:
m_list.InsertItem(cursel,mission.set_topic,2);
m_list.SetItemText(cursel,1,"假期");
break;
case 3:
m_list.InsertItem(cursel,mission.set_topic,3);
m_list.SetItemText(cursel,1,"办公");
break;
case 4:
m_list.InsertItem(cursel,mission.set_topic,4);
m_list.SetItemText(cursel,1,"纪念日");
break;
case 5:
m_list.InsertItem(cursel,mission.set_topic,5);
m_list.SetItemText(cursel,1,"重要事记");
break;
}
//显示闹铃时间
int stryear,strmonth,strday,strhour,strmin,strweek,strcycle;
stryear=mission.set_date_year;
strmonth=mission.set_date_month;
strday=mission.set_date_day;
strhour=mission.set_time_hour;
strmin=mission.set_time_minute;
strweek=mission.set_date_week;
strcycle=mission.set_time_cycletime;
CString Time;
// Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
// m_list.SetItemText(cursel,2,Time);
SYSTEMTIME syt;
CString str_Temp;
GetLocalTime(&syt);
switch(mission.set_mode)//闹铃方式及状态
{
case 0:
if( (stryear>syt.wYear) ||
(stryear==syt.wYear && strmonth>syt.wMonth) ||
(stryear==syt.wYear && strmonth==syt.wMonth && strday>syt.wDay ) ||
(stryear==syt.wYear && strmonth==syt.wMonth && strday==syt.wDay && strhour>syt.wHour) ||
(stryear==syt.wYear && strmonth==syt.wMonth && strday==syt.wDay && strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"只提醒一次");
}
else
{
m_list.SetItemText(cursel,3,"只提醒一次(已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
case 1:
m_list.SetItemText(cursel,3,"循环提醒");
Time.Format(TEXT("每隔 %d 分钟"),strcycle);
m_list.SetItemText(cursel,2,Time);
break;
case 2:
if( (strhour>syt.wHour) || (strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"每天同一时间");
}
else
{
m_list.SetItemText(cursel,3,"每天同一时间(今天已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
case 3:
if( (strweek>syt.wDayOfWeek) ||
(strweek==syt.wDayOfWeek && strhour>syt.wHour) ||
(strweek==syt.wDayOfWeek && strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"每周同一时间");
}
else
{
m_list.SetItemText(cursel,3,"每周同一时间(本周已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
case 4:
if( (strday>syt.wDay) ||
(strday==syt.wDay && strhour>syt.wHour) ||
(strday==syt.wDay && strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"每月同一时间");
}
else
{
m_list.SetItemText(cursel,3,"每月同一时间(本月已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
case 5:
if( (strmonth>syt.wMonth) ||
(strmonth==syt.wMonth && strday>syt.wDay) ||
(strmonth==syt.wMonth && strday==syt.wDay && strhour>syt.wHour) ||
(strmonth==syt.wMonth && strday==syt.wDay && strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"每年同一时间");
}
else
{
m_list.SetItemText(cursel,3,"每年同一时间(本年已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
case 6:
if( (syt.wDayOfWeek>0 && syt.wDayOfWeek<6 && strhour>syt.wHour) ||
(syt.wDayOfWeek>0 && syt.wDayOfWeek<6 && strhour==syt.wHour && strmin>syt.wMinute))
{
m_list.SetItemText(cursel,3,"国家法定工作日");
}
else
{
m_list.SetItemText(cursel,3,"国家法定工作日(工作日已过时)");
}
Time.Format(TEXT("%d-%d-%d(%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
m_list.SetItemText(cursel,2,Time);
break;
}
//设置查检框的三种方法
//方法1
if(mission.set_using)
m_list.SetCheck(cursel,TRUE);
//方法2
/*
LVITEM lvi;
lvi.stateMask= 0xf000;
lvi.state=0x2000;//0x1000
::SendMessage(m_list.m_hWnd , LVM_SETITEMSTATE, (WPARAM)0, (LPARAM)&lvi);
*/
//方法3
//ListView_SetItemState(m_list.m_hWnd,0, 2<<12, LVIS_STATEIMAGEMASK);
//动态分配,用于记存新增数据
MISSION *pmission=new MISSION;
memcpy((void*)pmission,(void*)&mission,sizeof(MISSION));
m_list.SetItemData(cursel,(DWORD)pmission);
//注意:在确定/取消/删除这三处都需要进行delete,否则将出现内存泻漏
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?