home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk11 / petzold / chap14 / pattdlg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-02-20  |  7.5 KB  |  221 lines

  1. /*--------------------------------------------------
  2.    PATTDLG.C -- Select GPI Patterns from Dialog Box
  3.   --------------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #include <os2.h>
  8. #include "pattdlg.h"
  9.  
  10. typedef struct
  11.      {
  12.      SHORT sPattern ;
  13.      SHORT sColor ;
  14.      BOOL  fBorder ;
  15.      }
  16.      PATTERNSDATA ;
  17.  
  18. typedef PATTERNSDATA FAR *PPATTERNSDATA ;
  19.  
  20. MRESULT EXPENTRY ClientWndProc  (HWND, USHORT, MPARAM, MPARAM) ;
  21. MRESULT EXPENTRY AboutDlgProc   (HWND, USHORT, MPARAM, MPARAM) ;
  22. MRESULT EXPENTRY PatternDlgProc (HWND, USHORT, MPARAM, MPARAM) ;
  23.  
  24. HAB  hab ;
  25.  
  26. int main (void)
  27.      {
  28.      static CHAR  szClientClass[] = "PattDlg" ;
  29.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU  |
  30.                                  FCF_SIZEBORDER    | FCF_MINMAX   |
  31.                                  FCF_SHELLPOSITION | FCF_TASKLIST |
  32.                                  FCF_MENU ;
  33.      HMQ          hmq ;
  34.      HWND         hwndFrame, hwndClient ;
  35.      QMSG         qmsg ;
  36.  
  37.      hab = WinInitialize (0) ;
  38.      hmq = WinCreateMsgQueue (hab, 0) ;
  39.  
  40.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  41.  
  42.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  43.                                      &flFrameFlags, szClientClass, NULL,
  44.                      0L, NULL, ID_RESOURCE, &hwndClient) ;
  45.  
  46.      WinSendMsg (hwndFrame, WM_SETICON,
  47.                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
  48.                  NULL) ;
  49.  
  50.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  51.           WinDispatchMsg (hab, &qmsg) ;
  52.  
  53.      WinDestroyWindow (hwndFrame) ;
  54.      WinDestroyMsgQueue (hmq) ;
  55.      WinTerminate (hab) ;
  56.      return 0 ;
  57.      }
  58.  
  59. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  60.      {
  61.      static CHAR         szAppName [] = "PATTDLG" ;
  62.      static CHAR         szKeyName [] = "SETTINGS" ;
  63.      static PATTERNSDATA pdCurrent = { IDD_DENSE1, IDD_BKGRND, TRUE } ;
  64.      static SHORT        cxClient, cyClient ;
  65.      HPS                 hps ;
  66.      POINTL              ptl ;
  67.      SHORT               sDataLength ;
  68.  
  69.      switch (msg)
  70.           {
  71.           case WM_CREATE:
  72.                sDataLength = sizeof pdCurrent ;
  73.  
  74.                WinQueryProfileData (hab, szAppName, szKeyName, &pdCurrent,
  75.                                     &sDataLength) ;
  76.                return 0 ;
  77.  
  78.           case WM_SIZE:
  79.                cxClient = SHORT1FROMMP (mp2) ;
  80.                cyClient = SHORT2FROMMP (mp2) ;
  81.                return 0 ;
  82.  
  83.           case WM_COMMAND:
  84.                switch (COMMANDMSG(&msg)->cmd)
  85.                     {
  86.                     case IDM_PATTERNS:
  87.                          if (WinDlgBox (HWND_DESKTOP, hwnd, PatternDlgProc,
  88.                                         NULL, IDD_PATTERNS, &pdCurrent))
  89.  
  90.                               WinInvalidateRect (hwnd, NULL, FALSE) ;
  91.                          return 0 ;
  92.  
  93.                     case IDM_ABOUT:
  94.                          WinDlgBox (HWND_DESKTOP, hwnd, AboutDlgProc,
  95.                                     NULL, IDD_ABOUT, NULL) ;
  96.                          return 0 ;
  97.                     }
  98.                break ;
  99.  
  100.           case WM_PAINT:
  101.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  102.                GpiErase (hps) ;
  103.  
  104.                GpiSetColor (hps, pdCurrent.sColor -
  105.                                  IDD_BKGRND + CLR_BACKGROUND) ;
  106.  
  107.                GpiSetPattern (hps, pdCurrent.sPattern -
  108.                                    IDD_DENSE1 + PATSYM_DENSE1) ;
  109.  
  110.                ptl.x = cxClient / 4 ;
  111.                ptl.y = cyClient / 4 ;
  112.                GpiMove (hps, &ptl) ;
  113.  
  114.                ptl.x *= 3 ;
  115.                ptl.y *= 3 ;
  116.                GpiBox (hps, pdCurrent.fBorder ? DRO_OUTLINEFILL : DRO_FILL,
  117.                             &ptl, 0L, 0L) ;
  118.  
  119.                WinEndPaint (hps) ;
  120.                return 0 ;
  121.  
  122.           case WM_DESTROY:
  123.                if (MBID_YES == WinMessageBox (HWND_DESKTOP, hwnd,
  124.                                     "Save current settings?", szAppName, 0,
  125.                                     MB_YESNO | MB_ICONQUESTION))
  126.  
  127.                     WinWriteProfileData (hab, szAppName, szKeyName, &pdCurrent,
  128.                                          sizeof pdCurrent) ;
  129.                break ;
  130.           }
  131.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  132.      }
  133.  
  134. MRESULT EXPENTRY AboutDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  135.      {
  136.      switch (msg)
  137.           {
  138.           case WM_COMMAND:
  139.                switch (COMMANDMSG(&msg)->cmd)
  140.                     {
  141.                     case DID_OK:
  142.                     case DID_CANCEL:
  143.                          WinDismissDlg (hwnd, TRUE) ;
  144.                          return 0 ;
  145.                     }
  146.                break ;
  147.           }
  148.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  149.      }
  150.  
  151. MRESULT EXPENTRY PatternDlgProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  152.      {
  153.      static PATTERNSDATA  pdLocal ;
  154.      static PPATTERNSDATA ppdCurrent ;
  155.  
  156.      switch (msg)
  157.           {
  158.           case WM_INITDLG:
  159.                ppdCurrent = MPFROMP (mp2) ;
  160.                pdLocal = *ppdCurrent ;
  161.  
  162.                WinSendDlgItemMsg (hwnd, pdLocal.sPattern, BM_SETCHECK,
  163.                                   MPFROM2SHORT (TRUE, 0), NULL) ;
  164.  
  165.                WinSendDlgItemMsg (hwnd, pdLocal.sColor, BM_SETCHECK,
  166.                                   MPFROM2SHORT (TRUE, 0), NULL) ;
  167.  
  168.                WinSendDlgItemMsg (hwnd, IDD_BORDER, BM_SETCHECK,
  169.                                   MPFROM2SHORT (pdLocal.fBorder, 0), NULL) ;
  170.  
  171.                WinSetFocus (HWND_DESKTOP,
  172.                             WinWindowFromID (hwnd, pdLocal.sPattern)) ;
  173.                return 1 ;
  174.  
  175.           case WM_CONTROL:
  176.                if (SHORT1FROMMP (mp1) >= IDD_DENSE1 &&
  177.                    SHORT1FROMMP (mp1) <= IDD_HALFTONE)
  178.                     {
  179.                     WinSendDlgItemMsg (hwnd, pdLocal.sPattern, BM_SETCHECK,
  180.                                        MPFROM2SHORT (FALSE, 0), NULL) ;
  181.  
  182.                     pdLocal.sPattern = SHORT1FROMMP (mp1) ;
  183.  
  184.                     WinSendDlgItemMsg (hwnd, pdLocal.sPattern, BM_SETCHECK,
  185.                                        MPFROM2SHORT (TRUE, 0), NULL) ;
  186.                     }
  187.  
  188.                else if (SHORT1FROMMP (mp1) >= IDD_BKGRND &&
  189.                         SHORT1FROMMP (mp1) <= IDD_PALEGRAY)
  190.                     {
  191.                     WinSendDlgItemMsg (hwnd, pdLocal.sColor, BM_SETCHECK,
  192.                                        MPFROM2SHORT (FALSE, 0), NULL) ;
  193.  
  194.                     pdLocal.sColor = SHORT1FROMMP (mp1) ;
  195.  
  196.                     WinSendDlgItemMsg (hwnd, pdLocal.sColor, BM_SETCHECK,
  197.                                              MPFROM2SHORT (TRUE, 0), NULL) ; 
  198.                     }
  199.                return 0 ;
  200.  
  201.           case WM_COMMAND:
  202.                switch (COMMANDMSG(&msg)->cmd)
  203.                     {
  204.                     case DID_OK:
  205.                          pdLocal.fBorder = (BOOL) WinSendDlgItemMsg (hwnd,
  206.                                    IDD_BORDER, BM_QUERYCHECK, NULL, NULL) ;
  207.  
  208.                          *ppdCurrent = pdLocal ;
  209.  
  210.                          WinDismissDlg (hwnd, TRUE) ;
  211.                          return 0 ;
  212.  
  213.                     case DID_CANCEL:
  214.                          WinDismissDlg (hwnd, FALSE) ;
  215.                          return 0 ;
  216.                     }
  217.                break ;
  218.           }
  219.      return WinDefDlgProc (hwnd, msg, mp1, mp2) ;
  220.      }
  221.