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