Annotation of pmsdk/samples/petzold/chap08/keylook.c, revision 1.1.1.1

1.1       root        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:      }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.