home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prog_pm / chap09 / checker1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-01-09  |  4.0 KB  |  117 lines

  1. /*-------------------------------------------
  2.    CHECKER1.C -- Mouse Hit-Test Demo Program 
  3.   -------------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #include <os2.h>
  7.  
  8. #define DIVISIONS 5
  9.  
  10. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  11.  
  12. int main (void)
  13.      {
  14.      static CHAR  szClientClass [] = "Checker1" ;
  15.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU |
  16.                                  FCF_SIZEBORDER    | FCF_MINMAX  |
  17.                                  FCF_SHELLPOSITION | FCF_TASKLIST ;
  18.      HAB          hab ;
  19.      HMQ          hmq ;
  20.      HWND         hwndFrame, hwndClient ;
  21.      QMSG         qmsg ;
  22.  
  23.      hab = WinInitialize (0) ;
  24.      hmq = WinCreateMsgQueue (hab, 0) ;
  25.  
  26.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  27.  
  28.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  29.                                      &flFrameFlags, szClientClass, NULL,
  30.                                      0L, NULL, 0, &hwndClient) ;
  31.  
  32.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  33.           WinDispatchMsg (hab, &qmsg) ;
  34.  
  35.      WinDestroyWindow (hwndFrame) ;
  36.      WinDestroyMsgQueue (hmq) ;
  37.      WinTerminate (hab) ;
  38.      return 0 ;
  39.      }
  40.  
  41. VOID DrawLine (HPS hps, LONG x1, LONG y1, LONG x2, LONG y2)
  42.      {
  43.      POINTL ptl ;
  44.  
  45.      ptl.x = x1 ;  ptl.y = y1 ;  GpiMove (hps, &ptl) ;
  46.      ptl.x = x2 ;  ptl.y = y2 ;  GpiLine (hps, &ptl) ;
  47.      }
  48.  
  49. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  50.      {
  51.      static BOOL  fBlockState [DIVISIONS] [DIVISIONS] ;
  52.      static SHORT xBlock, yBlock ;
  53.      HPS          hps ;
  54.      RECTL        rcl ;
  55.      SHORT        x, y ;
  56.  
  57.      switch (msg)
  58.           {
  59.           case WM_SIZE:
  60.                xBlock = SHORT1FROMMP (mp2) / DIVISIONS ;
  61.                yBlock = SHORT2FROMMP (mp2) / DIVISIONS ;
  62.                return 0 ;
  63.  
  64.           case WM_BUTTON1DOWN:
  65.           case WM_BUTTON1DBLCLK:
  66.                if (xBlock > 0 && yBlock > 0)
  67.                     {
  68.                     x = MOUSEMSG(&msg)->x / xBlock ;
  69.                     y = MOUSEMSG(&msg)->y / yBlock ;
  70.  
  71.                     if (x < DIVISIONS && y < DIVISIONS)
  72.                          {
  73.                          fBlockState [x][y] = !fBlockState [x][y] ;
  74.  
  75.                          rcl.xRight = xBlock + (rcl.xLeft   = x * xBlock) ;
  76.                          rcl.yTop   = yBlock + (rcl.yBottom = y * yBlock) ;
  77.  
  78.                          WinInvalidateRect (hwnd, &rcl, FALSE) ;
  79.                          }
  80.                     else
  81.                          WinAlarm (HWND_DESKTOP, WA_WARNING) ;
  82.                     }
  83.                else
  84.                     WinAlarm (HWND_DESKTOP, WA_WARNING) ;
  85.  
  86.                break ;                       // do default processing
  87.  
  88.           case WM_PAINT:
  89.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  90.                GpiErase (hps) ;
  91.  
  92.                if (xBlock > 0 && yBlock > 0)
  93.                     for (x = 0 ; x < DIVISIONS ; x++)
  94.                          for (y = 0 ; y < DIVISIONS ; y++)
  95.                               {
  96.                               rcl.xRight = xBlock + (rcl.xLeft   = x * xBlock);
  97.                               rcl.yTop   = yBlock + (rcl.yBottom = y * yBlock);
  98.  
  99.                               WinDrawBorder (hps, &rcl, 1, 1,
  100.                                              CLR_NEUTRAL, CLR_BACKGROUND,
  101.                                              DB_STANDARD | DB_INTERIOR) ;
  102.  
  103.                               if (fBlockState [x][y])
  104.                                    {
  105.                                    DrawLine (hps, rcl.xLeft,  rcl.yBottom,
  106.                                                   rcl.xRight, rcl.yTop) ;
  107.  
  108.                                    DrawLine (hps, rcl.xLeft,  rcl.yTop,
  109.                                                   rcl.xRight, rcl.yBottom) ;
  110.                                    }
  111.                               }
  112.                WinEndPaint (hps) ;
  113.                return 0 ;
  114.           }
  115.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  116.      }
  117.