|
|
1.1 root 1: /*--------------------------------------------------------------
2: CHECKER3.C -- Mouse Hit-Test Demo Program with Child Windows
3: --------------------------------------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7:
8: #include <os2.h>
9: #include <stddef.h>
10:
11: #define DIVISIONS 5
12:
13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
14: MRESULT EXPENTRY ChildWndProc (HWND, USHORT, MPARAM, MPARAM) ;
15:
16: CHAR szChildClass [] = "Checker3.Child" ;
17:
18: int main (void)
19: {
20: static CHAR szClientClass [] = "Checker3" ;
21: HAB hab ;
22: HMQ hmq ;
23: HWND hwndFrame, hwndClient ;
24: QMSG qmsg ;
25: ULONG flFrameFlags = FCF_STANDARD & ~FCF_MENU ;
26: ULONG flFrameStyle = WS_VISIBLE ;
27:
28: hab = WinInitialize (0) ;
29: hmq = WinCreateMsgQueue (hab, 0) ;
30:
31: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
32:
33: WinRegisterClass (hab, szChildClass, ChildWndProc, CS_SIZEREDRAW,
34: sizeof (USHORT)) ;
35:
36: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, flFrameStyle,
37: &flFrameFlags, szClientClass,
38: "Mouse Hit-Test Program No. 3",
39: 0L, NULL, 0, &hwndClient) ;
40:
41: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
42: WinDispatchMsg (hab, &qmsg) ;
43:
44: WinDestroyWindow (hwndFrame) ;
45: WinDestroyMsgQueue (hmq) ;
46: WinTerminate (hab) ;
47:
48: return 0 ;
49: }
50:
51: VOID DrawLine (HPS hps, LONG x1, LONG y1, LONG x2, LONG y2)
52: {
53: POINTL ptl ;
54:
55: ptl.x = x1 ; ptl.y = y1 ; GpiMove (hps, &ptl) ;
56: ptl.x = x2 ; ptl.y = y2 ; GpiLine (hps, &ptl) ;
57: }
58:
59: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
60: {
61: static HWND hwndChild [DIVISIONS][DIVISIONS] ;
62: SHORT xBlock, yBlock, x, y ;
63:
64: switch (msg)
65: {
66: case WM_CREATE:
67: for (x = 0 ; x < DIVISIONS ; x++)
68: for (y = 0 ; y < DIVISIONS ; y++)
69:
70: hwndChild [x][y] =
71: WinCreateWindow (
72: hwnd, /* Parent window */
73: szChildClass, /* Window class */
74: NULL, /* Window text */
75: WS_VISIBLE, /* Window style */
76: 0, 0, 0, 0, /* Size & position */
77: hwnd, /* Owner window */
78: HWND_BOTTOM, /* Placement */
79: y << 8 | x, /* Child window ID */
80: NULL, /* Control data */
81: NULL) ; /* Pres. Params */
82: return 0 ;
83:
84: case WM_SIZE:
85: xBlock = SHORT1FROMMP (mp2) / DIVISIONS ;
86: yBlock = SHORT2FROMMP (mp2) / DIVISIONS ;
87:
88: for (x = 0 ; x < DIVISIONS ; x++)
89: for (y = 0 ; y < DIVISIONS ; y++)
90:
91: WinSetWindowPos (hwndChild [x][y], NULL,
92: x * xBlock, y * yBlock, xBlock, yBlock,
93: SWP_MOVE | SWP_SIZE) ;
94: return 0 ;
95:
96: case WM_BUTTON1DOWN:
97: case WM_BUTTON1DBLCLK:
98: WinAlarm (HWND_DESKTOP, WA_WARNING) ;
99: return 1 ;
100:
101: case WM_ERASEBACKGROUND:
102: return 1 ;
103: }
104: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
105: }
106:
107: MRESULT EXPENTRY ChildWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
108: {
109: HPS hps ;
110: RECTL rcl ;
111:
112: switch (msg)
113: {
114: case WM_CREATE:
115: WinSetWindowUShort (hwnd, 0, 0) ;
116: return 0 ;
117:
118: case WM_BUTTON1DOWN:
119: case WM_BUTTON1DBLCLK:
120: WinSetWindowUShort (hwnd, 0, !WinQueryWindowUShort (hwnd, 0)) ;
121: WinInvalidateRect (hwnd, NULL, FALSE) ;
122: return 1 ;
123:
124: case WM_PAINT:
125: hps = WinBeginPaint (hwnd, NULL, NULL) ;
126:
127: WinQueryWindowRect (hwnd, &rcl) ;
128:
129: WinDrawBorder (hps, &rcl, 1, 1, CLR_NEUTRAL, CLR_BACKGROUND,
130: DB_STANDARD | DB_INTERIOR) ;
131:
132: if (WinQueryWindowUShort (hwnd, 0))
133: {
134: DrawLine (hps, rcl.xLeft, rcl.yBottom,
135: rcl.xRight, rcl.yTop) ;
136: DrawLine (hps, rcl.xLeft, rcl.yTop,
137: rcl.xRight, rcl.yBottom) ;
138: }
139: WinEndPaint (hps) ;
140: return 0 ;
141: }
142: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.