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

  1. /*----------------------------------------
  2.    KEYLOOK.C -- Displays WM_CHAR Messages
  3.   ----------------------------------------*/
  4.  
  5. #define INCL_WIN
  6. #define INCL_GPI
  7. #include <os2.h>
  8. #include <stdio.h>
  9. #include "easyfont.h"
  10.  
  11. #define LCID_FIXEDFONT 1L
  12. #define MAX_KEYS       100
  13.  
  14. MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
  15.  
  16. CHAR szClientClass [] = "KeyLook" ;
  17. HAB  hab ;
  18.  
  19. int main (void)
  20.      {
  21.      static ULONG flFrameFlags = FCF_TITLEBAR      | FCF_SYSMENU |
  22.                                  FCF_SIZEBORDER    | FCF_MINMAX  |
  23.                                  FCF_SHELLPOSITION | FCF_TASKLIST ;
  24.      HMQ          hmq ;
  25.      HWND         hwndFrame, hwndClient ;
  26.      QMSG         qmsg ;
  27.  
  28.      hab = WinInitialize (0) ;
  29.      hmq = WinCreateMsgQueue (hab, 0) ;
  30.  
  31.      WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
  32.  
  33.      hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
  34.                                      &flFrameFlags, szClientClass, NULL,
  35.                                      0L, NULL, 0, &hwndClient) ;
  36.      if (hwndFrame != NULL)
  37.           {
  38.           WinSendMsg (hwndFrame, WM_SETICON,
  39.                       WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
  40.                       NULL) ;
  41.  
  42.           while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
  43.                WinDispatchMsg (hab, &qmsg) ;
  44.  
  45.           WinDestroyWindow (hwndFrame) ;
  46.           }
  47.      WinDestroyMsgQueue (hmq) ;
  48.      WinTerminate (hab) ;
  49.      return 0 ;
  50.      }
  51.  
  52. MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
  53.      {
  54.      static CHAR   szHeader [] = "Scan  Rept  IN TG IC CM DK LK PD KU"
  55.                                  " AL CT SH SC VK CH  Virt  Char" ;
  56.      static CHAR   szUndrLn [] = "----  ----  -- -- -- -- -- -- -- --"
  57.                                  " -- -- -- -- -- --  ----  ----" ;
  58.      static CHAR   szFormat [] = "%4X %4dx  %2d %2d %2d %2d %2d %2d %2d %2d"
  59.                                  " %2d %2d %2d %2d %2d %2d  %4X  %4X  %c" ;
  60.  
  61.      static SHORT  cxChar, cyChar, cyDesc, cxClient, cyClient, sNextKey ;
  62.      static struct {
  63.                    MPARAM mp1 ;
  64.                    MPARAM mp2 ;
  65.                    BOOL   fValid ;
  66.                    }
  67.                    key [MAX_KEYS] ;
  68.      CHAR          szBuffer [80] ;
  69.      FONTMETRICS   fm ;
  70.      HPS           hps ;
  71.      POINTL        ptl ;
  72.      RECTL         rcl, rclInvalid ;
  73.      SHORT         sKey, sIndex, sFlag ;
  74.  
  75.      switch (msg)
  76.           {
  77.           case WM_CREATE:
  78.                hps = WinGetPS (hwnd) ;
  79.                EzfQueryFonts (hps) ;
  80.  
  81.                if (!EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR,
  82.                                                            FONTSIZE_10, 0))
  83.                     {
  84.                     WinReleasePS (hps) ;
  85.  
  86.                     WinMessageBox (HWND_DESKTOP, HWND_DESKTOP,
  87.                          "Cannot find a fixed-pitch font.  Load the Courier "
  88.                          "fonts from the Control Panel and try again.",
  89.                          szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
  90.  
  91.                     return 1 ;
  92.                     }
  93.  
  94.                GpiSetCharSet (hps, LCID_FIXEDFONT) ;
  95.  
  96.                GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
  97.                cxChar = (SHORT) fm.lAveCharWidth ;
  98.                cyChar = (SHORT) fm.lMaxBaselineExt ;
  99.                cyDesc = (SHORT) fm.lMaxDescender ;
  100.  
  101.                GpiSetCharSet (hps, LCID_DEFAULT) ;
  102.                GpiDeleteSetId (hps, LCID_FIXEDFONT) ;
  103.                WinReleasePS (hps) ;
  104.                return 0 ;
  105.  
  106.           case WM_SIZE:
  107.                cxClient = SHORT1FROMMP (mp2) ;
  108.                cyClient = SHORT2FROMMP (mp2) ;
  109.                return 0 ;
  110.  
  111.           case WM_CHAR:
  112.                key [sNextKey].mp1 = mp1 ;
  113.                key [sNextKey].mp2 = mp2 ;
  114.                key [sNextKey].fValid = TRUE ;
  115.  
  116.                sNextKey = (sNextKey + 1) % MAX_KEYS ;
  117.  
  118.                WinSetRect (hwnd, &rcl,
  119.                            0, 2 * cyChar, cxClient, cyClient - 2 * cyChar) ;
  120.  
  121.                WinScrollWindow (hwnd, 0, cyChar, &rcl, &rcl, NULL, NULL,
  122.                                                  SW_INVALIDATERGN) ;
  123.                WinUpdateWindow (hwnd) ;
  124.                return 0 ;
  125.  
  126.           case WM_PAINT:
  127.                hps = WinBeginPaint (hwnd, NULL, &rclInvalid) ;
  128.                GpiErase (hps) ;
  129.                EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR,
  130.                                                       FONTSIZE_10, 0) ;
  131.                GpiSetCharSet (hps, LCID_FIXEDFONT) ;
  132.  
  133.                ptl.x = cxChar ;
  134.                ptl.y = cyDesc ;
  135.                GpiCharStringAt (hps, &ptl, sizeof szHeader - 1L, szHeader) ;
  136.  
  137.                ptl.y += cyChar ;
  138.                GpiCharStringAt (hps, &ptl, sizeof szUndrLn - 1L, szUndrLn) ;
  139.  
  140.                for (sKey = 0 ; sKey < MAX_KEYS ; sKey++)
  141.                     {
  142.                     ptl.y += cyChar ;
  143.  
  144.                     sIndex = (sNextKey - sKey - 1 + MAX_KEYS) % MAX_KEYS ;
  145.  
  146.                     if (ptl.y > rclInvalid.yTop ||
  147.                               ptl.y > cyClient - 2 * cyChar ||
  148.                                    !key [sIndex].fValid)
  149.                          break ;
  150.                          
  151.                     mp1 = key [sIndex].mp1 ;
  152.                     mp2 = key [sIndex].mp2 ;
  153.  
  154.                     sFlag = CHARMSG(&msg)->fs ;
  155.  
  156.                     GpiCharStringAt (hps, &ptl, 
  157.                          (LONG) sprintf (szBuffer, szFormat,
  158.                                    CHARMSG(&msg)->scancode,
  159.                                    CHARMSG(&msg)->cRepeat,
  160.                                    sFlag & KC_INVALIDCHAR ? 1 : 0,
  161.                                    sFlag & KC_TOGGLE      ? 1 : 0,
  162.                                    sFlag & KC_INVALIDCOMP ? 1 : 0,
  163.                                    sFlag & KC_COMPOSITE   ? 1 : 0,
  164.                                    sFlag & KC_DEADKEY     ? 1 : 0,
  165.                                    sFlag & KC_LONEKEY     ? 1 : 0,
  166.                                    sFlag & KC_PREVDOWN    ? 1 : 0,
  167.                                    sFlag & KC_KEYUP       ? 1 : 0,
  168.                                    sFlag & KC_ALT         ? 1 : 0,
  169.                                    sFlag & KC_CTRL        ? 1 : 0,
  170.                                    sFlag & KC_SHIFT       ? 1 : 0,
  171.                                    sFlag & KC_SCANCODE    ? 1 : 0,
  172.                                    sFlag & KC_VIRTUALKEY  ? 1 : 0,
  173.                                    sFlag & KC_CHAR        ? 1 : 0,
  174.                                    CHARMSG(&msg)->vkey,
  175.                                    CHARMSG(&msg)->chr,
  176.                                    sFlag & KC_CHAR ? CHARMSG(&msg)->chr : ' '),
  177.                               szBuffer) ;
  178.                     }
  179.                ptl.y = cyClient - cyChar + cyDesc ;
  180.                GpiCharStringAt (hps, &ptl, sizeof szHeader - 1L, szHeader) ;
  181.  
  182.                ptl.y -= cyChar ;
  183.                GpiCharStringAt (hps, &ptl, sizeof szUndrLn - 1L, szUndrLn) ;
  184.  
  185.                GpiSetCharSet (hps, LCID_DEFAULT) ;
  186.                GpiDeleteSetId (hps, LCID_FIXEDFONT) ;
  187.                WinEndPaint (hps) ;
  188.                return 0 ;
  189.           }
  190.      return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
  191.      }
  192.