home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk11 / tk4 / pmcap / pmcap.c next >
Encoding:
C/C++ Source or Header  |  1989-02-20  |  16.9 KB  |  440 lines

  1. /*--------------------------------------------
  2.    PMCAP.C -- Captures PM Screen to .BMP File
  3.   --------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #include <os2.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include "pmcap.h"
  11.  
  12. #define ID_TIMER    1
  13.  
  14. typedef struct
  15.      {
  16.      BOOL  fMonochrome ;
  17.      BOOL  fHideWindow ;
  18.      BOOL  fAutoDialog ;
  19.      BOOL  fIncludePtr ;
  20.      SHORT sDelay ;
  21.      SHORT sDisplay ;
  22.      }
  23.      SETTINGS ;
  24.  
  25. MRESULT CALLBACK ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  26. MRESULT CALLBACK AboutDlgProc  (HWND, USHORT, MPARAM, MPARAM) ;
  27. MRESULT CALLBACK SaveDlgProc   (HWND, USHORT, MPARAM, MPARAM) ;
  28.  
  29. CHAR szClientClass [] = "PMCAP" ;
  30. HAB  hab ;
  31.  
  32. int main (void)
  33.      {
  34.      static SWCNTRL swctl ;
  35.      static ULONG   flFrameFlags = FCF_TITLEBAR   | FCF_SYSMENU |
  36.                                    FCF_SIZEBORDER | FCF_MINMAX  |
  37.                                    FCF_MENU       | FCF_ACCELTABLE |
  38.                                    FCF_SHELLPOSITION;
  39.      HMQ            hmq ;
  40.      HSWITCH        hsw ;
  41.      HWND           hwndFrame, hwndClient ;
  42.      QMSG           qmsg ;
  43.  
  44.      hab = WinInitialize (0) ;
  45.      hmq = WinCreateMsgQueue (hab, 0) ;
  46.  
  47.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  48.  
  49.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  50.                                      &flFrameFlags, szClientClass,
  51.                                      "PMCAP - Captures PM Screen",
  52.                                      0L, NULL, ID_RESOURCE, &hwndClient) ;
  53.  
  54.      WinSendMsg (hwndFrame, WM_SETICON,
  55.                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
  56.                  NULL) ;
  57.  
  58.      swctl.hwnd = hwndFrame ;
  59.      hsw = WinAddSwitchEntry (&swctl) ;
  60.  
  61.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  62.           WinDispatchMsg (hab, &qmsg) ;
  63.  
  64.      WinRemoveSwitchEntry (hsw) ;
  65.      WinDestroyWindow (hwndFrame) ;
  66.      WinDestroyMsgQueue (hmq) ;
  67.      WinTerminate (hab) ;
  68.      return 0 ;
  69.      }
  70.  
  71. MRESULT CALLBACK ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  72.      {
  73.      static CHAR     szFilename [81],
  74.                      szFilePaint [81],
  75.                      szAppName [] = "PMCAP",
  76.                      szKeySet  [] = "SETTINGS",
  77.                      szKeyFile [] = "FILENAME" ,
  78.                      szKeyPaint[] = "FILEPAINT" ;
  79.      static HBITMAP  hbm ;
  80.      static HWND     hwndFrame, hwndMenu ;
  81.      static SETTINGS set = { FALSE, FALSE, TRUE, FALSE,
  82.                              IDM_DELAY15, IDM_ACTUAL } ;
  83.      static SHORT    cxScreen, cyScreen, sCountDown ;
  84.      HBITMAP         hbmClip ;
  85.      HPS             hps ;
  86.      RECTL           rcl ;
  87.      SHORT           sSaveResult, sLen ;
  88.      USHORT          usfInfo ;
  89.  
  90.      switch (msg)
  91.           {
  92.           case WM_CREATE:
  93.                cxScreen = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN);
  94.                cyScreen = (SHORT) WinQuerySysValue (HWND_DESKTOP, SV_CYSCREEN);
  95.  
  96.                WinQueryProfileData   (hab, szAppName, szKeySet, &set, &sLen);
  97.                WinQueryProfileString (hab, szAppName, szKeyFile,
  98.                                       "BITMAP00.BMP", szFilename,
  99.                                       sizeof szFilename - 1) ;
  100.                WinQueryProfileString (hab, szAppName, szKeyPaint,
  101.                                       "PAINT00.MSP", szFilePaint,
  102.                                       sizeof szFilePaint - 1) ;
  103.  
  104.                SaveColorSettings (TRUE, set.fMonochrome) ;
  105.  
  106.                hwndFrame = WinQueryWindow (hwnd, QW_PARENT, FALSE) ;
  107.                hwndMenu  = WinWindowFromID (hwndFrame, FID_MENU) ;
  108.  
  109.                CheckMenuItem (hwndMenu, IDM_MONO,     set.fMonochrome) ;
  110.                CheckMenuItem (hwndMenu, IDM_HIDE,     set.fHideWindow) ;
  111.                CheckMenuItem (hwndMenu, IDM_AUTODLG,  set.fAutoDialog) ;
  112.                CheckMenuItem (hwndMenu, IDM_POINTER,  set.fIncludePtr) ;
  113.                CheckMenuItem (hwndMenu, set.sDelay,   TRUE) ;
  114.                CheckMenuItem (hwndMenu, set.sDisplay, TRUE) ;
  115.  
  116.                AddItemToSysMenu (hwndFrame) ;
  117.                return 0 ;
  118.  
  119.           case WM_INITMENU:
  120.                switch (SHORT1FROMMP (mp1))
  121.                     {
  122.                     case IDM_FILE:
  123.                          EnableMenuItem (hwndMenu, IDM_SAVE, hbm != NULL) ;
  124.                          EnableMenuItem (hwndMenu, IDM_SAVEPAINT,
  125.                                          IsBitmapMonoEGA (hbm)) ;
  126.                          return 0 ;
  127.  
  128.                     case IDM_EDIT:
  129.                          EnableMenuItem (hwndMenu, IDM_COPY, hbm != NULL) ;
  130.                          EnableMenuItem (hwndMenu, IDM_PASTE,
  131.                               WinQueryClipbrdFmtInfo (hab, CF_BITMAP, &usfInfo)
  132.                                    && usfInfo == CFI_HANDLE) ;
  133.                          return 0 ;
  134.                     }
  135.                break ;
  136.  
  137.           case WM_COMMAND:
  138.                switch (COMMANDMSG(&msg)->cmd)
  139.                     {
  140.                     case IDM_ABOUT:
  141.                          WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc,
  142.                                     NULL, IDD_ABOUT, NULL) ;
  143.                          return 0 ;
  144.  
  145.                     case IDM_SAVE:
  146.                          if (!WinDlgBox (HWND_DESKTOP, hwnd, SaveDlgProc,
  147.                                          NULL, IDD_SAVE, szFilename))
  148.                               return 0 ;
  149.  
  150.                          if (hbm != NULL)
  151.                               {
  152.                               WinSetPointer (HWND_DESKTOP,
  153.                                    WinQuerySysPointer (HWND_DESKTOP,
  154.                                                        SPTR_WAIT, FALSE)) ;
  155.  
  156.                               sSaveResult = SaveBitmap (hbm, szFilename) ;
  157.  
  158.                               WinSetPointer (HWND_DESKTOP,
  159.                                    WinQuerySysPointer (HWND_DESKTOP,
  160.                                                        SPTR_ARROW, FALSE)) ;
  161.  
  162.                               if (sSaveResult)
  163.                                    ErrorMessage (hwnd, sSaveResult) ;
  164.                               else
  165.                                    IncrementFilename (szFilename) ;
  166.                               }
  167.                          return 0 ;
  168.  
  169.                     case IDM_SAVEPAINT:
  170.                          if (!WinDlgBox (HWND_DESKTOP, hwnd, SaveDlgProc,
  171.                                          NULL, IDD_SAVEPAINT, szFilePaint))
  172.                               return 0 ;
  173.  
  174.                          if (IsBitmapMonoEGA (hbm))
  175.                               {
  176.                               WinSetPointer (HWND_DESKTOP,
  177.                                    WinQuerySysPointer (HWND_DESKTOP,
  178.                                                        SPTR_WAIT, FALSE)) ;
  179.  
  180.                               sSaveResult = SavePaintFormat (hbm, szFilePaint);
  181.  
  182.                               WinSetPointer (HWND_DESKTOP,
  183.                                    WinQuerySysPointer (HWND_DESKTOP,
  184.                                                        SPTR_ARROW, FALSE)) ;
  185.  
  186.                               if (sSaveResult)
  187.                                    ErrorMessage (hwnd, sSaveResult) ;
  188.                               else
  189.                                    IncrementFilename (szFilePaint) ;
  190.                               }
  191.                          return 0 ;
  192.  
  193.                     case IDM_COPY:
  194.                                              // Make copy of stored bitmap
  195.  
  196.                          hbmClip = CopyBitmap (hbm) ;
  197.  
  198.                                              // Set clipboard data to copy
  199.  
  200.                          if (hbmClip != NULL)
  201.                               {
  202.                               WinOpenClipbrd (hab) ;
  203.                               WinEmptyClipbrd (hab) ;
  204.                               WinSetClipbrdData (hab, (ULONG) hbmClip,
  205.                                                  CF_BITMAP, CFI_HANDLE) ;
  206.                               WinCloseClipbrd (hab) ;
  207.                               }
  208.                          else
  209.                               ErrorMessage (hwnd, IDS_BMPCREATE) ;
  210.                          return 0 ;
  211.  
  212.                     case IDM_PASTE:
  213.                                               // Get bitmap from clipboard
  214.  
  215.                          WinOpenClipbrd (hab) ;
  216.                          hbmClip = WinQueryClipbrdData (hab, CF_BITMAP) ;
  217.  
  218.                          if (hbmClip != NULL)
  219.                               {
  220.                               if (hbm != NULL)
  221.                                    GpiDeleteBitmap (hbm) ;
  222.  
  223.                                              // Make copy of it
  224.  
  225.                               hbm = CopyBitmap (hbmClip) ;
  226.  
  227.                               if (hbm == NULL)
  228.                                    ErrorMessage (hwnd, IDS_BMPCREATE) ;
  229.                               }
  230.                          WinCloseClipbrd (hab) ;
  231.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  232.                          return 0 ;
  233.  
  234.                     case IDM_BEGIN:
  235.                          if (WinStartTimer (hab, hwnd, ID_TIMER, 1000))
  236.                               {
  237.                               EnableMenuItem (hwndMenu, IDM_BEGIN, FALSE) ;
  238.                               EnableMenuItem (hwndMenu, IDM_ABORT, TRUE) ;
  239.                               sCountDown = set.sDelay - IDM_DELAY ;
  240.  
  241.                               if (set.fHideWindow)
  242.                                    WinShowWindow (hwndFrame, FALSE) ;
  243.                               }
  244.                          else
  245.                               ErrorMessage (hwnd, IDS_TIMER) ;
  246.  
  247.                          return 0 ;
  248.  
  249.                     case IDM_ABORT:
  250.                          EnableMenuItem (hwndMenu, IDM_BEGIN, TRUE) ;
  251.                          EnableMenuItem (hwndMenu, IDM_ABORT, FALSE) ;
  252.  
  253.                          WinStopTimer (hab, hwnd, ID_TIMER) ;
  254.                          return 0 ;
  255.  
  256.                     case IDM_MONO:
  257.                          CheckMenuItem (hwndMenu, IDM_MONO,
  258.                                         set.fMonochrome = !set.fMonochrome) ;
  259.                          
  260.                          SaveColorSettings (FALSE, set.fMonochrome) ;
  261.                          return 0 ;
  262.  
  263.                     case IDM_HIDE:
  264.                          CheckMenuItem (hwndMenu, IDM_HIDE,
  265.                                         set.fHideWindow = !set.fHideWindow) ;
  266.                          return 0 ;
  267.  
  268.                     case IDM_AUTODLG:
  269.                          CheckMenuItem (hwndMenu, IDM_AUTODLG,
  270.                                         set.fAutoDialog = !set.fAutoDialog) ;
  271.                          return 0 ;
  272.  
  273.                     case IDM_POINTER:
  274.                          CheckMenuItem (hwndMenu, IDM_POINTER,
  275.                                         set.fIncludePtr = !set.fIncludePtr) ;
  276.                          return 0 ;
  277.  
  278.                     case IDM_DELAY5:
  279.                     case IDM_DELAY10:
  280.                     case IDM_DELAY15:
  281.                     case IDM_DELAY30:
  282.                     case IDM_DELAY60:
  283.                          CheckMenuItem (hwndMenu, set.sDelay, FALSE) ;
  284.                          set.sDelay = COMMANDMSG(&msg)->cmd ;
  285.                          CheckMenuItem (hwndMenu, set.sDelay, TRUE) ;
  286.                          return 0 ;
  287.  
  288.                     case IDM_ACTUAL:
  289.                     case IDM_STRETCH:
  290.                          CheckMenuItem (hwndMenu, set.sDisplay, FALSE) ;
  291.                          set.sDisplay = COMMANDMSG(&msg)->cmd ;
  292.                          CheckMenuItem (hwndMenu, set.sDisplay, TRUE) ;
  293.  
  294.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  295.                          return 0 ;
  296.                     }
  297.  
  298.           case WM_TIMER:
  299.                switch (SHORT1FROMMP (mp1))
  300.                     {
  301.                     case ID_TIMER:
  302.                          if (--sCountDown)
  303.                               {
  304.                               DosBeep (1024, 100) ;
  305.                               return 0 ;
  306.                               }
  307.  
  308.                          DosBeep (1024, 1000) ;
  309.                          WinStopTimer (hab, hwnd, ID_TIMER) ;
  310.                          EnableMenuItem (hwndMenu, IDM_BEGIN, TRUE) ;
  311.                          EnableMenuItem (hwndMenu, IDM_ABORT, FALSE) ;
  312.  
  313.                                              // Delete old bitmap
  314.                          if (hbm != NULL)
  315.                               GpiDeleteBitmap (hbm) ;
  316.  
  317.                                              // Copy screen to bitmap
  318.  
  319.                          hbm = ScreenToBitmap (cxScreen, cyScreen,
  320.                                                set.fIncludePtr,
  321.                                                set.fMonochrome) ;
  322.  
  323.                          if (set.fHideWindow)
  324.                               WinShowWindow (hwndFrame, TRUE) ;
  325.  
  326.                          if (hbm == NULL)
  327.                               ErrorMessage (hwnd, IDS_BMPCREATE) ;
  328.  
  329.                          else if (set.fAutoDialog)
  330.                               WinPostMsg (hwnd, WM_COMMAND,
  331.                                    MPFROMSHORT (
  332.                                         set.fMonochrome ? IDM_SAVEPAINT
  333.                                                         : IDM_SAVE),
  334.                                         NULL) ;
  335.  
  336.                          WinInvalidateRect (hwnd, NULL, FALSE) ;
  337.                          WinUpdateWindow (hwnd) ;
  338.                          return 0 ;
  339.                     }
  340.                break ;
  341.  
  342.           case WM_PAINT:
  343.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  344.                GpiErase (hps) ;
  345.  
  346.                if (hbm != NULL)
  347.                     {
  348.                     WinQueryWindowRect (hwnd, &rcl) ;
  349.  
  350.                     WinDrawBitmap (hps, hbm, NULL, (PPOINTL) &rcl,
  351.                                    CLR_NEUTRAL, CLR_BACKGROUND,
  352.                                    set.sDisplay == IDM_STRETCH ?
  353.                                         DBM_STRETCH : DBM_NORMAL) ;
  354.                     }
  355.                WinEndPaint (hps) ;
  356.                return 0 ;
  357.  
  358.           case WM_DESTROY:
  359.                if (hbm != NULL)
  360.                     GpiDeleteBitmap (hbm) ;
  361.  
  362.                WinWriteProfileString (hab, szAppName, szKeyFile, szFilename) ;
  363.                WinWriteProfileString (hab, szAppName, szKeyPaint,szFilePaint);
  364.                WinWriteProfileData   (hab, szAppName, szKeySet,
  365.                                       &set, sizeof set) ;
  366.  
  367.                if (set.fMonochrome)
  368.                     SaveColorSettings (FALSE, FALSE) ;
  369.  
  370.                return 0 ;
  371.           }
  372.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  373.      }
  374.  
  375. MRESULT CALLBACK AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  376.      {
  377.      switch (msg)
  378.           {
  379.           case WM_COMMAND:
  380.                switch (COMMANDMSG(&msg)->cmd)
  381.                     {
  382.                     case DID_OK:
  383.                     case DID_CANCEL:
  384.                          WinDismissDlg (hwnd, TRUE) ;
  385.                          return 0 ;
  386.                     }
  387.                break ;
  388.           }
  389.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  390.      }
  391.  
  392. MRESULT CALLBACK SaveDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  393.      {
  394.      static PCHAR szFilename ;
  395.      FILE         *file ;
  396.  
  397.      switch (msg)
  398.           {
  399.           case WM_INITDLG:
  400.                szFilename = PVOIDFROMMP (mp2) ;
  401.  
  402.                WinSendDlgItemMsg (hwnd, IDD_FILENAME, EM_SETTEXTLIMIT,
  403.                                   MPFROMSHORT (80), NULL) ;
  404.  
  405.                WinSetDlgItemText (hwnd, IDD_FILENAME, szFilename) ;
  406.                break ;
  407.  
  408.           case WM_COMMAND:
  409.                switch (COMMANDMSG(&msg)->cmd)
  410.                     {
  411.                     case DID_OK:
  412.                          WinQueryDlgItemText (hwnd, IDD_FILENAME,
  413.                                               80, szFilename) ;
  414.  
  415.                                    // Test if file exists
  416.  
  417.                          if (file = fopen (szFilename, "r"))
  418.                               {
  419.                               fclose (file) ;
  420.  
  421.                               if (MBID_NO == WinMessageBox (HWND_DESKTOP, hwnd,
  422.                                                   "File exists.  Replace it?",
  423.                                                   szClientClass, 0,
  424.                                                   MB_YESNO | MB_ICONQUESTION |
  425.                                                   MB_DEFBUTTON2 | MB_MOVEABLE))
  426.                                    return 0 ;
  427.                               }
  428.  
  429.                          WinDismissDlg (hwnd, TRUE) ;
  430.                          return 0 ;
  431.  
  432.                     case DID_CANCEL:
  433.                          WinDismissDlg (hwnd, FALSE) ;
  434.                          return 0 ;
  435.                     }
  436.                break ;
  437.           }
  438.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  439.      }
  440.