|
|
1.1 root 1: /*==============================================================*\
2: * sem_user.c - routines for handling messages not processed *
3: * by the standard message processing routine *
4: * Created 1990, Microsoft, IBM Corp. *
5: *--------------------------------------------------------------*
6: * *
7: * This module contains the code for processing messages sent *
8: * to the standard window that the standard window does not *
9: * process. The application developer need only modify this *
10: * file in order to implement new menu items or process *
11: * messages not handled by the standard message routine. *
12: * *
13: * This module also contains some routines that demonstate the *
14: * various dialog box controls and message box types that can *
15: * be used. The sample code should be deleted when this *
16: * module is modified for an application. The demonstration *
17: * code is identified by comments. *
18: * *
19: *--------------------------------------------------------------*
20: * *
21: * This source file contains the following functions: *
22: * *
23: * UserWndProc(hwnd, msg, mp1, mp2) - user window procedure*
24: * UserCommand(mp1, mp2) - user WM_COMMAND processor *
25: * SetForegroundColor(hwnd) *
26: * SetBackgroundColor(hwnd, nMenuId) *
27: * SetWindowText(hwnd) *
28: * *
29: \*==============================================================*/
30:
31: /*--------------------------------------------------------------*\
32: * Include files, macros, defined constants, and externs *
33: \*--------------------------------------------------------------*/
34:
35: #define LINT_ARGS
36: #define INCL_DOS
37: #define INCL_WIN
38: #include <os2.h>
39: #include <dos.h>
40: #include "sem_pnt.h"
41: #include "semaph.h"
42: #include "sem_main.h"
43: #include "sem_dlg.h"
44: #include "sem_xtrn.h"
45:
46:
47: /*--------------------------------------------------------------*\
48: * Global variables *
49: \*--------------------------------------------------------------*/
50:
51:
52: /* Variable used only by main thread for menu control. */
53:
54: USHORT fSemaphoreStarted = FALSE;
55: USHORT fSemaphoreWasStarted = FALSE;
56: USHORT fAutoMode = FALSE;
57:
58: /*--------------------------------------------------------------*\
59: * Entry point declarations *
60: \*--------------------------------------------------------------*/
61:
62:
63: /****************************************************************\
64: * Non-standard window message processing routine *
65: *--------------------------------------------------------------*
66: * *
67: * Name: UserWndProc(hwnd, msg, mp1, mp2) *
68: * *
69: * Purpose: Process any messages sent to hwndMain that *
70: * are not processed by the standard window *
71: * procedure *
72: * *
73: * Usage: Routine is called for each message MainWndProc *
74: * does not process *
75: * *
76: * Method: A switch statement branches control based upon *
77: * the message passed. Any messages not processed *
78: * here must be passed onto WinDefWindowProc() *
79: * *
80: * Returns: Return value depended upon the message processed *
81: \****************************************************************/
82: MRESULT UserWndProc(hwnd, msg, mp1, mp2)
83: HWND hwnd; /* handle of window */
84: USHORT msg; /* id of message */
85: MPARAM mp1; /* first message parameter */
86: MPARAM mp2; /* second message parameter */
87: {
88:
89: switch(msg) {
90: /*--------------------------------------------------------------*\
91: * Add case statements for message ids you wish to process *
92: \*--------------------------------------------------------------*/
93: default: /* default must call WinDefWindowProc() */
94: return(WinDefWindowProc(hwnd, msg, mp1, mp2));
95: break;
96: }
97:
98: return 0L;
99:
100: } /* UserWndProc() */
101:
102:
103: /****************************************************************\
104: * Non-standard menu item command processing procedure *
105: *--------------------------------------------------------------*
106: * *
107: * Name: UserCommand(mp1, mp2) *
108: * *
109: * Purpose: Process any WM_COMMAND messages send to hwndMain *
110: * that are not processed by MainCommand *
111: * *
112: * Usage: Routine is called for each WM_COMMAND that is *
113: * not posted by a standard menu item *
114: * *
115: * Method: A switch statement branches control based upon *
116: * the id of the control which posted the message *
117: * *
118: * Returns: *
119: \****************************************************************/
120: VOID UserCommand(mp1, mp2)
121: MPARAM mp1; /* first message parameter */
122: MPARAM mp2; /* second message parameter */
123: {
124: USHORT rc;
125: HWND hwndSemMenu;
126:
127: hwndSemMenu = WinWindowFromID(hwndMainFrame,FID_MENU);
128:
129: switch(SHORT1FROMMP(mp1)) {
130:
131: case IDM_SEMSTART_MANUAL:
132: if (!fSemaphoreStarted)
133: { /* should never get this message unless sample started*/
134:
135: fSemaphoreStarted = TRUE;
136: fSemaphoreWasStarted = TRUE;
137:
138: /* Turn on other menu items */
139: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
140: MPFROM2SHORT(IDM_SEMSTOP,TRUE),
141: MPFROM2SHORT(MIA_DISABLED,FALSE));
142:
143: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
144: MPFROM2SHORT(IDM_POST,TRUE),
145: MPFROM2SHORT(MIA_DISABLED,FALSE));
146:
147: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
148: MPFROM2SHORT(IDM_SEM_RESUMEAUTO,TRUE),
149: MPFROM2SHORT(MIA_DISABLED,FALSE));
150:
151: /* turn off menu items to configure demo */
152: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
153: MPFROM2SHORT(IDM_OPTIONS,TRUE),
154: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
155:
156: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
157: MPFROM2SHORT(IDM_SEMSTART,TRUE),
158: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
159:
160: if (StartSemExample() == FALSE) {
161: MessageBox (HWND_DESKTOP, IDMSG_CANNOTSTART, TRUE);
162: WinSendMsg (hwndMain, WM_CLOSE, 0L, 0L);
163: }
164: }
165: break;
166:
167: case IDM_POST:
168: if (fSemaphoreStarted)
169: { /* should never get this message unless sample started*/
170: if (fAutoMode)
171: {
172: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
173: MPFROM2SHORT(IDM_SEM_RESUMEAUTO,TRUE),
174: MPFROM2SHORT(MIA_DISABLED,FALSE));
175: }
176: SignalUserEvent(&fAutoMode);
177: }
178: break;
179:
180: case IDM_SEM_RESUMEAUTO:
181: case IDM_SEMSTART_AUTO:
182: if (!fSemaphoreStarted)
183: { /* should never get this message unless sample started*/
184: fSemaphoreStarted = TRUE;
185: fSemaphoreWasStarted = TRUE;
186:
187: /* Turn on other menu items */
188: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
189: MPFROM2SHORT(IDM_SEMSTOP,TRUE),
190: MPFROM2SHORT(MIA_DISABLED,FALSE));
191:
192: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
193: MPFROM2SHORT(IDM_POST,TRUE),
194: MPFROM2SHORT(MIA_DISABLED,FALSE));
195:
196: /* turn off menu items to configure demo */
197: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
198: MPFROM2SHORT(IDM_OPTIONS,TRUE),
199: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
200:
201: StartSemExample();
202:
203: }
204:
205: if (fSemaphoreStarted && !fAutoMode)
206: {
207: rc = SetAutoMode();
208: if (!rc)
209: {
210: fAutoMode = TRUE;
211: /* disable menus */
212:
213: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
214: MPFROM2SHORT(IDM_SEM_RESUMEAUTO,TRUE),
215: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
216:
217: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
218: MPFROM2SHORT(IDM_SEMSTART,TRUE),
219: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
220: }
221: }
222: break;
223:
224: case IDM_SEMSTOP:
225: if (fSemaphoreStarted)
226: {
227: BeginStop (&fAutoMode);
228:
229: /* don't allow them to select stop again */
230: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
231: MPFROM2SHORT(IDM_SEMSTOP,TRUE),
232: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
233:
234: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
235: MPFROM2SHORT(IDM_SEM_RESUMEAUTO,TRUE),
236: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
237:
238: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
239: MPFROM2SHORT(IDM_POST,TRUE),
240: MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED));
241: }
242: break;
243: case IDM_STOPFINISHED:
244: if (fSemaphoreStarted)
245: {
246: fSemaphoreStarted = FALSE;
247:
248: /* Reset option and semaphore/start menu items ... */
249: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
250: MPFROM2SHORT(IDM_SEMSTART,TRUE),
251: MPFROM2SHORT(MIA_DISABLED,FALSE));
252:
253: /* turn on menu items to configure demo */
254: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
255: MPFROM2SHORT(IDM_OPTIONS,TRUE),
256: MPFROM2SHORT(MIA_DISABLED,FALSE));
257: }
258: break;
259:
260: case IDM_OPTIONS_NTHRDS_2:
261: case IDM_OPTIONS_NTHRDS_4:
262: case IDM_OPTIONS_NTHRDS_8:
263: case IDM_OPTIONS_NTHRDS_16:
264: if (!fSemaphoreStarted) {
265: INT oldNumUsers = cNumUsers;
266: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
267: MPFROM2SHORT(IDM_OPTIONS_NTHRDS+cNumUsers,TRUE),
268: MPFROM2SHORT(MIA_CHECKED,FALSE));
269: cNumUsers = SHORT1FROMMP(mp1) - IDM_OPTIONS_NTHRDS;
270: /* if we changed the number of threads to display */
271: if (cNumUsers != oldNumUsers)
272: WinPostMsg (hwndMain, WM_USERCHANGED, (MPARAM)0, (MPARAM)0);
273:
274: WinSendMsg(hwndSemMenu,MM_SETITEMATTR,
275: MPFROM2SHORT(IDM_OPTIONS_NTHRDS+cNumUsers,TRUE),
276: MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
277: }
278: break;
279:
280: case IDM_OPTIONS_TIMEOUT:
281: if (!fSemaphoreStarted) {
282: WinDlgBox (HWND_DESKTOP, hwndMain, TimeDlgProc, NULL,
283: TIMERBOX, (PVOID)ulTimeout);
284: }
285: break;
286:
287: default:
288: break;
289: }
290:
291: /* This routine currently doesn't use the mp2 parameter but *\
292: * it is referenced here to prevent an 'Unreferenced Parameter' *
293: \* warning at compile time. */
294: mp2;
295:
296: } /* UserCommand() */
297:
298:
299:
300:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.