2023年12月14日发(作者:)

VC+ +课程设计

院 系:

班 级:

姓 名:

合 作 者:

定时自动关机系统

VC++课程设计任务书

一、题目:自动关机系统二、设计要求

(1)本次课程设计由XX和XX同学合作完成。

(2)查阅相关资料,自学具体课题中涉及到的新知识。

(3)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。

(4)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。

三、课程设计工作量

完成的程序量在400行有效程序行以上,不得抄袭。

四、课程设计工作计划

2009年12月28日,指导教师讲课,学生根据题目准备资料,需求分析;

2009年12月29~30日,进行总体方案设计;

2009年12月31日,完成自己的程序模块并通过编译;

2010年1月1~5日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;

2010年1月6~7日,验收、开始撰写课程设计报告;

2010年1月7日,提交课程设计报告和软件。

指导教师签章:

教研室主任签章

VC++课程设计指导教师评语与成绩

指导教师评语:

课程设计表现成绩:

课程设计验收成绩:

课程设计报告成绩:

课程设计 总成绩:

指导教师签章

2009年 月 日

目 录

一.概述-----------------------------------------------------------------3

二.软件总体方案设计-----------------------------------------------4

三.详细设计-----------------------------------------------------------5

四.程序运行说明----------------------------------------------------17

五.课程设计总结----------------------------------------------------19

六.程序清单----------------------------------------------------------19

七. 参考文献---------------------------------------------------------28

2

VC+ +课程设计报告

题目:定时关机系统

一、 概述

定时关机系统是一款能自动与手动处理:定时关机、定时重启、计时重启、计时关机以及方便用户增加了一键关机、一键重启、一键注销等的定时处理事务软件。

定时关机系统可以在Windows操作系统下的定时关机、自动关机的软件。它能满足有各种关机控制需求的用户。 待机关机模式可帮您节省您的电费,当您长时间(超过您所设定的待机时间)不用电脑时自动执行关机,以减少不必要的电费开销。 指定时间机关机模式可让您定时定点的完成自动关机操作,此功能特方便于需要长时间下载东西的用户,可以在东西下载完成之后让电脑自动关机.

在电脑普及的当代,我们迫切需要一种软件来比较自动化的管理自己的电脑,那么自动关机系统就使你的操作方便起来。通过分析,我们首先需要自动关机要满足它的定时关机功能,但是,定时关机有时也不能完全满足我们的需要,我们还有时就需要设定一定的时间来对电脑进行关机操作,那我们还想到要给这个定时关机还增加另外一种功能,那就是计时关机功能。

在这里,我们想着的不一定是关机就不再开机,我们有时需要对电脑关机后重起操作,而且又不想是当前时刻,那我们就又想着要为定时关机再增加另外一种功能,重起功能,在这里我们也给重起功能设置了定时功能,我们就可以对你的电脑进行相应的操作。

本着方便用户的思想,在这个软件中我们给软件又加上了一键关机,一键重起,一键注销来更加方便用户的操作。

另外,这个软件添加了系统托盘图标,要软件运行后,我们可以把软件最小化到系统托盘,这样可能不妨碍我们进行其它操作。

3

二、 软件总体方案设计

1、软件设计介绍

本软件旨在对电脑进行自动化管理,当你的电脑在无人职守的情况下,如果,这个自动关机软件提供了定时关机,计时关机、定时重起,计时重起,另外还有一键关机、一键重起,一键注消功能,以方便用户的各种操作,在计时关机和计时重起功能中,考虑到计时的时间 不是太长,我们能计时的上下限是0到100分钟,以分钟为单位不计时。另外还增加了系统托盘图标使软件在工作的时候不影响其它软件的使用。这也是这个软件的一大特点。

2、开发环境

Microsoft Visual C++ 6.0

3、软件总体框架图:

用户

设定

定时系统

处理

系统操作

图1 总体框架图

4、程序总体流程图(如下):

开始

4

等待用户选择

N

关机?

Y

关机提示对话框计时

取消

计时时间到或确定?

确定关机动作

结束

图2 软件流程图

三、软件详细设计

程序中主要使用了InitiateSystemShutDown()函数,它可以关掉网络和本地任意一台指定的计算机。其函数原形为:

BOOL InitiateSystemShutDown(

LPTSTR lpMachineName,

LPTSTR lpMessage,

DWORD dwTimeout,

BOOL bForceAppsClosed,

BOOL bRebootAfterShutdown)

其中第一个参数是欲关掉计算机名字的地址;第二个参数是欲显示对话框的地址;第三个参数是对话框显示的时间;第四个参数是是否未保存文件就强行关机的标志;最后一个参数是关机后是否重启计算机的标志。

1、选择【NEW | MFC AppWizard(exe)】,新建MFC工程文件,单击【OK】按钮,选择【Dialog based】,建立基于对话框的应用程序。依次单击【Next】,选项默认,建立工程对话框。在对话框中添加10个Static Text 控件,5个Button控件,4个Combo Box控件,4个Radio Button控件,2个Edit Box控件,2个Spin控件,2个Group Box控件,界面设置如下:

5

控件属性如下表1:

控件类型

Button

Button

Button

Button

Button

ComboBox

Radio

Button

Edit Box

Spin

Static

6

ID

IDC_START

IDC_BUTTON_SHUTDOWN

IDC_BUTTON_RESTART

IDC_BUTTON_LOGOFF

IDC_HIDE

IDC_SET_HOUR

IDC_SET_MINUTE

IDC_SET_RESTART_HOUR

IDC_SET_RESTART_MINUTE

IDC_RADIO_DAOJISHI

IDC_RADIO_DINGSHI

IDC_RADIO_JISHI_RESTART

IDC_RADIO_DINGSHI_RESTART

IDC_EDIT_SHUTDOWN

IDC_EDIT_RESTART

IDC_SPIN_SHUTDOWN

IDC_SPIN_RESTART

IDC_STATIC_COUNTTIME

IDC_STATIC_RESTART_COUNTTIME

IDC_STATIC_TIME

属性值

起动

一键关机

一键重起

一键注消

隐藏

计时关机

定时关机

计时重起

定时重起

通过ClassWizard设置各控件成员变量(如下表2):

Control ID

Type Member Variables

IDC_EDIT_RESTART

int m_editRestart

IDC_EDIT_RESTART

CEdit m_editRestartControl

IDC_EDIT_SHUTDOWN

int m_editShutdown

IDC_EDIT_SHUTDOWN

CEdit m_editControl

IDC_SET_HOUR

CString m_close_hour

IDC_SET_HOUR

CComboBox m_cSetHour

IDC_SET_MINUTE

CString m_close_min

IDC_SET_MINUTE

CComboBox m_cSetMinute

IDC_SET_RESTART_HOUR

CString m_restart_hour

IDC_SET_RESTART_HOUR

CComboBox m_SetRestartHour

IDC_SET_RESTART_MINUTE

CString m_restart_min

IDC_SET_RESTART_MINUTE

CComboBox m_SetRestartMinute

IDC_SPIN_RESTART

CSpinButtonCtrl m_spinRestart

IDC_SPIN_SHUTDOWN

CSpinButtonCtrl m_spinShutdown

IDC_STATIC_COUNTTIME

CStatic m_ControlCountTime

IDC_STATIC_RESTART_COUNTCStatic m_ControlRestartCountTime

TIME

IDC_STATIC_TIME

CStatic m_displaytime

另外,我们还需要在对话框类中添加以下变量:

Public:

Bool m_bShutdownOrRestart;

int m_iCountTime;

bool m_bFlag;

BOOL begin; //看是否按下了START按钮

NOTIFYICONDATA m_tnid;//设置系统托盘

HANDLE hToken;

TOKEN_PRIVILEGES tkp;

BOOL fResult;

2、修改对话框类初始化函数OnInitDialog,初始化后会在系统任务栏显示自动关机系统的托盘图标,如下图,

图4 系统托盘图标

7

始化函数OnInitDialog代码如下:

BOOL CShutDownDlg::OnInitDialog()

{

SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

CenterWindow(GetDesktopWindow());//让窗口处于屏幕中间

SetWindowText("自动关机程序");

SetTimer(1,200,NULL);

begin=false;

CString str;

for(int i=0;i<=23;i++)

{

if(i<10) {

("0%d",i);

m_ing(str);

m_ing(str);

}

else{

("%d",i);

m_ing(str);

m_ing(str);

}

}

m_Sel(0);

m_Sel(0);

for(i=0;i<=59;i++)

{

if(i<10) {

("0%d",i);

m_ing(str);

m_ing(str);

}

else{

("%d",i);

m_ing(str);

m_ing(str);

}

}

m_Sel(0);

m_Sel(0);

m_dy(&m_editControl);

m_ge(0,100);

m_(0);

m_dy(&m_editRestartControl);

m_ge(0,100);

m_(0);

m_=sizeof(NOTIFYICONDATA);

m_=this->m_hWnd;//设置图标对应的窗口

m_=NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性

8

m_ackMessage=MYWM_NOTIFYICON;//应用程序的回调消息

CString szTooltip;

szTooltip=_T("自动关机程序");

_tcscpy(m_,szTooltip);//帮助信息

m_=IDR_MAINFRAME;//应用程序图标

HICON hIcon;

hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_=hIcon;//图标句柄

PNOTIFYICONDATA m_ptnid=&m_tnid;

::Shell_NotifyIcon(NIM_ADD,m_ptnid);//增加图标到系统托盘

if(hIcon)::DestroyIcon(hIcon);

}

3、为窗口类添加WM_TIMER消息代码:

void CShutDownDlg::OnTimer(UINT nIDEvent)

{

CTime time=CTime::GetCurrentTime();//获取当前时间

int year=r();

int month=th();

int day=();

int hour=r();

int minute=ute();

int second=ond();

CString yy,dd,mm,hh,mins,ss;

CString total;

("%d",year);

("%d",month);

("%d",day);

if(hour<10)("0%d",hour);

else ("%d",hour);

if(minute<10)("0%d",minute);

else ("%d",minute);

if(second<10)("0%d",second);

else ("%d",second);

total=yy+"-"+mm+"-"+dd+" "+hh+":"+mins+":"+ss;

m_dowText(total);

switch(m_iRadio)//

{

case 0://计时关机

if(!begin) {

m_editShutdown=m_()-65500-36;

m_iCountTime=m_()-65500-36;

m_iCountTime*=60*5;

}

UpdateData(false);

if(begin) {

if(m_iCountTime>=0)m_iCountTime--;

CString iCountTime;

("%d 秒",m_iCountTime/5);

m_dowText(iCountTime);

9

if(m_iCountTime==0) {

SetStartButton();

fResult=InitiateSystemShutdown("127.0.0.1",

"Windows将在上面的时间内关机,请做好保存工作!",

60, //关机所需的时间

TRUE,

m_bShutdownOrRestart);

}

}

break;

case 1://定时关机

UpdateData(TRUE);

if(begin&&m_close_eNoCase(hh)==0&&_close_eNoCase(mins)==0 ) {

if(ss=="00"&&m_bFlag) {

SetStartButton();

m_bFlag=false;

AutoShutdown AutoSDDlg;

l();

}else if(ss=="01"&& !m_bFlag)m_bFlag=true;

}

break;

case 2://计时重起

if(!begin) {

m_editRestart=m_()-65500-36;

m_iCountTime=m_()-65500-36;

m_iCountTime*=60*5;

}

UpdateData(false);

if(begin) {

if(m_iCountTime>=0)m_iCountTime--;

CString iCountTime;

("%d 秒",m_iCountTime/5);

m_dowText(iCountTime);

if(m_iCountTime==0) {

SetStartButton();

fResult=InitiateSystemShutdown("127.0.0.1",

"Windows将在上面的时间内关机,请做好保存工作!",

60, //关机所需的时间

TRUE,

m_bShutdownOrRestart);

}

}

break;

case 3://定时重起

UpdateData(TRUE); if(begin&&m_restart_eNoCase(hh)==0&&m_restart_eNoCase(mins)==0 ) {

if(ss=="00"&&m_bFlag) {

10

}

SetStartButton();

m_bFlag=false;

AutoShutdown AutoSDDlg;

l();

}else if(ss=="01"&& !m_bFlag)m_bFlag=true;

}

break;

default: break;

}

CDialog::OnTimer(nIDEvent);

4、为【起动】、【一键关机】、【一键重起】、【一键注消】、【隐藏】按钮添加消息代码:

void CShutDownDlg::OnStart()

{

SetStartButton();//为自定义函数

}

void CShutDownDlg::OnButtonShutdown()

{

fResult=InitiateSystemShutdown("127.0.0.1", //要关的计算机用户名

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,

FALSE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnButtonRestart()

{

fResult=InitiateSystemShutdown("127.0.0.1", //要关的计算机用户名

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,

TRUE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnButtonLogoff()

{

ExitWindowsEx(EWX_LOGOFF,0);

}

void CShutDownDlg::OnHide()

{

ShowWindow(SW_HIDE);

}

5、为4个Radio Button 控件添加消息代码:

void CShutDownDlg::OnRadioDingshi()

{

m_iRadio=1;

m_bShutdownOrRestart=false;

}

11

void CShutDownDlg::OnRadioDaojishi()

{

m_iRadio=0;

m_bShutdownOrRestart=false;

m_iCountTime=m_()-65500-36;

}

void CShutDownDlg::OnRadioJishiRestart()

{

m_iRadio=2;

m_bShutdownOrRestart=true;

m_iCountTime=m_()-65500-36;

}

void CShutDownDlg::OnRadioDingshiRestart()

{

m_iRadio=3;

m_bShutdownOrRestart=true;

}

6、设计菜单项(如下图):

图5 窗口菜单 图6 右键菜单

为菜单项设置消息响应函数:

void CShutDownDlg::OnMenuStop()

{

CButton * button;

button=(CButton *)GetDlgItem(IDC_START);

button->SetWindowText("开始");

begin=false;

}

void CShutDownDlg::OnMenuStart()

{

CButton * button;

button=(CButton *)GetDlgItem(IDC_START);

if(!begin)

{

begin=true;

button->SetWindowText("停止");

}

}

12

void CShutDownDlg::OnMenuQuit()

{

PostQuitMessage(0);

}

void CShutDownDlg::OnRestart()

{

fResult=InitiateSystemShutdown("127.0.0.1",

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,

TRUE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnShutdown()

{

fResult=InitiateSystemShutdown("127.0.0.1",

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,

FALSE); //设为TRUE为重起,设为FALSE为关机

}

7、为托盘处理消息添加代码:

LRESULT CShutDownDlg::WindowProc(UINT message, WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case MYWM_NOTIFYICON://接收用户消息1000

if(lParam==WM_LBUTTONDBLCLK) {

//鼠标双击时主窗口出现

AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);

}

else if(lParam==WM_RBUTTONDOWN)//鼠标右键单击弹出选单

{

CMenu menu;

nu(IDR_MENU1);

CMenu* pMenu=Menu(0);

CPoint pos;

GetCursorPos(&pos);

pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,

pos.x,pos.y,AfxGetMainWnd());//指定位置显示快捷菜单,并跟踪菜单项的选择

}

break;

case WM_SYSCOMMAND://接收系统消息

if(wParam==SC_MINIMIZE) {

//接收到最小化消息时主窗口隐藏

13

AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);

return 0;

}

break;

}

return CDialog::WindowProc(message, wParam, lParam);

}

8、实现自定义函数SetStartButton():

void CShutDownDlg::SetStartButton()

{

CButton * button;

button=(CButton *)GetDlgItem(IDC_START);

if(!begin) {

begin=true;

button->SetWindowText("停止");

}

else{

begin=false;

button->SetWindowText("开始");

}

}

9、为提示关机增加对话框(如下图):

图7 关机对话框

并为该对话框添加新类,为这个新类添加计时功能:

用类向导添加OnTimer函数

void AutoShutdown::OnTimer(UINT nIDEvent)

{

CTime currentTime=CTime::GetCurrentTime();

int iSecond=ond();

int iTime;

iTime=59-iSecond;

CString sTime;

("%d",iTime);

m_dowText("你的电脑将在"+sTime+"秒内关14

闭!");

if(sTime=="0"||m_bFlag) {

KillTimer(1);

if(!OpenProcessToken(GetCurrentProcess(),

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,& hToken))

MessageBox("OpenProcessTokenfailed!"); LookupPrivilegeValue("127.0.0.1",SE_SHUTDOWN_NAME,&eges[0].Luid);//获取一个进程在本地系统中的权限

egeCount=1; eges[0].Attributes=SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);

if(GetLastError()!=ERROR_SUCCESS)

MessageBox("AdjustTokenPrivileges enable failed!");

fResult=InitiateSystemShutdown("127.0.0.1", //要关的计算机用户名

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,

TRUE); //设为TRUE为重起,设为FALSE为关机

if(!fResult)MessageBox("InitiateSystemShutdown failed!");

eges[0].Attributes=0; 、AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);

if(GetLastError()!=ERROR_SUCCESS)

MessageBox("AdjustTokenPrivileges enable failed!");

ExitWindowsEx(EWX_SHUTDOWN,0);

}

CDialog::OnTimer(nIDEvent);

}

10、改变对话框的背景颜色

可以采用以下两种方法之一实现:

1)调用CWinApp类的成员函数SetDialogBkColor来实现。

在CShutDownApp ::InitInstance()中添加如下代码:

BOOL CShutDownApp :: InitInstance ( )

{

CShutDownApp dlg;

m_pMainWnd = &dlg;

//先于DoModal()调用,将对话框设置为蓝色背景、红色文本

SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));

int nResponse = l();

}

--------编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意15

的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变

应用程序中所有的对话框颜色,并不能针对某一个指定的对话框

2)

重载OnPaint(),即WM_PAINT消息。有关代码如下:

void CShutDownApp::OnPaint()

{

if (IsIconic())

else

{

CRect rect;

CPaintDC dc(this);

GetClientRect(rect);

lidRect(rect,RGB(0,255,0)); //设置为绿色背景

CDialog::OnPaint();

}

11、改变控件背景颜色

1) 定义一个变量

class CShutDownDlg : public CDialog

{

// Construction

public:

CBrush m;

};

2) 实现的功能

HBRUSH CShutDownDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT

nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor==CTLCOLOR_STATIC)

{

pDC->SetTextColor(RGB(29,0,255)); //设置控件文本的颜色

pDC->SetBkColor(RGB(179,200,255)); //设置控颜色件文本背景的颜色

// pDC->SetBkColor(RGB(255,200,255));

// return(HBRUSH)m;

}

// TODO: Change any attributes of the DC here

// TODO: Return a different brush if the default is not desired

return hbr;

16

四、程序运行说明

1、建立基于对话框的应用程序,建立工程对话框。在对话框中添加10个Static Text 控件,5个Button控件,4个Combo Box控件,4个Radio Button控件,2个Edit Box控件,2个Spin控件,2个Group Box控件,界面设置运行如下:

2、在对话框添加了菜单包括菜单、关机、帮助以及图标和托盘,并实现其功能。具体如下:

菜单项:

图标:

托盘:

17

运行结果如下:

3、在关机时会有一个小的对话框提示信息。

4、所有功能实现后,为了看起来更美观,我们给对话框和控件添加颜色。

18

五.课程设计总结

经过两个星期的坚持不懈的努力,设计终于圆满完成。感谢在设计的整个过程中,给予我指导的老师,给予我帮助和建议的同学们,若没有你们,就不会有现在这小小成果的存在。

首先我要感谢王老师,在上课时教给了我们最基础的东西,才使我们能够完成这次的设计,并且王老师在我们遇到困难的时候总是给与我们漠大的鼓励。

我还要感谢所有帮助过我的同学们,设计过程里也有理不开头绪的地方打成的结,感谢老师和同学们的鼓励与支持,让我振奋精神勇往直前,耐心的通过一个个难关。

这两周的设计,使我们的自动关机软件有了较完善的功能,但是仍有许多可以改进的地方,比如可以给软件加上密码,这样就可以保护自己的设定不受旁人干扰,由于时间何能力有限,我们只做到这步。不过,以后我们会继续努力的,把所学知识充分应用于实际情况之中。

六、程序清单

#include "stdafx.h"

#include "ShutDown.h"

#include "ShutDownDlg.h"

#include"AutoShutdown.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

class CAboutDlg : public CDialog

{

public:

protected:

};

CShutDownDlg::CShutDownDlg(CWnd* pParent /*=NULL*/)

: CDialog(CShutDownDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CShutDownDlg)

m_close_min = _T("");

19

m_close_hour = _T("");

m_restart_hour = _T("");

m_restart_min = _T("");

m_editShutdown = 0;

m_iRadio = -1;

m_editRestart = 0;

//}}AFX_DATA_INIT

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CShutDownDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CShutDownDlg)

DDX_Control(pDX, IDC_SET_RESTART_HOUR, m_cSetRestartHour);

DDX_Control(pDX, IDC_SET_RESTART_MINUTE, m_cSetRestartMinute);

DDX_Control(pDX,IDC_STATIC_RESTART_COUNTTIME,

m_ControlRestartCountTime);

DDX_Control(pDX, IDC_EDIT_RESTART, m_editRestartControl);

DDX_Control(pDX, IDC_SPIN_RESTART, m_spinRestart);

DDX_Control(pDX, IDC_STATIC_COUNTTIME, m_ControlCountTime);

DDX_Control(pDX, IDC_EDIT_SHUTDOWN, m_editControl);

DDX_Control(pDX, IDC_SPIN_SHUTDOWN, m_spinShutdown);

DDX_Control(pDX, IDC_STATIC_TIME, m_displaytime);

DDX_Control(pDX, IDC_SET_MINUTE, m_cSetMinute);

DDX_Control(pDX, IDC_SET_HOUR, m_cSetHour);

DDX_CBString(pDX, IDC_SET_MINUTE, m_close_min);

DDX_CBString(pDX, IDC_SET_HOUR, m_close_hour);

DDX_CBString(pDX, IDC_SET_RESTART_MINUTE, m_restart_min);

DDX_CBString(pDX, IDC_SET_RESTART_HOUR, m_restart_hour);

DDX_Text(pDX, IDC_EDIT_SHUTDOWN, m_editShutdown);

DDX_Radio(pDX, IDC_RADIO_DAOJISHI, m_iRadio);

DDX_Text(pDX, IDC_EDIT_RESTART, m_editRestart);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CShutDownDlg, CDialog)

//{{AFX_MSG_MAP(CShutDownDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_CBN_SELCHANGE(IDC_THE_HOUR, OnSelchangeTheHour)

ON_CBN_SELCHANGE(IDC_THE_MINUTE,

OnSelchangeTheMinute)

20

ON_BN_CLICKED(IDC_START, OnStart)

ON_WM_TIMER()

ON_COMMAND(ID_DISPLAY, OnDisplay)

ON_COMMAND(ID_ABOUT, OnAbout)

ON_COMMAND(ID_QUIT, OnQuit)

ON_COMMAND(ID_STOP, OnStop)

ON_WM_DESTROY()

ON_WM_LBUTTONDBLCLK()

ON_WM_LBUTTONDOWN()

ON_BN_CLICKED(IDC_HIDE, OnHide)

ON_COMMAND(ID_MENU_STOP, OnMenuStop)

ON_COMMAND(ID_MENU_START, OnMenuStart)

ON_COMMAND(ID_MENU_QUIT, OnMenuQuit)

ON_COMMAND(IDC_SHUTDOWN, OnShutdown)

ON_COMMAND(IDC_RESTART, OnRestart)

ON_COMMAND(IDC_LOGOFF, OnLogoff)

ON_BN_CLICKED(IDC_RADIO_DINGSHI, OnRadioDingshi)

ON_BN_CLICKED(IDC_RADIO_DAOJISHI, OnRadioDaojishi)

ON_BN_CLICKED(IDC_BUTTON_SHUTDOWN, OnButtonShutdown)

ON_BN_CLICKED(IDC_BUTTON_RESTART, OnButtonRestart)

ON_BN_CLICKED(IDC_BUTTON_LOGOFF, OnButtonLogoff)

ON_BN_CLICKED(IDC_RADIO_JISHI_RESTART, OnRadioJishiRestart)

ON_BN_CLICKED(IDC_RADIO_DINGSHI_RESTART, OnRadioDingshiRestart)

ON_BN_CLICKED(ID_STOP, OnStop)

ON_WM_CTLCOLOR()

ON_WM_CANCELMODE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CShutDownDlg::OnInitDialog()

{

CDialog::OnInitDialog();

SetWindowPos(&CWnd::wndTopMost,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);

//CenterWindow(GetDesktopWindow());//让窗口处于屏幕中间

SetWindowText("自动关机程序");

SetTimer(1,200,NULL);

begin=false;

CString str;

for(int i=0;i<=23;i++)

{

if(i<10){//CString str1;

("0%d",i);

m_ing(str);

m_ing(str);

}

21

else { //CString str2;

("%d",i);

m_ing(str);

m_ing(str);

} }

m_Sel(0);

m_Sel(0);

for(i=0;i<=59;i++){

if(i<10)

{//CString str1;

("0%d",i);

m_ing(str);

m_ing(str);

}

else {//CString str2;

("%d",i);

m_ing(str);

m_ing(str);

}}

m_Sel(0);m_Sel(0);

m_=sizeof(NOTIFYICONDATA);

m_=this->m_hWnd;//设置图标对应的窗口

m_=NIF_MESSAGE | NIF_ICON | NIF_TIP;//图标属性

m_ackMessage=MYWM_NOTIFYICON;//;1000//应用程序的回调消息ID//NOTIFYICONDATA

CString szTooltip;

szTooltip=_T("自动关机程序");

_tcscpy(m_,szTooltip);//帮助信息

m_=IDR_MAINFRAME;//应用程序图标

HICON hIcon;

hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_=hIcon;//图标句柄

PNOTIFYICONDATA m_ptnid=&m_tnid;

::Shell_NotifyIcon(NIM_ADD,m_ptnid);//增加图标到系统托盘

if(hIcon)::DestroyIcon(hIcon);

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{CString strAboutMenu;

ring(IDS_ABOUTBOX);

if (!y())

{pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

22

}

void CShutDownDlg::OnSysCommand(UINT nID, LPARAM lParam)

{if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{CAboutDlg dlgAbout;

l();

}

else{

CDialog::OnSysCommand(nID, lParam);

} }

void CShutDownDlg::OnPaint()

{ if (IsIconic())

{CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) eHdc(), 0);

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect; GetClientRect(&rect);

int x = (() - cxIcon + 1) / 2; int y = (() - cyIcon + 1) / 2;

on(x, y, m_hIcon);

}

else{ CRect rect; CPaintDC dc(this); GetClientRect(rect);

lidRect(rect,RGB(190,200,245)); //设置为绿色背景

CDialog::OnPaint();

} }

HCURSOR CShutDownDlg::OnQueryDragIcon()

{ return (HCURSOR) m_hIcon;

}

void CShutDownDlg::OnSelchangeTheHour()

{ CComboBox * hour;

hour=(CComboBox*)GetDlgItem(IDC_HOUR);

hour->GetWindowText(m_close_hour);}

void CShutDownDlg::OnSelchangeTheMinute()

{ CComboBox * min;

min=(CComboBox*)GetDlgItem(IDC_MINUTE);

min->GetWindowText(m_close_min);}

void CShutDownDlg::OnStart()

23

} }

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

m_dy(&m_editControl);

m_ge(0,100);m_(0);

m_dy(&m_editRestartControl);

m_ge(0,100);m_(0);

m_bFlag=true;

return TRUE; // return TRUE unless you set the focus to a control

{ SetStartButton(); }

LRESULT CShutDownDlg::WindowProc(UINT message, WPARAM wParam,

LPARAM lParam)

{ switch(message)

{case MYWM_NOTIFYICON://接收用户消息1000

if(lParam==WM_LBUTTONDBLCLK) //鼠标双击时主窗口出现

{ AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);

}

else if(lParam==WM_RBUTTONDOWN)//鼠标右键单击弹出选单

{ CMenu menu;nu(IDR_MENU1);

CMenu* pMenu=Menu(0);

CPoint pos;GetCursorPos(&pos);

pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,

pos.x,pos.y,AfxGetMainWnd());//指定位置显示快捷菜单,并跟踪菜单项的选择

}break;

case WM_SYSCOMMAND://接收系统消息

if(wParam==SC_MINIMIZE) //接收到最小化消息时主窗口隐藏

{ AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);return 0;

} break; }

return CDialog::WindowProc(message, wParam, lParam);}

void CShutDownDlg::OnTimer(UINT nIDEvent)

{CTime time=CTime::GetCurrentTime();//获取当前时间

int year=r();int month=th();int day=();

int hour=r();int minute=ute();int second=ond();

CString yy,dd,mm,hh,mins,ss;CString total;("%d",year);

("%d",month);("%d",day);

if(hour<10)("0%d",hour);else ("%d",hour);

if(minute<10)("0%d",minute);else ("%d",minute);

if(second<10)("0%d",second);else ("%d",second);

total=yy+"-"+mm+"-"+dd+" "+hh+":"+mins+":"+ss;

//CStatic *displaytime;//displaytime=(CStatic*)GetDlgItem(IDC_STATIC);

m_dowText(total);

switch(m_iRadio)//

{ case 0://计时关机

if(!begin)

{m_editShutdown=m_()-65500-36;

m_iCountTime=m_()-65500-36;

m_iCountTime*=60*5;

}UpdateData(false);

if(begin)

{ if(m_iCountTime>=0)m_iCountTime--;

CString iCountTime;("%d 秒",m_iCountTime/5);

m_dowText(iCountTime);// IDC_STATIC_COUNTTIME

24

if(m_iCountTime==0)

{SetStartButton();

fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,m_bShutdownOrRestart);//设为TRUE为重起,设为FALSE为关机

} } break;

case 1://定时关机

UpdateData(TRUE);

if(begin&&m_close_eNoCase(hh)==0&&m_close_eNoCase(mins)==0 )// && ss=="00"

{if(ss=="00"&&m_bFlag){

SetStartButton();m_bFlag=false;

AutoShutdown AutoSDDlg;l();

}else if(ss=="01"&& !m_bFlag){m_bFlag=true;

}}break;

case 2://计时重起

if(!begin){

m_editRestart=m_()-65500-36;

m_iCountTime=m_()-65500-36;m_iCountTime*=60*5;

}UpdateData(false);

if(begin){

if(m_iCountTime>=0)m_iCountTime--;

CString iCountTime;

("%d 秒",m_iCountTime/5);

m_dowText(iCountTime);//

IDC_STATIC_COUNTTIME

if(m_iCountTime==0)

{SetStartButton();

fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,m_bShutdownOrRestart); //设为TRUE为重起,设为FALSE为关机

}}break;

case 3://定时重起

UpdateData(TRUE);

if(begin&&m_restart_eNoCase(hh)==0&&

m_restart_eNoCase(mins)==0 )// && ss=="00"

{ if(ss=="00"&&m_bFlag){

SetStartButton();m_bFlag=false;

AutoShutdown AutoSDDlg;l();

}else if(ss=="01"&& !m_bFlag)

25

{m_bFlag=true;}}break;

default: break }

CDialog::OnTimer(nIDEvent);

}

void CShutDownDlg::OnDisplay()

{ ShowWindow(1);

//::Shell_NotifyIcon(NIM_DELETE,&m_tnid);

}

void CShutDownDlg::OnAbout()

{CAboutDlg AboutDlg; l();

}

void CShutDownDlg::OnQuit()

{PostQuitMessage(0);}

void CShutDownDlg::OnStop()

{begin=false;ShowWindow(1);//::Shell_NotifyIcon(NIM_DELETE,&m_tnid);

}

void CShutDownDlg::OnDestroy()

{CDialog::OnDestroy(); ::Shell_NotifyIcon(NIM_DELETE,&m_tnid);

}

void CShutDownDlg::OnLButtonDblClk(UINT nFlags, CPoint point)

{CDialog::OnLButtonDblClk(nFlags, point);

}

void CShutDownDlg::OnLButtonDown(UINT nFlags, CPoint point)

{CDialog::OnLButtonDown(nFlags,

point)PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

CDialog::OnLButtonDown(nFlags, point);

}

void CShutDownDlg::OnHide()

{ShowWindow(SW_HIDE);}

void CShutDownDlg::OnMenuStop()

{CButton * button;button=(CButton *)GetDlgItem(IDC_START);

button->SetWindowText("开始");begin=false;

}

void CShutDownDlg::OnMenuStart()

{CButton * button;

button=(CButton *)GetDlgItem(IDC_START);

if(!begin)

{begin=true; button->SetWindowText("停止");} }

void CShutDownDlg::OnMenuQuit()

{PostQuitMessage(0);}

void CShutDownDlg::OnShutdown()

{fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名26

192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,FALSE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnRestart()

{fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,TRUE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnLogoff()

{ExitWindowsEx(EWX_LOGOFF,0);}

void CShutDownDlg::OnRadioDingshi()

{m_iRadio=1;m_bShutdownOrRestart=false;

}

void CShutDownDlg::OnRadioDaojishi()

{m_iRadio=0;m_bShutdownOrRestart=false;

m_iCountTime=m_()-65500-36;}

void CShutDownDlg::OnButtonShutdown()

{

fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,FALSE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnButtonRestart()

{fResult=InitiateSystemShutdown("127.0.0.1", //NULL要关的计算机用户名192.168.1.112

"Windows将在上面的时间内关机,请做好保存工作!",//提示信息

60, //关机所需的时间

TRUE,TRUE); //设为TRUE为重起,设为FALSE为关机

}

void CShutDownDlg::OnRadioJishiRestart()

{m_iCountTime=m_()-65500-36;

m_iRadio=2;m_bShutdownOrRestart=true;

}

void CShutDownDlg::OnRadioDingshiRestart()

{m_iRadio=3;m_bShutdownOrRestart=true;}

void CShutDownDlg::SetStartButton()

{CButton * button;button=(CButton *)GetDlgItem(IDC_START);

if(!begin){

27

begin=true; button->SetWindowText("停止");}

else{

begin=false; button->SetWindowText("开始");

}}

BOOL CShutDownDlg::OnCommand(WPARAM wParam, LPARAM lParam)

{return CDialog::OnCommand(wParam, lParam);

}

HBRUSH CShutDownDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT

nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor==CTLCOLOR_STATIC)

{ pDC->SetTextColor(RGB(29,0,255)); //设置控件文本的颜色

pDC->SetBkColor(RGB(179,200,255)); //设置控颜色件文本背景的颜色

// pDC->SetBkColor(RGB(255,200,255));// return(HBRUSH)m; }

return hbr;

}

void CShutDownDlg::OnCancelMode()

{CDialog::OnCancelMode();}

参考文献

[1]张红军,耿随心,陈春林·Visual C++编程详解·北京:科学出版社,2002.10

[2]任哲等·MFC Windows应用程序设计(第二版)·北京:清华大学出版社,2007

[3]唐彬、刘超·Visual C++案例开发集锦·北京:电子工业出版社,2005

[4]杨红云、尹立民等·Visual C++程序设计视频教程·北京:电子工业出版社,2005

28