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); }