寫個定時關機程序自用,界面簡單實用,最終界面以下ide
第一步,新建一個MFC對話框應用程序,拖幾個控件過來,函數
界面以下:spa
而後給下拉列表框,複選按鈕綁定變量,以方便進行操做。3d
CComboBox m_com_hour;
CComboBox m_com_minute;
CComboBox m_com_second;code
第二步,先實現簡單關機功能,不經過文件讀寫進行關鍵。在選擇過期間後,肯定關機後按時關機。orm
1,給下拉列表框添加更改事件,直接右鍵控件->選擇添加事件處理程序,選擇CBN_SELCHANGEblog
而後編輯代碼,添加以下:索引
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 }
如今能夠獲取程序中選擇的時間了,而後就是獲取這些信息,在單擊過肯定按鈕後彈出確認窗口,確認關機時間。資源
在資源窗口直接雙擊確認按鈕進入按鈕按下消息響應程序
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 }
如今能實現關機了,不過程序無法最小化到任務欄,實在不方便,明天繼續研究這個。