|
|
1.1 ! root 1: /*---------------------------------------- ! 2: KEYLOOK.C -- Displays WM_CHAR Messages ! 3: ----------------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #define INCL_GPI ! 7: ! 8: #include <os2.h> ! 9: #include <stdio.h> ! 10: ! 11: #define MAX_KEYS 100 ! 12: ! 13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 14: ! 15: int main (void) ! 16: { ! 17: static CHAR szClientClass [] = "KeyLook" ; ! 18: HAB hab ; ! 19: HMQ hmq ; ! 20: HWND hwndFrame, hwndClient ; ! 21: QMSG qmsg ; ! 22: ULONG flFrameFlags = FCF_STANDARD & ~FCF_MENU ; ! 23: ULONG flFrameStyle = WS_VISIBLE ; ! 24: ! 25: hab = WinInitialize (0) ; ! 26: hmq = WinCreateMsgQueue (hab, 0) ; ! 27: ! 28: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 29: ! 30: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, flFrameStyle, ! 31: &flFrameFlags, szClientClass, ! 32: "WM_CHAR Messages", ! 33: 0L, NULL, 0, &hwndClient) ; ! 34: ! 35: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 36: WinDispatchMsg (hab, &qmsg) ; ! 37: ! 38: WinDestroyWindow (hwndFrame) ; ! 39: WinDestroyMsgQueue (hmq) ; ! 40: WinTerminate (hab) ; ! 41: ! 42: return 0 ; ! 43: } ! 44: ! 45: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 46: { ! 47: static CHAR szHeader [] = "Scan Rept IN TG IC CM DK LK PD KU" ! 48: " AL CO SH SC VK CH Virt Char" ; ! 49: static CHAR szUndrLn [] = "---- ---- -- -- -- -- -- -- -- --" ! 50: " -- -- -- -- -- -- ---- ----" ; ! 51: static CHAR szFormat [] = "%4X %4dx %2d %2d %2d %2d %2d %2d %2d %2d" ! 52: " %2d %2d %2d %2d %2d %2d %4X %4X %c" ; ! 53: ! 54: static SHORT cxChar, cyChar, cyDesc, cxClient, cyClient, sNextKey ; ! 55: static struct { ! 56: MPARAM mp1 ; ! 57: MPARAM mp2 ; ! 58: BOOL fValid ; ! 59: } ! 60: key [MAX_KEYS] ; ! 61: CHAR szBuffer [80] ; ! 62: FONTMETRICS fm ; ! 63: HPS hps ; ! 64: POINTL ptl ; ! 65: RECTL rcl, rclInvalid ; ! 66: SHORT sKey, sIndex, sFlag ; ! 67: ! 68: switch (msg) ! 69: { ! 70: case WM_CREATE: ! 71: hps = WinGetPS (hwnd) ; ! 72: GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ; ! 73: cxChar = (SHORT) fm.lAveCharWidth ; ! 74: cyChar = (SHORT) fm.lMaxBaselineExt ; ! 75: cyDesc = (SHORT) fm.lMaxDescender ; ! 76: WinReleasePS (hps) ; ! 77: return 0 ; ! 78: ! 79: case WM_SIZE: ! 80: cxClient = SHORT1FROMMP (mp2) ; ! 81: cyClient = SHORT2FROMMP (mp2) ; ! 82: return 0 ; ! 83: ! 84: case WM_CHAR: ! 85: key [sNextKey].mp1 = mp1 ; ! 86: key [sNextKey].mp2 = mp2 ; ! 87: key [sNextKey].fValid = TRUE ; ! 88: ! 89: sNextKey = (sNextKey + 1) % MAX_KEYS ; ! 90: ! 91: WinSetRect (hwnd, &rcl, 0, 0, cxClient, cyClient - 2 * cyChar) ; ! 92: ! 93: WinScrollWindow (hwnd, 0, cyChar, &rcl, &rcl, NULL, NULL, ! 94: SW_INVALIDATERGN) ; ! 95: WinUpdateWindow (hwnd) ; ! 96: return 1 ; ! 97: ! 98: case WM_PAINT: ! 99: hps = WinBeginPaint (hwnd, NULL, &rclInvalid) ; ! 100: GpiErase (hps) ; ! 101: ! 102: ptl.x = cxChar ; ! 103: ptl.y = cyDesc - cyChar ; ! 104: ! 105: for (sKey = 0 ; sKey < MAX_KEYS ; sKey++) ! 106: { ! 107: ptl.y += cyChar ; ! 108: ! 109: sIndex = (sNextKey - sKey - 1 + MAX_KEYS) % MAX_KEYS ; ! 110: ! 111: if (ptl.y > rclInvalid.yTop || ! 112: ptl.y > cyClient - 2 * cyChar || ! 113: !key [sIndex].fValid) ! 114: break ; ! 115: ! 116: mp1 = key [sIndex].mp1 ; ! 117: mp2 = key [sIndex].mp2 ; ! 118: ! 119: sFlag = CHARMSG(&msg)->fs ; ! 120: ! 121: GpiCharStringAt (hps, &ptl, ! 122: (LONG) sprintf (szBuffer, szFormat, ! 123: CHARMSG(&msg)->scancode, ! 124: CHARMSG(&msg)->cRepeat, ! 125: sFlag & KC_INVALIDCHAR ? 1 : 0, ! 126: sFlag & KC_TOGGLE ? 1 : 0, ! 127: sFlag & KC_INVALIDCOMP ? 1 : 0, ! 128: sFlag & KC_COMPOSITE ? 1 : 0, ! 129: sFlag & KC_DEADKEY ? 1 : 0, ! 130: sFlag & KC_LONEKEY ? 1 : 0, ! 131: sFlag & KC_PREVDOWN ? 1 : 0, ! 132: sFlag & KC_KEYUP ? 1 : 0, ! 133: sFlag & KC_ALT ? 1 : 0, ! 134: sFlag & KC_CTRL ? 1 : 0, ! 135: sFlag & KC_SHIFT ? 1 : 0, ! 136: sFlag & KC_SCANCODE ? 1 : 0, ! 137: sFlag & KC_VIRTUALKEY ? 1 : 0, ! 138: sFlag & KC_CHAR ? 1 : 0, ! 139: CHARMSG(&msg)->vkey, ! 140: CHARMSG(&msg)->chr, ! 141: CHARMSG(&msg)->chr), ! 142: szBuffer) ; ! 143: } ! 144: ptl.y = cyClient - cyChar + cyDesc ; ! 145: GpiCharStringAt (hps, &ptl, sizeof szHeader - 1L, szHeader) ; ! 146: ! 147: ptl.y -= cyChar ; ! 148: GpiCharStringAt (hps, &ptl, sizeof szUndrLn - 1L, szUndrLn) ; ! 149: ! 150: WinEndPaint (hps) ; ! 151: return 0 ; ! 152: } ! 153: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.