home *** CD-ROM | disk | FTP | other *** search
/ swCHIP 1991 January / swCHIP_95-1.bin / desktop / noblank / noblank.c < prev    next >
C/C++ Source or Header  |  1995-12-09  |  9KB  |  298 lines

  1. /*  NOBLANK.C - ScreenSaverProc(), RegisterDialogClasses(), 
  2.  *   ScreenSaverConfigureDialog() and other support code for 
  3.  *   noblank.
  4.  *
  5.  *   NOBLANK is a sample screen saver application. 
  6.  *
  7.  *    (C) Copyright Microsoft Corp. 1991.  All rights reserved.
  8.  *
  9.  *    You have a royalty-free right to use, modify, reproduce and 
  10.  *    distribute the Sample Files (and/or any modified version) in 
  11.  *    any way you find useful, provided that you agree that 
  12.  *    Microsoft has no warranty obligations or liability for any 
  13.  *    Sample Application Files which are modified. 
  14.  */
  15.  
  16. #include <windows.h> 
  17. #include <mmsystem.h>
  18.  
  19. #include "noblank.h"
  20.  
  21.  
  22. /* Global used by SCRNSAVE.LIB. Required for all screen savers.
  23.  */
  24. char szAppName[40];
  25.  
  26.  
  27. /* Globals specific to noblank.
  28.  */
  29. char szName[]="No Blank Screen Saver";
  30.  
  31. /* Externals defined in SCRNSAVE.LIB. Required for all screen savers.
  32.  */
  33.  
  34. HINSTANCE _cdecl hMainInstance;
  35. HWND _cdecl hMainWindow;
  36. char _cdecl szName[TITLEBARNAMELEN];
  37. char _cdecl szIsPassword[22];
  38. char _cdecl szIniFile[MAXFILELEN];
  39. char _cdecl szScreenSaver[22];
  40. char _cdecl szPassword[16];
  41. char _cdecl szDifferentPW[BUFFLEN];
  42. char _cdecl szChangePW[30];
  43. char _cdecl szBadOldPW[BUFFLEN];
  44. char _cdecl szHelpFile[MAXFILELEN];
  45. char _cdecl szNoHelpMemory[BUFFLEN];
  46. UINT _cdecl MyHelpMessage;
  47. HOOKPROC _cdecl fpMessageFilter;
  48.  
  49. HBITMAP hbmImage;                   // image handle
  50. BOOL bPassword;                     // password protected?
  51. WORD wTimer;                        // timer id
  52. int cntDlgUp;                // count of time dialog box is active
  53. int DlgIsUp;                // flag to indicate dialog box is active
  54. HWND DlgHandle;                // save dialog handle
  55. HWND mainWnd;                // main window handle
  56. long DlgTimeOut;                // count for removing password dlgbox
  57.  
  58. /* ScreenSaverProc - Main entry point for screen saver messages.
  59.  *  This function is required for all screen savers.
  60.  *
  61.  * Params:  Standard window message handler parameters.
  62.  *
  63.  * Return:  The return value depends on the message.
  64.  *
  65.  *  Note that all messages go to the DefScreenSaverProc(), except
  66.  *  for ones we process.
  67.  */
  68. LONG FAR PASCAL ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  69. {
  70.     switch (msg)
  71.     {
  72.         case WM_CREATE:                             // noblank-specific
  73.         {
  74.         DlgIsUp = 0;
  75.         cntDlgUp = 0;
  76.         mainWnd = hWnd;
  77.         wTimer = 0;
  78.             /* Load the strings from the STRINGTABLE
  79.              */
  80.             GetIniEntries();
  81.  
  82.             /* Load the initial bounce settings.
  83.              */
  84.             GetIniSettings();
  85.  
  86.         /* set the timeout for the password dialog box - password dialog
  87.            box will be cancelled after 30 seconds
  88.         */
  89.         DlgTimeOut = 3;
  90.  
  91.             break;
  92.         }
  93.         
  94.         case WM_ACTIVATE:
  95.         case WM_ACTIVATEAPP:
  96.         case WM_NCACTIVATE:
  97.         case WM_SETCURSOR:
  98.         case WM_LBUTTONDOWN:
  99.         case WM_RBUTTONDOWN: 
  100.         case WM_MBUTTONDOWN:
  101.         case WM_KEYDOWN:
  102.         case WM_KEYUP:
  103.         DlgIsUp = 1;
  104.         cntDlgUp = 0;
  105.         DefScreenSaverProc(hWnd, msg, wParam, lParam);
  106.         DlgHandle = FindWindow (NULL, szName);
  107.         SetCapture (hWnd);
  108.             /* Create a timer
  109.              */
  110.             wTimer = SetTimer(hWnd, ID_TIMER, 30000, NULL);
  111.  
  112.         break;
  113.         
  114.  
  115.         case WM_TIMER:                              // noblank-specific
  116.         if (DlgIsUp) {
  117.     //    if (++cntDlgUp > DlgTimeOut) {
  118.                     EndDialog(DlgHandle, FALSE);
  119.             DlgIsUp = 0;
  120.             cntDlgUp = 0;
  121.             SetCapture (hWnd);
  122.                 if (wTimer) {
  123.                       KillTimer(hWnd, ID_TIMER);
  124.                       wTimer = 0;
  125.                 }
  126.     //    }
  127.         }
  128.  
  129.             break;
  130.  
  131.         case WM_DESTROY:                            // noblank-specific
  132.  
  133.             /* Destroy any objects we created
  134.              */
  135.             if (wTimer) {
  136.                    KillTimer(hWnd, ID_TIMER);
  137.                    wTimer = 0;
  138.             }
  139.             ReleaseCapture ();
  140.  
  141.             break;
  142.  
  143.         case WM_ERASEBKGND:
  144.         SetWindowPos (hWnd, HWND_BOTTOM, 0, 0, 50, 50, SWP_HIDEWINDOW);
  145.         SetCapture (hWnd);
  146.             return 0L;
  147.  
  148.         default:
  149.             break;
  150.         }
  151.  
  152.     return DefScreenSaverProc(hWnd, msg, wParam, lParam);
  153. }
  154.  
  155. /* RegisterDialogClasses -- Entry point for registering window
  156.  * classes required by configuration dialog box.
  157.  *
  158.  * Params:  hWnd -- Handle to window
  159.  *
  160.  * Return:  None
  161.  */
  162. BOOL RegisterDialogClasses(HINSTANCE hInst)
  163. {
  164.     return TRUE;
  165. }
  166.  
  167.  
  168. /* ScreenSaverConfigureDialog -- Dialog box function for configuration
  169.  * dialog.
  170.  *
  171.  * Params:  hWnd -- Handle to window
  172.  *
  173.  * Return:  None
  174.  */
  175. BOOL FAR PASCAL ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  176. {
  177.   static HWND hIDOK;
  178.   static HWND hSetPassword;
  179.  
  180.     switch (msg)
  181.     {
  182.         case WM_INITDIALOG:                         // noblank-specific
  183.             GetIniEntries();
  184.             GetIniSettings();
  185.             SendDlgItemMessage(hDlg, ID_PASSWORDPROTECTED, BM_SETCHECK,
  186.                 bPassword, NULL);
  187.             hSetPassword=GetDlgItem(hDlg, ID_SETPASSWORD);
  188.             EnableWindow(hSetPassword, bPassword);
  189.             hIDOK=GetDlgItem(hDlg, IDOK);
  190.  
  191.             return TRUE;
  192.  
  193.         case WM_COMMAND:                            // noblank-specific
  194.             switch (wParam)
  195.             {
  196.                 case IDOK:
  197.                     bPassword  = IsDlgButtonChecked(hDlg, ID_PASSWORDPROTECTED);
  198.  
  199.                     WriteProfileInt(szAppName, szIsPassword, bPassword);
  200.  
  201.                     EndDialog(hDlg, TRUE);
  202.                     return TRUE;
  203.  
  204.                 case IDCANCEL:
  205.                     EndDialog(hDlg, FALSE);
  206.                     return TRUE;
  207.  
  208.                 case ID_SETPASSWORD:
  209.                 {
  210.                     FARPROC fpDialog;
  211.  
  212.                     if((fpDialog = MakeProcInstance(DlgChangePassword,hMainInstance)) == NULL)
  213.                         return FALSE;
  214.                     DialogBox(hMainInstance, MAKEINTRESOURCE(DLG_CHANGEPASSWORD), 
  215.                               hDlg, fpDialog);
  216.                     FreeProcInstance(fpDialog);
  217.                     SendMessage(hDlg, WM_NEXTDLGCTL, hIDOK, 1l);
  218.                     break;
  219.                 }
  220.  
  221.                 case ID_PASSWORDPROTECTED:
  222.                     bPassword ^= 1;
  223.                     CheckDlgButton(hDlg, wParam, bPassword);
  224.                     EnableWindow(hSetPassword, bPassword);
  225.                     break;
  226.  
  227.                 case ID_HELP:
  228. DoHelp:
  229. #if 0
  230.                     bHelpActive=WinHelp(hDlg, szHelpFile, HELP_CONTEXT, IDH_DLG_noblank);
  231.                     if (!bHelpActive)
  232.                         MessageBox(hDlg, szNoHelpMemory, szName, MB_OK);
  233. #else
  234. /*                    MessageBox(hDlg, "Insert your call to WinHelp() here.",
  235.                         szName, MB_OK);*/
  236. #endif
  237.                     break;
  238.             }
  239.             break;
  240.         default:
  241.             if (msg==MyHelpMessage)     // Context sensitive help msg.
  242.                 goto DoHelp;
  243.     }
  244.     return FALSE;
  245. }
  246.  
  247.  
  248. /* THE REST OF THIS FILE IS SPECIFIC TO noblank.
  249.  *
  250.  * Replace it with your own screen saver code.
  251.  */
  252.  
  253.  
  254. /* GetIniSettings -- Get initial settings from WIN.INI
  255.  *
  256.  * Params:  hWnd -- Handle to window
  257.  *
  258.  * Return:  None
  259.  */
  260. static void GetIniSettings()
  261. {
  262.     bPassword =  GetPrivateProfileInt(szAppName, szIsPassword, FALSE, szIniFile);
  263. }
  264.  
  265.  
  266. /* WriteProfileInt - Write an unsigned integer value to CONTROL.INI.
  267.  *
  268.  * Params:  name - szSection - [section] name in .INI file
  269.  *                 szKey     - key= in .INI file
  270.  *                 i         - value for key above
  271.  *
  272.  * Return:  None
  273.  */
  274. static void WriteProfileInt(LPSTR szSection, LPSTR szKey, int i) 
  275. {
  276.     char achBuf[40];
  277.  
  278.     /* write out as unsigned because GetPrivateProfileInt() can't
  279.      * cope with signed values!
  280.      */
  281.     wsprintf(achBuf, "%u", i);
  282.     WritePrivateProfileString(szSection, szKey, achBuf, szIniFile);
  283. }
  284.  
  285. void GetIniEntries(void)
  286. {
  287.   //Load Common Strings from stringtable...
  288.   LoadString(hMainInstance, idsIsPassword, szIsPassword, 22);
  289.   LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
  290.   LoadString(hMainInstance, idsScreenSaver, szScreenSaver, 22);
  291.   LoadString(hMainInstance, idsPassword, szPassword, 16);
  292.   LoadString(hMainInstance, idsDifferentPW, szDifferentPW, BUFFLEN);
  293.   LoadString(hMainInstance, idsChangePW, szChangePW, 30);
  294.   LoadString(hMainInstance, idsBadOldPW, szBadOldPW, 255);
  295.   LoadString(hMainInstance, idsHelpFile, szHelpFile, MAXFILELEN);
  296.   LoadString(hMainInstance, idsNoHelpMemory, szNoHelpMemory, BUFFLEN);
  297. }
  298.