首页 > 代码库 > MFC定时关机程序的实现1

MFC定时关机程序的实现1

写个定时关机程序自用,界面简单实用,最终界面如下

第一步,新建一个MFC对话框应用程序,拖几个控件过来,

界面如下:

然后给下拉列表框,复选按钮绑定变量,以方便进行操作。

  CComboBox m_com_hour;
  CComboBox m_com_minute;
  CComboBox m_com_second;

第二步,先实现简单关机功能,不通过文件读写进行关键。在选择过时间后,确定关机后按时关机。

  1,给下拉列表框添加更改事件,直接右键控件->选择添加事件处理程序,选择CBN_SELCHANGE

 

 

  然后编辑代码,添加如下:

1 void CAutoShutDownDlg::OnCbnSelchangeCombo1()//
2 {
3     // TODO: 在此添加控件通知处理程序代码
4     int sel = 0;
5     sel  = m_com_hour.GetCurSel();//这个是获取当前鼠标选择的时间的索引,从零开始的
6     hour = sel;//hour是添加的成员变量,还有minute和second,这就是关机时间
7 }

  还有其他的分钟和秒类似这个,这里不多说了,代码如下

 1 void CAutoShutDownDlg::OnCbnSelchangeCombo2()//
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     int sel = 0;
 5     sel  = m_com_minute.GetCurSel();
 6     minute = sel;
 7 }
 8 
 9 
10 void CAutoShutDownDlg::OnCbnSelchangeCombo3()//
11 {
12     // TODO: 在此添加控件通知处理程序代码
13     int sel = 0;
14     sel  = m_com_second.GetCurSel();
15     second = sel;
16 }
View Code

 

现在可以获取程序中选择的时间了,然后就是获取这些信息,在单击过确定按钮后弹出确认窗口,确认关机时间。

  在资源窗口直接双击确认按钮进入按钮按下消息响应程序

 1 void CAutoShutDownDlg::OnBnClickedOk()
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     //复选框是否选中,这个处理是否添加开机启动项,后面再说这个
 5     UINT ischecked = IsDlgButtonChecked(IDC_CHECK1);
 6     
 7     //获取选择的时间
 8     hour = m_com_hour.GetCurSel();
 9     minute = m_com_minute.GetCurSel();
10     second = m_com_second.GetCurSel();
11 
12     //数据进行格式化处理
13     CString str = "";
14     str.Format("%2d时%2d分%2d秒", hour, minute, second);
15 //    GetDlgItem(IDC_STATIC_NOW)->SetWindowText(str);
16     int resoult = MessageBox("确定要在"+str+"关机吗?","是否关机?",MB_OKCANCEL);
17     if (resoult == IDOK)
18     {
19         //是否添加到启动项,这里用来检查是否写入到开机启动项,直接写入注册表,这个后面再说
20         AutoStart(ischecked);
21         //更新程序窗口中显示的关机时间
22         GetDlgItem(IDC_STATIC_SHUT)->SetWindowText(str);
23 
24         FILE  *file;
25         int err;
26         err = fopen_s(&file, "c:\\ShutDownTime.txt", "w+");
27         if (!err)
28         {
29             err = fprintf_s(file, "%02d%02d%02d",hour, minute, second);
30             if (err == EOF)
31             {
32                 MessageBox("请重试!");
33             }
34         }
35         else
36         {
37             MessageBox("文件打开错误");
38         }
39         if (fclose(file) != 0)
40         {
41             MessageBox("文件关闭错误");
42         }
43 
44     }
45 }

现在来看看OnInitDialog()函数里做了什么

  这里主要用来读取上次保存的关机时间

 1 //读取软件设置的默认时间
 2     FILE  *file;
 3     errno_t err;
 4     err = fopen_s(&file, "c:\\ShutDownTime.txt", "a+");
 5     if (!err)
 6     {
 7         fscanf_s(file, "%02d%02d%02d",&hour, &minute, &second);
 8     }
 9     else
10     {
11         MessageBox("文件打开错误");
12     }
13     if (fclose(file) != 0)
14     {
15         MessageBox("文件关闭错误");
16     }
17     str = "";
18     str.Format("%2d时%2d分%2d秒", hour, minute, second);
19     GetDlgItem(IDC_STATIC_SHUT)->SetWindowText(str);
20     SetTimer(0,100,NULL);//定时刷新当前时间
21     SetTimer(1, 1000, NULL);//定时检查是否到达关机时间

  这里主要用了两个定时器来检查关机时间。

  还有一个默认显示的关机时间,当第一次打开程序时,并没有关机时间,这里默认现在当前的时间,关机时间会在确认关机后更新。

 1     GetTime();//获取当前时间,自定义的成员函数
 2     CString str = "";
 3     str.Format("%2d时%2d分%2d秒", hour, minute, second);
 4     GetDlgItem(IDC_STATIC_NOW)->SetWindowText(str);
 5 
 6 
 7     int temp = 0;
 8     int i = 0;
 9     //设置默认显示的小时
10     str = "";
11     for (i = 0; i <= 23; i++)
12     {
13         str.Format("%2d时", i);
14         m_com_hour.AddString(str);
15     }
16     m_com_hour.SetCurSel(hour);
17     //设置默认显示的分钟
18     str = "";
19 
20     for (i = 0; i <= 59; i++)
21     {
22         str.Format("%2d分", i);
23         m_com_minute.AddString(str);
24     }
25     m_com_minute.SetCurSel(minute);
26     //设置默认显示的妙
27     str = "";
28 
29     for (i = 0; i <= 59; i++)
30     {
31         str.Format("%2d秒", i);
32         m_com_second.AddString(str);
33     }
34     m_com_second.SetCurSel(second);

其中GetTime()为自定义的成员函数,用于获取当前时间

1 void CAutoShutDownDlg::GetTime()
2 {
3     CTime time1 = CTime::GetCurrentTime();//获取系统当前时间
4     hour = time1.GetHour();
5     minute = time1.GetMinute();
6     second = time1.GetSecond();
7 }

  现在能实现关机了,不过程序没法最小化到任务栏,实在不方便,明天继续研究这个。