www.gusucode.com > VC++带农历、定时关机的多功能小时钟-源码程序 > VC++带农历、定时关机的多功能小时钟-源码程序\code\CalendarDlg.cpp

    // CalendarDlg.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "Calendar.h"
#include "CalendarDlg.h"
#include"MsgWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCalendarDlg dialog

CCalendarDlg::CCalendarDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCalendarDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCalendarDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCalendarDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCalendarDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCalendarDlg, CDialog)
	//{{AFX_MSG_MAP(CCalendarDlg)
	ON_MESSAGE(WM_HOTKEY,OnHotKey)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_EXIT, OnExit)
	ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
	ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_HIDE, OnHide)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCalendarDlg message handlers

BOOL CCalendarDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	// TODO: Add extra initialization here
	//------------------------------------
	::RegisterHotKey(m_hWnd,199,MOD_ALT,'X');
	check1=check2=false;
	m_time.set(this,8,352,30,0);
    m_time.myfun("88888888");
	SetTimer(1,1000,NULL);
	GetDlgItem(IDC_TIP)->SetWindowText("此处填提示信息");
    
		GetDlgItem(IDC_COMBO1)->EnableWindow(false);
	GetDlgItem(IDC_COMBO2)->EnableWindow(false);
		GetDlgItem(IDC_COMBO3)->EnableWindow(false);
	GetDlgItem(IDC_COMBO4)->EnableWindow(false);
	CComboBox *hour1;
	CComboBox *min1;
	CComboBox *hour2;
	CComboBox *min2;
	hour1=(CComboBox*)GetDlgItem(IDC_COMBO1);
	min1=(CComboBox*)GetDlgItem(IDC_COMBO2);
	hour2=(CComboBox*)GetDlgItem(IDC_COMBO3);
	min2=(CComboBox*)GetDlgItem(IDC_COMBO4);

	////////////添加24小时///////////////////
	for(int i=0;i<=23;i++)         
	{
		if(i<10)
		{
		    CString s;
		    s.Format("0%d",i);
			hour1->AddString(s);
			hour2->AddString(s);
		}
		else
		{
			CString ss;
			ss.Format("%d",i);
		    hour1->AddString(ss);
			hour2->AddString(ss);
		}
	}
    /////////////添加60分钟////////////////
	for(i=0;i<=59;i++)
	{
		if(i<10)
		{
		    CString s;
		    s.Format("0%d",i);
			min1->AddString(s);
			min2->AddString(s);
		}
		else
		{
			CString ss;
			ss.Format("%d",i);
		    min1->AddString(ss);
			min2->AddString(ss);
		}
	}

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

void CCalendarDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
		CDialog::OnSysCommand(nID, lParam);
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCalendarDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if (IsIconic())
	{
		

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
		
	}
	else
	{
		CDialog::OnPaint();
	}
	
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCalendarDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

int CCalendarDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
//--------------------------------------------------------------  
   m_oCalendar.Create(CRect(0, 0, 0, 0), this, IDC_CALENDARFRM);
//--------------------------------------------------------------
   return 0;
}
mytime::~mytime()
{
	for(int i=0;i<num;i++)
	delete *(m_pictur+i);
}
mytime::mytime()
{
m_time=_T("");
num=0;
}
void mytime::set(CDialog *parent,int tnum,int tx,int ty,int tspace)
{
	CCalendarDlg *mypar=(CCalendarDlg*)parent;
	for(int i=0;i<num;i++)// 删除以前分配的
		delete *(m_pictur+i);
	// 设置各成员变量
	num=tnum; x=tx;y=ty;space=tspace;
	for(int j=0;j<num;j++)//重新分配
	  m_pictur[j]=new(CStatic);
	for(int k=0;k<num;k++)
	{
		//确定显示位置
		CRect aa1(x+k*(space+12),y,40+x+k*(space+12),40+y);
		m_pictur[k]->Create(NULL,SS_ICON,aa1,mypar,1);// 创建静态图标控件
		m_pictur[k]->ShowWindow(true);
	}
}
void mytime::myfun(CString temp)
{
	
	m_time=temp;
	int mynum=m_time.GetLength();
	
	for(int k=0;k<num-mynum;k++)//添加前面空图标显示
	{
		CImageList m_imgList;
		m_imgList.Create(IDB_BMPTIME,12, 1, RGB(255,255,255));//创建位图链 每个位图12像素
		HICON myico= m_imgList.ExtractIcon(10);	//取出图标
		m_pictur[k]->SetIcon(myico);//设置显示的图标		
	}
	for(int i=k;i<num;i++)//添加数字图标显示
	{
		CImageList m_imgList;
		m_imgList.Create(IDB_BMPTIME,12, 1, RGB(255,255,255));
		HICON myico= m_imgList.ExtractIcon(change(m_time[i-k]));	
		m_pictur[i]->SetIcon(myico);	
	}	
}
// 映射字符到数字
int mytime::change(char a)
{

	switch(a) 
	{
	case '0':
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':return a-'0';
		break;
	case ' ':return 10;
		break;
	case 'A':return 11;
		break;
	case 'P':return 12;
		break;
	case '.':return 13;
		break;
	case '|':return 14;
		break;
	case ':':return 15;
		break;
	case '-':return 16;
		break;
	default: return 10;
	}
}


void CCalendarDlg::OnTimer(UINT nIDEvent) 
{
	if (1==nIDEvent)
	{//表
		static int flag=0;
		CTime curtime=CTime::GetCurrentTime();
		int Sec1=curtime.GetSecond();
		int Sec2=Sec1%10;
		Sec1/=10;
		int minu1=curtime.GetMinute();
		int minu2=minu1%10;
		minu1/=10;
		int hour1=curtime.GetHour();
		int hour2=hour1%10;
		hour1/=10;
		CString kk,hh,mm;
		
		if (0==flag) {
			kk.Format("%d%d|%d%d|%d%d",hour1,hour2,minu1,minu2,Sec1,Sec2);
			hh.Format("%d%d",hour1,hour2);
			mm.Format("%d%d|",minu1,minu2);
			flag=1;}
		else {
			kk.Format("%d%d|%d%d:%d%d",hour1,hour2,minu1,minu2,Sec1,Sec2);
			hh.Format("%d%d",hour1,hour2);
			mm.Format("%d%d",minu1,minu2);
			flag=0;}
		m_time.myfun(kk);
		/////////////////准备关机//////////////////////
		CString hhh,mmm;
		GetDlgItem(IDC_COMBO1)->GetWindowText(hhh);
		GetDlgItem(IDC_COMBO2)->GetWindowText(mmm);
	if(check1&&hhh.CompareNoCase(hh)==0 && mmm.CompareNoCase(mm)==0)
	{
		KillTimer(1);
		/////////首先声明3个全局变量///////////BOOL fResult;TOKEN_PRIVILEGES tkp;HANDLE hToken;
        if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
		{
		    MessageBox("OpenProcessToken failed!");
		}

	    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识
	    tkp.PrivilegeCount = 1;  
	    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
        AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); //调整获得的权限
    
	    if (GetLastError() != ERROR_SUCCESS) 
		{
            MessageBox("AdjustTokenPrivileges enable failed!");
		}

	    fResult =InitiateSystemShutdown( 
             NULL,                                  // 要关的计算机用户名
             "WINDOWS将在上面的时间内关机,请做好保存工作!",  // 显示的消息
             20,                                    // 关机所需的时间
             TRUE,                                 // ask user to close apps 
             FALSE);                               //设为TRUE为重起,设为FALSE为关机
	    if(!fResult) 
		{ 
             MessageBox("InitiateSystemShutdown failed."); 
		} 

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

	    if (GetLastError() != ERROR_SUCCESS) 
		{
             MessageBox("AdjustTokenPrivileges disable failed."); 
		} 

	    ExitWindowsEx(EWX_SHUTDOWN,0);
	}
		GetDlgItem(IDC_COMBO3)->GetWindowText(hhh);
		GetDlgItem(IDC_COMBO4)->GetWindowText(mmm);
	if(check2&&hhh.CompareNoCase(hh)==0 && mmm.CompareNoCase(mm)==0)
	{
		CString msg;
        GetDlgItem(IDC_TIP)->GetWindowText(msg);
		CMsgWnd *pMsgWindow=new CMsgWnd;
        pMsgWindow->SetTime(5,0,5);
        pMsgWindow->SetMessage("消息",msg);
        pMsgWindow->CreateMsgWindow();
        pMsgWindow->ShowWindow(SW_SHOW);
        pMsgWindow->UpdateWindow();
	}

	}
	CDialog::OnTimer(nIDEvent);
}

void CCalendarDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	OnCancel();
}

void CCalendarDlg::OnCheck1() 
{
	// TODO: Add your control notification handler code here
	check1=!check1;
	GetDlgItem(IDC_COMBO1)->EnableWindow(check1);
	GetDlgItem(IDC_COMBO2)->EnableWindow(check1);
}

void CCalendarDlg::OnCheck2() 
{
	// TODO: Add your control notification handler code here
	check2=!check2;
	GetDlgItem(IDC_COMBO3)->EnableWindow(check2);
	GetDlgItem(IDC_COMBO4)->EnableWindow(check2);	
}
void CCalendarDlg::OnHotKey(WPARAM wp,LPARAM lp)//热键
{
	if(wp==199)
	{
		if(IsWindowVisible())
			ShowWindow(SW_HIDE);
		else
			ShowWindow(SW_SHOWNORMAL);
	}
}

void CCalendarDlg::OnDestroy() 
{
	::UnregisterHotKey(m_hWnd,199);//释放注册的热键
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	
}

void CCalendarDlg::OnHide() 
{
    ShowWindow(SW_HIDE);	
}