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

  1. /*-----------------------------------------
  2.    BLOKOUT1.C -- Mouse Button Demo Program 
  3.   -----------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #include <os2.h>
  8.  
  9. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  10.  
  11. int main (void)
  12.      {
  13.      static CHAR  szClientClass [] = "BlokOut1" ;
  14.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU |
  15.                                  FCF_SIZEBORDER    | FCF_MINMAX  |
  16.                                  FCF_SHELLPOSITION | FCF_TASKLIST ;
  17.      HAB          hab ;
  18.      HMQ          hmq ;
  19.      HWND         hwndFrame, hwndClient ;
  20.      QMSG         qmsg ;
  21.  
  22.      hab = WinInitialize (0) ;
  23.      hmq = WinCreateMsgQueue (hab, 0) ;
  24.  
  25.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  26.  
  27.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  28.                                      &flFrameFlags, szClientClass, NULL,
  29.                      0L, NULL, 0, &hwndClient) ;
  30.  
  31.      WinSendMsg (hwndFrame, WM_SETICON,
  32.                  WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
  33.                  NULL) ;
  34.  
  35.      while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  36.           WinDispatchMsg (hab, &qmsg) ;
  37.  
  38.      WinDestroyWindow (hwndFrame) ;
  39.      WinDestroyMsgQueue (hmq) ;
  40.      WinTerminate (hab) ;
  41.      return 0 ;
  42.      }
  43.  
  44. VOID DrawBoxOutline (HWND hwnd, POINTL *pptlStart, POINTL *pptlEnd)
  45.      {
  46.      HPS hps ;
  47.  
  48.      hps = WinGetPS (hwnd) ;
  49.      GpiSetMix (hps, FM_INVERT) ;
  50.  
  51.      GpiMove (hps, pptlStart) ;
  52.      GpiBox (hps, DRO_OUTLINE, pptlEnd, 0L, 0L) ;
  53.  
  54.      WinReleasePS (hps) ;
  55.      }
  56.  
  57. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  58.      {
  59.      static BOOL   fButtonDown, fValidBox ;
  60.      static POINTL ptlStart, ptlEnd, ptlBoxStart, ptlBoxEnd ;
  61.      HPS           hps ;
  62.  
  63.      switch (msg)
  64.           {
  65.           case WM_BUTTON1DOWN:
  66.                ptlStart.x = ptlEnd.x = MOUSEMSG(&msg)->x ;
  67.                ptlStart.y = ptlEnd.y = MOUSEMSG(&msg)->y ;
  68.  
  69.                DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
  70.  
  71.                fButtonDown = TRUE ;
  72.                break ;                       // do default processing
  73.  
  74.           case WM_MOUSEMOVE:
  75.                if (fButtonDown)
  76.                     {
  77.                     DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
  78.  
  79.                     ptlEnd.x = MOUSEMSG(&msg)->x ;
  80.                     ptlEnd.y = MOUSEMSG(&msg)->y ;
  81.  
  82.                     DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
  83.                     }
  84.                break ;                       // do default processing
  85.  
  86.           case WM_BUTTON1UP:
  87.                if (fButtonDown)
  88.                     {
  89.                     DrawBoxOutline (hwnd, &ptlStart, &ptlEnd) ;
  90.  
  91.                     ptlBoxStart = ptlStart ;
  92.                     ptlBoxEnd.x = MOUSEMSG(&msg)->x ;
  93.                     ptlBoxEnd.y = MOUSEMSG(&msg)->y ;
  94.  
  95.                     fButtonDown = FALSE ;
  96.                     fValidBox = TRUE ;
  97.                     WinInvalidateRect (hwnd, NULL, FALSE) ;
  98.                     }
  99.                return 0 ;
  100.  
  101.           case WM_PAINT:
  102.                hps = WinBeginPaint (hwnd, NULL, NULL) ;
  103.                GpiErase (hps) ;
  104.  
  105.                if (fValidBox)
  106.                     {
  107.                     GpiMove (hps, &ptlBoxStart) ;
  108.                     GpiBox (hps, DRO_OUTLINEFILL, &ptlBoxEnd, 0L, 0L) ;
  109.                     }
  110.                if (fButtonDown)
  111.                     {
  112.                     GpiSetMix (hps, FM_INVERT) ;
  113.  
  114.                     GpiMove (hps, &ptlStart) ;
  115.                     GpiBox (hps, DRO_OUTLINE, &ptlEnd, 0L, 0L) ;
  116.                     }
  117.                WinEndPaint (hps) ;
  118.                return 0 ;
  119.           }
  120.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  121.      }
  122.