|
|
1.1 ! root 1: /*------------------------------------------------------------------- ! 2: CHECKER2.C -- Mouse Hit-Test Demo Program with Keyboard Interface ! 3: -------------------------------------------------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #include <os2.h> ! 7: #include <stdlib.h> ! 8: ! 9: #define DIVISIONS 5 ! 10: ! 11: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 12: ! 13: int main (void) ! 14: { ! 15: static CHAR szClientClass [] = "Checker2" ; ! 16: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | ! 17: FCF_SIZEBORDER | FCF_MINMAX | ! 18: FCF_SHELLPOSITION | FCF_TASKLIST ; ! 19: HAB hab ; ! 20: HMQ hmq ; ! 21: HWND hwndFrame, hwndClient ; ! 22: QMSG qmsg ; ! 23: ! 24: hab = WinInitialize (0) ; ! 25: hmq = WinCreateMsgQueue (hab, 0) ; ! 26: ! 27: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 28: ! 29: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE, ! 30: &flFrameFlags, szClientClass, NULL, ! 31: 0L, NULL, 0, &hwndClient) ; ! 32: ! 33: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 34: WinDispatchMsg (hab, &qmsg) ; ! 35: ! 36: WinDestroyWindow (hwndFrame) ; ! 37: WinDestroyMsgQueue (hmq) ; ! 38: WinTerminate (hab) ; ! 39: return 0 ; ! 40: } ! 41: ! 42: VOID DrawLine (HPS hps, LONG x1, LONG y1, LONG x2, LONG y2) ! 43: { ! 44: POINTL ptl ; ! 45: ! 46: ptl.x = x1 ; ptl.y = y1 ; GpiMove (hps, &ptl) ; ! 47: ptl.x = x2 ; ptl.y = y2 ; GpiLine (hps, &ptl) ; ! 48: } ! 49: ! 50: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 51: { ! 52: static BOOL fBlockState [DIVISIONS] [DIVISIONS] ; ! 53: static SHORT xBlock, yBlock ; ! 54: HPS hps ; ! 55: POINTL ptl ; ! 56: RECTL rcl ; ! 57: SHORT x, y ; ! 58: ! 59: switch (msg) ! 60: { ! 61: case WM_SIZE: ! 62: xBlock = SHORT1FROMMP (mp2) / DIVISIONS ; ! 63: yBlock = SHORT2FROMMP (mp2) / DIVISIONS ; ! 64: return 0 ; ! 65: ! 66: case WM_BUTTON1DOWN: ! 67: case WM_BUTTON1DBLCLK: ! 68: if (xBlock > 0 && yBlock > 0) ! 69: { ! 70: x = MOUSEMSG(&msg)->x / xBlock ; ! 71: y = MOUSEMSG(&msg)->y / yBlock ; ! 72: ! 73: if (x < DIVISIONS && y < DIVISIONS) ! 74: { ! 75: fBlockState [x][y] = !fBlockState [x][y] ; ! 76: ! 77: rcl.xRight = xBlock + (rcl.xLeft = x * xBlock) ; ! 78: rcl.yTop = yBlock + (rcl.yBottom = y * yBlock) ; ! 79: ! 80: WinInvalidateRect (hwnd, &rcl, FALSE) ; ! 81: } ! 82: else ! 83: WinAlarm (HWND_DESKTOP, WA_WARNING) ; ! 84: } ! 85: else ! 86: WinAlarm (HWND_DESKTOP, WA_WARNING) ; ! 87: ! 88: break ; // do default processing ! 89: ! 90: case WM_SETFOCUS: ! 91: if (WinQuerySysValue (HWND_DESKTOP, SV_MOUSEPRESENT) == 0) ! 92: WinShowPointer (HWND_DESKTOP, ! 93: SHORT1FROMMP (mp2) ? TRUE : FALSE) ; ! 94: return 0 ; ! 95: ! 96: case WM_CHAR: ! 97: if (xBlock == 0 || yBlock == 0) ! 98: break ; ! 99: ! 100: if (CHARMSG(&msg)->fs & KC_KEYUP) ! 101: break ; ! 102: ! 103: if (!(CHARMSG(&msg)->fs & KC_VIRTUALKEY)) ! 104: break ; ! 105: ! 106: WinQueryPointerPos (HWND_DESKTOP, &ptl) ; ! 107: WinMapWindowPoints (HWND_DESKTOP, hwnd, &ptl, 1) ; ! 108: ! 109: x = max (0, min (DIVISIONS - 1, (SHORT) ptl.x / xBlock)) ; ! 110: y = max (0, min (DIVISIONS - 1, (SHORT) ptl.y / yBlock)) ; ! 111: ! 112: switch (CHARMSG(&msg)->vkey) ! 113: { ! 114: case VK_LEFT: ! 115: x-- ; ! 116: break ; ! 117: ! 118: case VK_RIGHT: ! 119: x++ ; ! 120: break ; ! 121: ! 122: case VK_DOWN: ! 123: y-- ; ! 124: break ; ! 125: ! 126: case VK_UP: ! 127: y++ ; ! 128: break ; ! 129: ! 130: case VK_HOME: ! 131: x = 0 ; ! 132: y = DIVISIONS - 1 ; ! 133: break ; ! 134: ! 135: case VK_END: ! 136: x = DIVISIONS - 1 ; ! 137: y = 0 ; ! 138: break ; ! 139: ! 140: case VK_NEWLINE: ! 141: case VK_ENTER: ! 142: case VK_SPACE: ! 143: WinSendMsg (hwnd, WM_BUTTON1DOWN, ! 144: MPFROM2SHORT (x * xBlock, y * yBlock), NULL) ; ! 145: break ; ! 146: ! 147: default: ! 148: return 0 ; ! 149: } ! 150: x = (x + DIVISIONS) % DIVISIONS ; ! 151: y = (y + DIVISIONS) % DIVISIONS ; ! 152: ! 153: ptl.x = x * xBlock + xBlock / 2 ; ! 154: ptl.y = y * yBlock + yBlock / 2 ; ! 155: ! 156: WinMapWindowPoints (hwnd, HWND_DESKTOP, &ptl, 1) ; ! 157: WinSetPointerPos (HWND_DESKTOP, (SHORT) ptl.x, (SHORT) ptl.y) ; ! 158: return 0 ; ! 159: ! 160: case WM_PAINT: ! 161: hps = WinBeginPaint (hwnd, NULL, NULL) ; ! 162: GpiErase (hps) ; ! 163: ! 164: if (xBlock > 0 && yBlock > 0) ! 165: for (x = 0 ; x < DIVISIONS ; x++) ! 166: for (y = 0 ; y < DIVISIONS ; y++) ! 167: { ! 168: rcl.xRight = xBlock + (rcl.xLeft = x * xBlock); ! 169: rcl.yTop = yBlock + (rcl.yBottom = y * yBlock); ! 170: ! 171: WinDrawBorder (hps, &rcl, 1, 1, ! 172: CLR_NEUTRAL, CLR_BACKGROUND, ! 173: DB_STANDARD | DB_INTERIOR) ; ! 174: ! 175: if (fBlockState [x][y]) ! 176: { ! 177: DrawLine (hps, rcl.xLeft, rcl.yBottom, ! 178: rcl.xRight, rcl.yTop) ; ! 179: ! 180: DrawLine (hps, rcl.xLeft, rcl.yTop, ! 181: rcl.xRight, rcl.yBottom) ; ! 182: } ! 183: } ! 184: WinEndPaint (hps) ; ! 185: return 0 ; ! 186: } ! 187: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 188: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.