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