home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / TCL228 / TCL228.lzh / EXESRC.lzh / main.c < prev    next >
C/C++ Source or Header  |  1999-09-18  |  11KB  |  454 lines

  1. /*-------------------------------------------------------------
  2.   main.c
  3.   WinMain, window procedure, and functions for initializing
  4.   KAZUBON 1997-1999
  5. ---------------------------------------------------------------*/
  6.  
  7. #include "tclock.h"
  8. #include <winver.h>
  9.  
  10. #define VERSIONM 0x20002
  11. #define VERSIONL 0x0008
  12.  
  13. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  14.  
  15. char szClassName[] = "TClockMainClass"; // window class name
  16. char szWindowText[] = "TClock";         // caption of the window
  17.  
  18. void CheckCommandLine(HWND hwnd);
  19. static void SetStringsForDLL(void);
  20. static BOOL CheckDLL(void);
  21. static void InitHTMLHelp(void);
  22. static void EndHTMLHelp(void);
  23.  
  24. static BOOL bStartTimer = FALSE;
  25.  
  26. /*-------------------------------------------
  27.   entry point of program
  28.   not use "WinMain" for compacting the file size
  29. ---------------------------------------------*/
  30. void WINAPI WinMainCRTStartup(void)
  31. {
  32.     MSG msg;
  33.     WNDCLASS wndclass;
  34.     HWND hwnd;
  35.     
  36.     // not to execute the program twice
  37.     hwnd = FindWindow(szClassName, szWindowText);
  38.     if(hwnd != NULL)
  39.     {
  40.         CheckCommandLine(hwnd);
  41.         ExitProcess(1); return;
  42.     }
  43.     
  44.     hInst = GetModuleHandle(NULL);
  45.     
  46.     // get the path where .exe is positioned
  47.     GetModuleFileName(hInst, mydir, MAX_PATH);
  48.     del_title(mydir);
  49.     
  50.     if(!CheckDLL())
  51.     {
  52.         ExitProcess(1); return;
  53.     }
  54.     
  55.     InitCommonControls();
  56.     
  57.     InitHTMLHelp();
  58.     
  59.     SetStringsForDLL();
  60.     
  61.     hIconTClock = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1));
  62.     hIconPlay = LoadImage(hInst, MAKEINTRESOURCE(IDI_PLAY), IMAGE_ICON,
  63.         16, 16, LR_DEFAULTCOLOR);
  64.     hIconStop = LoadImage(hInst, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON,
  65.         16, 16, LR_DEFAULTCOLOR);
  66.     hIconDel = LoadImage(hInst, MAKEINTRESOURCE(IDI_DEL), IMAGE_ICON,
  67.         16, 16, LR_DEFAULTCOLOR);
  68.     
  69.     hwndSheet = hDlgTimer = NULL;
  70.     
  71.     // register a window class
  72.     wndclass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  73.     wndclass.lpfnWndProc   = WndProc;
  74.     wndclass.cbClsExtra    = 0;
  75.     wndclass.cbWndExtra    = 0;
  76.     wndclass.hInstance     = hInst;
  77.     wndclass.hIcon         = hIconTClock;
  78.     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
  79.     wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  80.     wndclass.lpszMenuName  = NULL;
  81.     wndclass.lpszClassName = szClassName;
  82.     RegisterClass(&wndclass);
  83.     
  84.     // create a hidden window
  85.     hwnd = CreateWindow(szClassName, szWindowText,
  86.         0, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  87.         NULL, NULL, hInst, NULL);
  88.     //ShowWindow(hwnd, SW_SHOW);
  89.     //UpdateWindow(hwnd);
  90.     
  91.     hwndMain = hwnd;
  92.     
  93.     CheckCommandLine(hwnd);
  94.     
  95.     while(GetMessage(&msg, NULL, 0, 0))
  96.     {
  97.         if(hwndSheet && IsWindow(hwndSheet)
  98.             && IsDialogMessage(hwndSheet, &msg))
  99.             ;
  100.         else if(hDlgTimer && IsWindow(hDlgTimer)
  101.             && IsDialogMessage(hDlgTimer, &msg))
  102.             ;
  103.         else
  104.         {
  105.             TranslateMessage(&msg);
  106.             DispatchMessage(&msg);
  107.         }
  108.     }
  109.     EndHTMLHelp();
  110.     
  111.     ExitProcess(msg.wParam);
  112. }
  113.  
  114. /*-------------------------------------------
  115.    Command Line Option
  116.    /prop : Show TClock Properties
  117.    /exit : Exit TClock
  118. ---------------------------------------------*/
  119. void CheckCommandLine(HWND hwnd)
  120. {
  121.     char *p;
  122.     p = GetCommandLine();
  123.     while(*p)
  124.     {
  125.         if(*p == '/')
  126.         {
  127.             p++;
  128.             if(_strnicmp(p, "prop", 4) == 0)
  129.             {
  130.                 PostMessage(hwnd, WM_USER+1, 0, 0);
  131.                 p += 4;
  132.             }
  133.             else if(_strnicmp(p, "exit", 4) == 0)
  134.             {
  135.                 PostMessage(hwnd, WM_CLOSE, 0, 0);
  136.                 p += 4;
  137.             }
  138.         }
  139.         p++;
  140.     }
  141. }
  142.  
  143. /*-------------------------------------------
  144.    the window procedure
  145. ---------------------------------------------*/
  146. LRESULT CALLBACK WndProc(HWND hwnd,    UINT message, WPARAM wParam, LPARAM lParam)
  147. {
  148.     switch (message)
  149.     {
  150.         case WM_CREATE:
  151.         {
  152.             int nDelay;
  153.             InitAlarm();  // initialize alarms
  154.             InitFormat(); // initialize a Date/Time format
  155.             nDelay = GetMyRegLong("", "DelayStart", 0);
  156.             if(nDelay > 0)
  157.             {
  158.                 SetTimer(hwnd, 2, nDelay * 1000, NULL); bStartTimer = TRUE;
  159.             }
  160.             else SendMessage(hwnd, WM_TIMER, 2, 0);
  161.             InitSyncTime(hwnd);
  162.             InitWatchWallpaper();
  163.             SetTimer(hwnd, 3, 1000, NULL);
  164.             return 0;
  165.         }
  166.         case WM_TIMER:
  167.             if(wParam == 2)
  168.             {
  169.                 if(bStartTimer) KillTimer(hwnd, 2);
  170.                 bStartTimer = FALSE;
  171.                 HookStart(hwnd); // install a hook
  172.             }
  173.             else if(wParam == 3)
  174.             {
  175.                 SYSTEMTIME st;
  176.                 GetLocalTime(&st);
  177.                 OnTimerSNTP(hwnd, &st);
  178.                 CheckAlarm(hwnd, &st);
  179.                 CheckTimer(hwnd, &st);
  180.                 CheckWallpaper(hwnd, &st);
  181.             }
  182.             return 0;
  183.  
  184.         case WM_DESTROY:
  185.             EndSyncTime(hwnd);
  186.             EndAlarm();
  187.             EndTimer();
  188.             EndWatchWallpaper();
  189.             MyHelp(hwnd, -1);
  190.             KillTimer(hwnd, 3);
  191.             if(bStartTimer)
  192.             {
  193.                 KillTimer(hwnd, 2); bStartTimer = FALSE;
  194.             }
  195.             else HookEnd();  // uninstall a hook
  196.             PostQuitMessage(0);
  197.             return 0;
  198.         case WM_ENDSESSION:
  199.             if(wParam)
  200.             {
  201.                 EndSyncTime(hwnd);
  202.                 EndAlarm();
  203.                 EndTimer();
  204.                 if(bStartTimer)
  205.                 {
  206.                     KillTimer(hwnd, 2); bStartTimer = FALSE;
  207.                 }
  208.                 else HookEnd();  // uninstall a hook
  209.             }
  210.             break;
  211.         case WM_PAINT:
  212.         {
  213.             PAINTSTRUCT ps;
  214.             HDC hdc;
  215.             hdc = BeginPaint(hwnd, &ps);
  216.             EndPaint(hwnd, &ps);
  217.             return 0;
  218.         }
  219.  
  220.         // Messages sent/posted from TCDLL.dll
  221.         case WM_USER:
  222.             hwndClock = (HWND)lParam;
  223.             return 0;
  224.         case (WM_USER+1):   // "TClock properties"
  225.             MyPropertySheet();
  226.             return 0;
  227.         case (WM_USER+2):   // "Exit TClock"
  228.             if(hwndSheet && !IsWindow(hwndSheet))
  229.                 PostMessage(hwndSheet, WM_CLOSE, 0, 0);
  230.             if(hDlgTimer && !IsWindow(hDlgTimer))
  231.                 PostMessage(hDlgTimer, WM_CLOSE, 0, 0);
  232.             hwndSheet = NULL;
  233.             PostMessage(hwnd, WM_CLOSE, 0, 0);
  234.             return 0;
  235.         case MM_MCINOTIFY:
  236.             OnMCINotify(hwnd);
  237.             return 0;
  238.         case MM_WOM_DONE: // stop playing wave
  239.         case (WM_USER+3):
  240.             StopFile();
  241.             return 0;
  242.         case (WM_USER+5): // "TClock Help"
  243.             MyHelp(hwnd, 0);
  244.             return 0;
  245.         case (WM_USER+6): // "Timer"
  246.             DialogTimer(hwnd);
  247.             return 0;
  248.         case (WM_USER+8): // Syncronize Time
  249.             StartSyncTime(hwndMain, NULL, 0);
  250.             return 0;
  251.         case (WM_USER+11):  // to display countdown of timer
  252.             return OnQueryTimerInfo(hwnd, (HWND)wParam, (int)lParam);
  253.         case (WM_USER+12):  // stop timer
  254.             StopTimer(hwnd, wParam);
  255.             return 0;
  256.         case WM_WININICHANGE:
  257.         /*
  258.         {
  259.             char s[160];
  260.             strcpy(s, "WM_WININICHANGE ");
  261.             if(lParam) strcat(s, (char*)lParam);
  262.             else strcat(s, "(null)");
  263.             WriteDebug(s);
  264.         }
  265.         */
  266.         {
  267.             char *p;
  268.             BOOL b;
  269.  
  270.             p = (char*)lParam;
  271.             b = GetMyRegLong("", "DeskcalTonikaku", FALSE);
  272.             
  273.             // Update Destop Calendar automatically
  274.             if(p && (strcmp(p, "Desktop") == 0 ||
  275.                  strcmp(p, "RefreshDesktop") == 0)) ; // fall through
  276.             else if(b && (p == 0 || *p == 0)) ; // fall through
  277.             else return 0;
  278.         }
  279.         case WM_SYSCOLORCHANGE:
  280.             PostMessage(hwnd, WM_USER+10, 1,0);
  281.             return 0;
  282.         case (WM_USER+10):
  283.         {
  284.             if(wParam && GetMyRegLong("", "DeskcalOnlyDate", FALSE)) ;
  285.             else ExecDeskcal(hwnd);
  286.             return 0;
  287.         }
  288.         
  289.         // return from power saving
  290.         case WM_POWERBROADCAST:
  291.         {
  292.             if(wParam == 7) //PBT_APMRESUMESUSPEND
  293.             {
  294.                 if(GetMyRegLong("", "DeskcalResumeSuspend", FALSE))
  295.                     PostMessage(hwnd, WM_USER+10, 0,0);
  296.             }
  297.             break;
  298.         }
  299.         
  300.         // messages transfered from the dll
  301.         case WM_DROPFILES:
  302.             OnDropFiles(hwnd, (HDROP)wParam);
  303.             return 0;
  304.         case WM_LBUTTONDOWN:
  305.         case WM_RBUTTONDOWN:
  306.         case WM_MBUTTONDOWN:
  307.             if(!bPlayingNonstop)
  308.                 PostMessage(hwnd, WM_USER+3, 0, 0);
  309.         case WM_LBUTTONDBLCLK:
  310.         case WM_RBUTTONDBLCLK:
  311.         case WM_MBUTTONDBLCLK:
  312.             OnClick(hwnd, message, wParam, LOWORD(lParam), HIWORD(lParam));
  313.             return 0;
  314.     }
  315.     return DefWindowProc(hwnd, message, wParam, lParam);
  316. }
  317.  
  318. /*------------------------------------------------
  319.   load and save strings for TCDLL.dll
  320. --------------------------------------------------*/
  321. void SetStringsForDLL(void)
  322. {
  323.     int i;
  324.     char s[80];
  325.     
  326.     for(i = IDS_DLL_DATETIME; i <= IDS_DLL_EXIT; i++)
  327.     {
  328.         wsprintf(s, "%02d", i-IDS_DLL_DATETIME);
  329.         SetMyRegStr("DLL", s, MyString(i));
  330.     }
  331.     
  332.     if(GetMyRegStr(NULL, "Font", s, 80, "") == 0)
  333.     {
  334.         HFONT hfont;
  335.         LOGFONT lf;
  336.         hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  337.         if(hfont)
  338.         {
  339.             GetObject(hfont, sizeof(lf),(LPVOID)&lf);
  340.             SetMyRegStr("", "Font", lf.lfFaceName);
  341.         }
  342.     }
  343. }
  344.  
  345. /*-------------------------------------------
  346.   Check version of TCDLL.dll
  347. ---------------------------------------------*/
  348. BOOL CheckDLL(void)
  349. {
  350.     DWORD size;
  351.     char *pBlock;
  352.     VS_FIXEDFILEINFO *pffi;
  353.     char fname[MAX_PATH];
  354.     BOOL br = FALSE;
  355.  
  356.     strcpy(fname, mydir); add_title(fname, MyString(IDS_DLLNAME));
  357.  
  358.     size = GetFileVersionInfoSize(fname, 0);
  359.     if(size > 0)
  360.     {
  361.         pBlock = malloc(size);
  362.         if(GetFileVersionInfo(fname, 0, size, pBlock))
  363.         {
  364.             UINT tmp;
  365.             if(VerQueryValue(pBlock, "\\", &pffi, &tmp))
  366.             {
  367.                 if(pffi->dwFileVersionMS == VERSIONM &&
  368.                     pffi->dwFileVersionLS == VERSIONL)
  369.                 {
  370.                     br = TRUE;
  371.                 }
  372.             }
  373.         }
  374.         free(pBlock);
  375.     }
  376.     if(!br)
  377.     {
  378.         char title[80];
  379.         
  380.         strcpy(title, MyString(IDS_CAUTION));
  381.         MyMessageBox(NULL, MyString(IDS_DLLVER),
  382.             title, MB_OK, MB_ICONEXCLAMATION);
  383.     }
  384.     return br;
  385. }
  386.  
  387. /*-------------------------------------------
  388.   Initialize Compiled HTML Help
  389. ---------------------------------------------*/
  390.  
  391. HMODULE hmodDLL = NULL;
  392. HWND (WINAPI *HtmlHelp)(HWND, LPCSTR, UINT, DWORD) = NULL;
  393.  
  394. void InitHTMLHelp(void)
  395. {
  396.     hmodDLL = LoadLibrary("HHCTRL.OCX");
  397.     if(hmodDLL != NULL)
  398.     {
  399.         (FARPROC)HtmlHelp = GetProcAddress(hmodDLL, "HtmlHelpA");
  400.         if(HtmlHelp == NULL)
  401.         {
  402.             FreeLibrary(hmodDLL); hmodDLL = NULL;
  403.         }
  404.     }
  405. }
  406. void EndHTMLHelp(void)
  407. {
  408.     if(hmodDLL != NULL) FreeLibrary(hmodDLL);
  409. }
  410.  
  411. #define HH_DISPLAY_TOPIC  0x0000
  412. #define HH_HELP_CONTEXT   0x000F
  413. #define HH_CLOSE_ALL      0x0012
  414.  
  415. /*-------------------------------------------
  416.   Show "TClock Help"
  417. ---------------------------------------------*/
  418. void MyHelp(HWND hwnd, int id)
  419. {
  420.     char helpfile[MAX_PATH];
  421.     WIN32_FIND_DATA fd;
  422.     HANDLE hfind;
  423.     int command;
  424.     
  425.     strcpy(helpfile, mydir);
  426.     add_title(helpfile, MyString(IDS_CHMFILE));
  427.     hfind = FindFirstFile(helpfile, &fd);
  428.     
  429.     // Compiled HTML Help (.chm)
  430.     if(HtmlHelp != NULL && hfind != INVALID_HANDLE_VALUE)
  431.     {
  432.         HWND hwndHelp;
  433.         
  434.         if(id < 0) { command = HH_CLOSE_ALL; id = 0; }
  435.         else if(id == 0) command = HH_DISPLAY_TOPIC;
  436.         else command = HH_HELP_CONTEXT;
  437.         hwndHelp = HtmlHelp(hwnd, helpfile, command, id);
  438.         if(command != HH_CLOSE_ALL)
  439.             SetForegroundWindow(hwndHelp);
  440.     }
  441.     else // Windows Help (.hlp)
  442.     {
  443.         strcpy(helpfile, mydir);
  444.         add_title(helpfile, MyString(IDS_HELPFILE));
  445.         if(id < 0) { command = HELP_QUIT; id = 0; }
  446.         else if(id == 0) command = HELP_CONTENTS;
  447.         else command = HELP_CONTEXT;
  448.         WinHelp(hwnd, helpfile, command, id);
  449.     }
  450.     if(hfind != INVALID_HANDLE_VALUE)
  451.         FindClose(hfind);
  452. }
  453.  
  454.