// PocketClock.cpp:Ϊ.
// 

#include "stdafx.h" 
#include "PocketClock.h" 
#include "PocketClockDlg.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 

//////////////////////////////////////////////////////// 
// CPocketClockApp 

BEGIN_MESSAGE_MAP(CPocketClockApp, CWinApp)     
 //{{AFX_MSG_MAP(CPocketClockApp) 
       // ע C ClassWizardӲɾmapping macros.
       // Ҫ˳ɵĴ!
 //}}AFX_MSG_MAP
END_MESSAGE_MAP() 

/////////////////////////////////////////////////////////// 
// CPocketClockAppܹ 

CPocketClockApp::CPocketClockApp() 
: CWinApp()
{ 
 // TODO:ӹܴ, 
// InitInstanceҪʼ 
} 

//////////////////////////////////////////////////////////////// 
// һΨһһCPocketClockApp

CPocketClockApp theApp; 

//////////////////////////////////////////////////////////////// 
// CPocketClockAppʼ 

BOOL CPocketClockApp::InitInstance() 
{ 
// ׼ʼ 
// ǲЩԲϣִеĳߴ磬
// ӦɾǲҪָʼ. 
 CPocketClockDlg dlg; 
 m_pMainWnd = &dlg; 
 
 int nResponse = dlg.DoModal(); 
 if (nResponse == IDOK) 

{
    // TODO:дԻʧʱOK   
} 
else if (nResponse == IDCANCEL) 
{
    // TODO:дԻʧʱCancel
} 

// ڶԻѹر,FALSEʹ˳ ,
//  򵯳Ϣ.  
return FALSE; 
} 
12.2.2  PocketClockDlg.cpp
ģʵ˳ִй̡ 
// PocketClockDlg.cpp:ִļ 
// 

#include "stdafx.h" 
#include "PocketClock.h" 
#include "PocketClockDlg.h" 
#include "PocketClockSetup.h" 

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE static char THIS_FILE[] = __FILE__;
#endif 

inline int CPocketClockDlg::StrToInt(CString& string) {
return _wtoi(string); 
} 

void CPocketClockDlg::WakeUpDevice(CTime &time) {
/* 
 LPTIME_ZONE_INFORMATION lpTimeZoneInformation; 
GetTimeZoneInformation(lpTimeZoneInformation);
time += CTimeSpan(lpTimeZoneInformation->Bias*60); // Timezonediscrepancy

 CString str; 
 str.Format(_T("%d"), lpTimeZoneInformation->Bias); 
 AfxMessageBox(str, MB_OK, NULL); 
 str.Format(_T("%d"), time.GetHour()); 
 AfxMessageBox(str, MB_OK, NULL); 

i dont know if i have to use it */ 
 TCHAR lpFileName[MAX_PATH+1]; 
 GetModuleFileName(NULL, lpFileName, MAX_PATH); 

SYSTEMTIME t; 
 memset(&t, 0, sizeof(SYSTEMTIME));     
t.wMonth = time.GetMonth(); 
t.wDay = time.GetDay(); 
t.wYear = time.GetYear();  
t.wHour = time.GetHour(); 
t.wMinute = time.GetMinute(); 
t.wSecond = time.GetSecond(); 
t.wMilliseconds = 0; 
 t.wDayOfWeek = time.GetDayOfWeek()-1; 

 CeRunAppAtTime(lpFileName, &t);
 } 
////////////////////////////////////////////////////////////// 
// CPocketClockDlgԻ 

CPocketClockDlg::CPocketClockDlg(CWnd* pParent /*=NULL*/) 
: CDialog(CPocketClockDlg::IDD, pParent) 
{ 
 //{{AFX_DATA_INIT(CPocketClockDlg)
 m_Clock = _T(""); 
 //}}AFX_DATA_INIT 
// ע⣬Win32LoadIconҪ󲢷DestroyIcon Win32 
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 

CPocketClockDlg::~CPocketClockDlg(void) 
{ 
 KillTimer(Timer);
 if (sound) {PlaySound(NULL,NULL,NULL);}
 TCHAR lpFileName[MAX_PATH+1]; // ɾʾ
 GetModuleFileName(NULL, lpFileName, MAX_PATH);
 CeRunAppAtTime(lpFileName, 0); 
} 

void CPocketClockDlg::DoDataExchange(CDataExchange* pDX) 
{ 
 CDialog::DoDataExchange(pDX); 
 //{{AFX_DATA_MAP(CPocketClockDlg) 
 DDX_Control(pDX, IDC_Clock, m_ClockCtrl); 
 DDX_Text(pDX, IDC_Clock, m_Clock); 
 //}}AFX_DATA_MAP 
} 

BEGIN_MESSAGE_MAP(CPocketClockDlg, CDialog) 
 //{{AFX_MSG_MAP(CPocketClockDlg)
 ON_WM_TIMER() 
 ON_BN_CLICKED(IDC_START, OnStart) 
 ON_COMMAND(IDC_CONFIGSTART,
 OnConfigstart) 
 ON_BN_CLICKED(IDC_BUTTON1,
 OnButton1) 
 ON_WM_KEYDOWN() 
 ON_COMMAND(IDC_EXIT, OnExit) 
 ON_WM_PAINT() 
 //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

////////////////////////////////////////////////////////////
 // CPocketClockDlgϢ 

BOOL CPocketClockDlg::OnInitDialog() 
{ CDialog::OnInitDialog(); 

// ΪöԻͼ. ܻԶִ
 // 岻һԻʱ 
SetIcon(m_hIcon, TRUE);    // ôͼ
 SetIcon(m_hIcon, FALSE);  // Сͼ 

SHMENUBARINFO info;       // ˵ 
info.cbSize = sizeof(info); 
info.hwndParent = m_hWnd;
 info.dwFlags = 0; 
info.nToolBarId = IDR_MENUBAR1; 
 info.hInstRes =::AfxGetInstanceHandle(); 
 info.nBmpId = 0; 
info.cBmpImages = 0; 
 SHCreateMenuBar(&info); 

 SHDoneButton(m_hWnd, SHDB_HIDE);// ʹСť

 CenterWindow(GetDesktopWindow()); // ۽hpcĻ

 // TODO:Ӷʼ 
CountDownDefault = 0; 
TimerType = 2; 
sound = true; 
keepAwake = false; 
return TRUE;  // TRUEѡпؼ 
} 

void CPocketClockDlg::OnTimer(UINT nIDEvent) 
{ 
 // TODO:ǵϢ/Ĭ
if (keepAwake) {keybd_event(VK_F24, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);} // Ԥ ? 

if (accurate) { // ȷʱ

} else {         // Ǿȷʱ
CTime CurrentTime = CTime::GetCurrentTime();   // ϵͳʱʹʱִ
                                                       // Ҫϵͳ
 switch (TimerType) 
{ 
    case 0: // ʾ䵹ʱ
          {
          CTimeSpan ElapsedTime(CurrentTime - StartingTime);
          CTimeSpan TotalTimeToCountDown(CountDownDefault/1000); 
          TotalTimeToCountDown -= ElapsedTime; 

          if (TotalTimeToCountDown > CTimeSpan(0)) { // Countdown 
                  m_Clock = TotalTimeToCountDown.Format("Total time left:\n %Dd, %H: %M: %S"); // Format: "Total time left: Days, Hours: Minutes: Seconds" 
                  UpdateData(false); 

        } else { 
                m_Clock = TotalTimeToCountDown.Format("Total time left:\n %Dd, %H: %M: %S"); // Format: "Total time left: Days, Hours: Minutes: Seconds" 

                UpdateData(false); // 󵹼ʱ,Ϊ
if (sound) {PlaySound(MAKEINTRESOURCE(IDR_ALERT),
AfxGetResourceHandle(),SND_ RESOURCE | SND_ASYNC);} // о
                KillTimer(Timer);   // ʱ 
} // if (countdown >= 100)  
 break; 
}   //case0 
      case 1:        // ʾʱ
{
CTimeSpan ElapsedTime(CurrentTime - StartingTime);
CTimeSpan TotalTimeToCountDown(CountDownDefault/1000); 
TotalTimeToCountDown -= ElapsedTime; 
m_Clock = ElapsedTime.Format("Total time elapsed:\n %Dd, %H: %M: %S"); // Format: "Total time elapsed: Days, Hours: Minutes: Seconds" 
            UpdateData(false); 
            break; 
}   //  1 
      case 2: // ʾһʱ
           { 
           CString tmp; 
           m_Clock.Format(_T("%d"), CurrentTime.GetHour());
           m_Clock += ": ";  
          tmp.Format(_T("%d"),CurrentTime.GetMinute());  
    m_Clock += tmp; 
    m_Clock += ": ";  
    tmp.Format(_T("%d"),CurrentTime.GetSecond());  
    m_Clock += tmp;   m_Clock += "\n";  
    tmp.Format(_T("%d"),CurrentTime.GetDay());  
    m_Clock += tmp;  
    m_Clock += ".";   
    tmp.Format(_T("%d"),CurrentTime.GetMonth());  
    m_Clock += tmp;   
    m_Clock += ".";   
    tmp.Format(_T("%d"),CurrentTime.GetYear());   
    m_Clock += tmp;   
    tmp.Empty(); 
             UpdateData(false); 
           break; 
           } //2 
     case 3: // ʾһĿʱ
           { 
           if (CurrentTime < TargetTime) { // ʱ
                   CTimeSpan TotalTimeToCountDown (TargetTime -CurrentTime); 
                   m_Clock = TotalTimeToCountDown.Format("Total time left:\n %Dd, %H: %M: %S"); // Format: "Total time left: Days, Hours: Minutes: Seconds" 
                   m_Clock += "\n\nuntil: "; 

                   CString tmp; 
                   tmp.Format(_T("%d"), TargetTime.GetHour()); 
                   m_Clock += ": "; 
                   tmp.Format(_T("%d"),TargetTime.GetMinute()); 
                   m_Clock += tmp; 
                   m_Clock += ": "; 
                   tmp.Format(_T("%d"),TargetTime.GetSecond()); 
                   m_Clock += tmp; 
                   m_Clock += "\n\n"; 
                   tmp.Format(_T("%d"),TargetTime.GetDay()); 
                   m_Clock += tmp; 
                   m_Clock += "."; 
                   tmp.Format(_T("%d"),TargetTime.GetMonth()); 
                   m_Clock += tmp; 
                   m_Clock += "."; 
                   tmp.Format(_T("%d"),TargetTime.GetYear()); 
                   m_Clock += tmp; 
                   tmp.Empty();

                   UpdateData(false); 

          } else { 
                   if (sound) {PlaySound(MAKEINTRESOURCE(IDR_ALERT),
AfxGetResourceHandle(),SND_ RESOURCE | SND_ASYNC);}  // žʾ   
                   KillTimer(Timer); // ʱ 
               } // if (currenttime < targettime)

               break; 
               }   //  3 
} //  
} // if (accurate)
CDialog::OnTimer(nIDEvent); 
} 

void CPocketClockDlg::OnStart() 
{  
// TODO:ǵĿؼʾ
StartingTime = CTime::GetCurrentTime(); 

if (TimerType == 3) { // Ӧʱ
      WakeUpDevice(TargetTime - CTimeSpan(5)); 
} else { 
        if (TimerType == 0) { 
              CTimeSpan TimeToCountDown (CountDownDefault/1000); 
              CTime WakeUp (StartingTime + TimeToCountDown); 
              WakeUpDevice(WakeUp - CTimeSpan(5)); 
         } 
 } //else if 
/*   testing  
CString str; 
str.Format(_T("%d"), TimerType);
AfxMessageBox(str, MB_OK, NULL); 
*/ 
if (sound) {PlaySound(NULL,NULL,NULL);} // ֹͣ
KillTimer(Timer); // ʱ
if (accurate) {Timer = SetTimer(1, 10, 0); } // ȷ(0.01sec precision)
else {Timer = SetTimer(1, 500, 0); }   // µĵʱ 
} 

void CPocketClockDlg::OnConfigstart()  
{ 
// TODO: Add your command handler code here
 CPocketClockSetup ConfigDlg; 

if (sound) {PlaySound(NULL,NULL,NULL);} // ֹͣ

 ConfigDlg.m_ClockType = TimerType;       // ǵֵ 
ConfigDlg.m_Sound = sound; // ? 
int DlgValue = ConfigDlg.DoModal();      // Dialog 
if (DlgValue == IDOK) { 
        KillTimer(Timer); 
        TimerType = ConfigDlg.m_ClockType; 
        unsigned int Hours = ConfigDlg.m_Hours*3600000; 
        unsigned int Minutes = ConfigDlg.m_Minutes*60000; 
        unsigned int Seconds = ConfigDlg.m_Seconds*1000; 
        CountDownDefault = Hours + Minutes + Seconds; 
        accurate = ConfigDlg.m_Accurate; 
        sound = ConfigDlg.m_Sound; 
        TargetTime = CTime (ConfigDlg.m_TargetDate.GetYear(), ConfigDlg.m_TargetDate.GetMonth(), ConfigDlg.m_TargetDate.GetDay(), ConfigDlg.Hour, ConfigDlg.Minute, ConfigDlg.Second);
 }   //if (dlgvalue == idok) 
} 

void CPocketClockDlg::OnButton1() 
{ 

 // TODO:ǵĿؼʾ
 OnConfigstart(); 
} 

void CPocketClockDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{  
// TODO:ǵϢ벢/Ĭ
CDialog::OnKeyDown(nChar, nRepCnt, nFlags); 
} 

void CPocketClockDlg::OnExit() 
{ 
 // TODO:ǵ
 EndDialog(IDOK); 
 return; 
} 

void CPocketClockDlg::OnPaint()  
{  
CPaintDC dc(this); // 滭豸 
 /*    
      CDC *pDC, *memDC;  
     CFont Functionfont, font, *oldFont;  // ͬ 
     CRect txtRect;                           // ıķ  

     CRect rect;  
     //GetClientRect(rect);  

     pDC->CreateCompatibleDC(&dc);  

 // Functionfont    
       Functionfont.CreateFont(20, 6, 0, 0, 300,  
            FALSE, FALSE, 0, ANSI_CHARSET,  
            OUT_DEFAULT_PRECIS,   
            CLIP_DEFAULT_PRECIS,  
            DEFAULT_QUALITY,  
            DEFAULT_PITCH, L"Arial"); 

       // Ʊ/ 
       pDC->SelectObject(&Functionfont); 
       pDC->SetTextColor(RGB(0,0,0)); 
       txtRect.top   = 80; 
       txtRect.bottom = 100 ; 
       txtRect.left = 5; 
       txtRect.right = 50; 
       pDC->DrawText("Hi wie gehts so ?!?!?!?!", 
            txtRect, DT_CENTER | DT_TOP); 
 // TODO:Ϊӻƴ
       dc.BitBlt(10,10, 100, 100, pDC, 0, 0, SRCCOPY); 
*/
 // Ҫ CDialog::OnPaint()Ϊ滭Ϣ 
} 

 
