awakedlg.cpp

来自「个人计算机定时自动执行软件,是 一个值得看看的程序。」· C++ 代码 · 共 835 行 · 第 1/2 页

CPP
835
字号
// AwakeDlg.cpp : implementation file

#include "stdafx.h"
#include "clock.h"
#include "AwakeDlg.h"
#include "TimerPage.h"
#include "ChoicePage.h"
#include "clockDlg.h"


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

/////////////////////////////////////////////////////////////////////////////
// CAwakeDlg dialog


CAwakeDlg::CAwakeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAwakeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAwakeDlg)
	//}}AFX_DATA_INIT

}


void CAwakeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAwakeDlg)
	DDX_Control(pDX, IDC_AWAKE_IMAGE, m_image);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAwakeDlg, CDialog)
	//{{AFX_MSG_MAP(CAwakeDlg)
	ON_BN_CLICKED(IDC_AWAKE_EDIT, OnAwakeEdit)
	ON_BN_CLICKED(IDC_AWAKE_LATER, OnAwakeLater)
	ON_BN_CLICKED(IDC_AWAKE_DEL, OnAwakeDel)
	ON_COMMAND(ID_MENU_FIVE, OnFive)
	ON_COMMAND(ID_MENU_FIFTEEN, OnFifteen)
	ON_COMMAND(ID_MENU_THIRTY, OnThirty)
	ON_COMMAND(ID_MENU_ONEHOUR, OnOneHour)
	ON_COMMAND(ID_MENU_TWOHOUR, OnTwoHour)
	ON_COMMAND(ID_MENU_FOURHOUR, OnFourHour)
	ON_COMMAND(ID_MENU_EITHGHOUR, OnEithgHour)
	ON_COMMAND(ID_MENU_ONEDAY, OnOneDay)
	ON_COMMAND(ID_MENU_TWODAY, OnTwoDay)
	ON_COMMAND(ID_MENU_THREEDAY, OnThreeDay)
	ON_COMMAND(ID_MENU_FOURDAY, OnFourDay)
	ON_COMMAND(ID_MENU_ONEWEEK, OnOneWeek)
	ON_COMMAND(ID_MENU_TEN, OnTen)
	ON_WM_SHOWWINDOW()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAwakeDlg message handlers

BOOL CAwakeDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	//弹出的对话框总在最前面
	SetWindowPos(&CWnd::wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);

	//将主题与信息显示在对话框
	SetDlgItemText(IDC_AWAKE_TOPIC,m_mission.set_topic);
	SetDlgItemText(IDC_AWAKE_PLACE,m_mission.set_place);
	SetDlgItemText(IDC_AWAKE_MESSAGE,m_mission.set_message);

	if(m_mission.choice_usingaction==1)
	{
		SetDlgItemText(IDC_AWAKE_TEXT,"启用任务:");
		switch(m_mission.choice_actionmode)
		{
		case 0:
			SetDlgItemText(IDC_AWAKE_TEXTSTATIC,m_mission.choice_actionpath);
			break;
		case 1:
			SetDlgItemText(IDC_AWAKE_TEXTSTATIC,"关闭计算机");
			break;
		case 2:
			SetDlgItemText(IDC_AWAKE_TEXTSTATIC,"计算机待机");
			break;
		case 3:
			SetDlgItemText(IDC_AWAKE_TEXTSTATIC,"重启计算机");
			break;
		case 4:
			SetDlgItemText(IDC_AWAKE_TEXTSTATIC,"注销计算机");
			break;
		}
	}
	else
	{
		SetDlgItemText(IDC_AWAKE_TEXT,"任务为空:");
	}


	//HANDLE  hIcon;
	switch(m_mission.set_books)//载入图标,MAKEINTRESOURCE宏将资源转为函数可用的参数
	{
		case 0:	
			SetDlgItemText(IDC_AWAKE_BOOKS,"会议");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
		case 1:
			SetDlgItemText(IDC_AWAKE_BOOKS,"约会");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
		case 2:
			SetDlgItemText(IDC_AWAKE_BOOKS,"假期");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON3) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
		case 3:
			SetDlgItemText(IDC_AWAKE_BOOKS,"办公");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON4) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
		case 4:
			SetDlgItemText(IDC_AWAKE_BOOKS,"纪念日");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON5) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
		case 5:
			SetDlgItemText(IDC_AWAKE_BOOKS,"重要事记");
			hIcon=::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON6) ,IMAGE_ICON,32,32,LR_DEFAULTCOLOR);
			break;
	}

	m_image.SetIcon( (HICON)hIcon );//显示图标

	
	//将日期与时间显示在标题栏
	int stryear,strmonth,strday,strhour,strmin,strcyle;
	stryear = m_mission.set_date_year;
	strmonth = m_mission.set_date_month;
	strday = m_mission.set_date_day;
	strhour = m_mission.set_time_hour;
	strmin = m_mission.set_time_minute;
	strcyle = m_mission.set_time_cycletime;
	CString str;
	switch(m_mission.set_mode)
	{
	case 0:
		str.Format(TEXT("只提醒一次:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	case 1:
		str.Format(TEXT("循环提醒: 每隔 %d 分钟"),strcyle);
		break;
	case 2:
		str.Format(TEXT("每天同一时间:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	case 3:
		str.Format(TEXT("每周同一时间:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	case 4:
		str.Format(TEXT("每月同一时间:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	case 5:
		str.Format(TEXT("每年同一时间:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	case 6:
		str.Format(TEXT("国家法定工作日:  %d-%d-%d  (%d:%02d)"),stryear,strmonth,strday,strhour,strmin);
		break;
	}
	
	SetWindowText(str);

	if(m_mission.set_mode==1)
	{
		GetDlgItem(IDC_AWAKE_LATER)->ShowWindow(SW_HIDE);
	}

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




////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////


void CAwakeDlg::OnAwakeEdit() //编辑按钮,再将数据传过去进行修改
{

	CPropertySheet editsheet("编辑");
	CChoicePage editchoicepage;
	CTimerPage	edittimerpage;
	
	editsheet.AddPage(&edittimerpage);
	editsheet.AddPage(&editchoicepage);
	editsheet.m_psh.dwFlags|=PSH_NOAPPLYNOW;
	
	//将要修改的数据传到属性页
	edittimerpage.SetMission(&m_mission);	
	editchoicepage.SetMission(&m_mission);

	pclockdlg->ClosetoClock();//从主程序调用闹钟设置时,先关闭所有的定时器
	
	
	int nResponse = editsheet.DoModal();
	if (nResponse == IDOK)//确定,将数据存入文件
	{
		MISSION mission;
		memset((void*)&mission,0,sizeof(MISSION));
		//修改后将数据读回到结构中
		edittimerpage.ReadData(&mission);
		editchoicepage.ReadData(&mission);
		

		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::modeReadWrite|CFile::typeBinary))
		{//将数据存到原数据所在位置,
			long listcount=0;
			BYTE length[4];
			long *plength=(long*)length;

			file.Read((void*)length,4);
			listcount=*plength;
			
			long size = number*(sizeof(MISSION))+4;//4文件头,很重要
			file.Seek(size,CFile::begin);//从指定位置开始写数据
			file.Write((void*)&mission,sizeof(MISSION));
			file.Close();
		}
		pclockdlg->FreeData();//先释放所有数据
		pclockdlg->LoadData();//从文件中读取数据
		OnOK();//单击确定后,将销毁窗口
	}

	else if (nResponse == IDCANCEL)//取消
	{
		//OnCancel();
	}
	pclockdlg->ChecktoClock();//再重新设置定时器	
}

void CAwakeDlg::OnAwakeLater()//稍后提醒按钮,单击弹出菜单进行选择 
{
	CMenu menu;
	if (!menu.LoadMenu(IDR_MENU_AWAKE))//导入菜单
		return ;
	CMenu* pSubMenu = menu.GetSubMenu(0);
	if (!pSubMenu) 
		return ;

	CPoint mouse;
	GetCursorPos(&mouse);//捕捉光标位置
	//弹出菜单
	pSubMenu->TrackPopupMenu (TPM_RIGHTALIGN,mouse.x,mouse.y,this);
}

void CAwakeDlg::OnAwakeDel() //删除按钮
{
	//文件数据只能复盖,后一项数据复盖前一项数据。
	char out_path[512];
	GetModuleFileName(NULL,out_path,512);
	char *p = strrchr(out_path,'\\');
	p[1]='\0';
	strcat(out_path,"Mission.dat");

	pclockdlg->ClosetoClock();//从主程序调用闹钟设置时,先关闭所有的定时器
	pclockdlg->FreeData();//先释放所有数据
	CFile file;
	if(file.Open(out_path,CFile::modeReadWrite|CFile::typeBinary))
	{
		long listcount=0;
		BYTE length[4];	
		
		long *plength=(long*)length;
		file.Read((void*)length,4);
	
		listcount=*plength-1;//要删除一项,文件长度要减1

		file.SeekToBegin();//再将文件指针移回到文件最前。
		
		*plength=listcount;//再将长度赋给plength
		file.Write((void*)length,4);

		
		
		for(int i=0;i<listcount;i++)
		{
			long size = (i+number+1)*(sizeof(MISSION))+4;
			file.Seek(size,CFile::begin);//(number+1)指针移到要删除的后面一项
			
			MISSION backmission;
			file.Read((void*)&backmission,sizeof(MISSION));//读取后面一项的数据
			
			size = (i+number)*(sizeof(MISSION))+4;
			file.Seek(size,CFile::begin);//将指针移到前一项
			file.Write((void*)&backmission,sizeof(MISSION));//将数据复盖到前一项

		}

		file.Close();
	}	

	pclockdlg->LoadData();//从文件中读取数据
	pclockdlg->ChecktoClock();//再重新设置定时器
	OnOK();//单击确定后,将销毁窗口
}

////////////////////////////////////////////////////////////////////////
////////				稍后提示				/////////////////////////
////////////////////////////////////////////////////////////////////////

void CAwakeDlg::OnFive()//五分钟之后
{
	int year = m_mission.set_date_year;
	int month = m_mission.set_date_month;
	int day = m_mission.set_date_day;
	int hour = m_mission.set_time_hour;
	int minute = m_mission.set_time_minute;

	minute=minute+5;
	MinuteLate(year,month,day,hour,minute);	

	m_mission.set_date_year=year;
	m_mission.set_date_month=month;
	m_mission.set_date_day=day;
	m_mission.set_time_hour=hour;
	m_mission.set_time_minute=minute;
	LateSave();
	OnOK();
}

void CAwakeDlg::OnTen() //十分钟之后
{
	int year = m_mission.set_date_year;
	int month = m_mission.set_date_month;
	int day = m_mission.set_date_day;
	int hour = m_mission.set_time_hour;
	int minute = m_mission.set_time_minute;

	minute=minute+10;
	MinuteLate(year,month,day,hour,minute);	

	m_mission.set_date_year=year;
	m_mission.set_date_month=month;
	m_mission.set_date_day=day;
	m_mission.set_time_hour=hour;
	m_mission.set_time_minute=minute;
	LateSave();
	OnOK();
}

void CAwakeDlg::OnFifteen() //十五分钟之后
{
	int year = m_mission.set_date_year;
	int month = m_mission.set_date_month;
	int day = m_mission.set_date_day;
	int hour = m_mission.set_time_hour;
	int minute = m_mission.set_time_minute;

	minute=minute+15;
	MinuteLate(year,month,day,hour,minute);	

	m_mission.set_date_year=year;
	m_mission.set_date_month=month;
	m_mission.set_date_day=day;
	m_mission.set_time_hour=hour;
	m_mission.set_time_minute=minute;
	LateSave();
	OnOK();
}

void CAwakeDlg::OnThirty() //三十分钟之后
{
	int year = m_mission.set_date_year;
	int month = m_mission.set_date_month;
	int day = m_mission.set_date_day;
	int hour = m_mission.set_time_hour;
	int minute = m_mission.set_time_minute;

	minute=minute+30;
	MinuteLate(year,month,day,hour,minute);	

	m_mission.set_date_year=year;
	m_mission.set_date_month=month;
	m_mission.set_date_day=day;
	m_mission.set_time_hour=hour;
	m_mission.set_time_minute=minute;

	LateSave();
	OnOK();
	//...
}

//判断分加后,是否到60秒,小时是否到24,日期是否到每月最后一天,判断是否为润年,
void CAwakeDlg::MinuteLate(int &year,int &month,int &day,int &hour,int &minute)
{

	
	if(minute>=60)//如果分钟大于60,则小时加1,分钟减60
	{
		hour=hour+1;
		minute=minute-60;
		if(hour>=24)//如果小时大于24,则天数加1天,小时减24
		{
			day=day+1;
			hour=hour-24;
			switch(month)
			{
				case 1:
				case 3:

⌨️ 快捷键说明

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