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