|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.