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 + -
显示快捷键?