|
|
1.1 root 1: /***************************************************************************
2: *
3: * MODULE NAME: DLGSAMP
4: *
5: * Presentation Manager Dialog Sample Application
6: *
7: * Created by Microsoft Corp., 1988
8: *
9: ****************************************************************************
10:
11: /***************************************************************************
12: *
13: * CALL NAME COUNT
14: * ========= =====
15: *
16: * GpiCharStringAt 4
17: * GpiSetColor 1
18: * WinBeginPaint 1
19: * WinCreateMsgQueue 1
20: * WinCreateStdWindow 1
21: * WinDefDlgProc 6
22: * WinDefWindowProc 1
23: * WinDestroyMsgQueue 1
24: * WinDestroyWindow 3
25: * WinDismissDlg 4
26: * WinDispatchMsg 1
27: * WinDlgBox 1
28: * WinEndPaint 1
29: * WinFillRect 1
30: * WinGetMsg 1
31: * WinInitialize 1
32: * WinInvalidateRect 6
33: * WinIsWindow 1
34: * WinLoadDlg 1
35: * WinLoadString 2
36: * WinMessageBox 2
37: * WinPostMsg 20
38: * WinQueryDlgItemShort 1
39: * WinQuerySysValue 2
40: * WinQueryWindow 1
41: * WinQueryWindowPos 1
42: * WinQueryWindowText 4
43: * WinRegisterClass 1
44: * WinSendDlgItemMsg 5
45: * WinSendMsg 1
46: * WinSetFocus 1
47: * WinSetWindowPos 1
48: * WinTerminate 1
49: * WinWindowFromID 16
50: *
51: * Number of unique calls = 34
52: *
53: ***************************************************************************/
54:
55: /***************************************************************************
56: *
57: * Include relevant sections of the PM header file.
58: *
59: ***************************************************************************/
60:
61: #define INCL_WINBUTTONS
62: #define INCL_WINDIALOGS
63: #define INCL_WINERRORS
64: #define INCL_WINFRAMEMGR
65: #define INCL_WININPUT
66: #define INCL_WINLISTBOXES
67: #define INCL_WINMENUS
68: #define INCL_WINMESSAGEMGR
69: #define INCL_WINRECTANGLES
70: #define INCL_WINSWITCHLIST
71: #define INCL_WINSYS
72: #define INCL_WINWINDOWMGR
73: #define M_I86L
74: #include <os2.h>
75:
76: /***************************************************************************
77: *
78: * Include C library routine header files
79: *
80: ***************************************************************************/
81:
82: #include <string.h>
83: #include <stdlib.h>
84:
85: /***************************************************************************
86: *
87: * Include application header files
88: *
89: * dlgsamp.h is header for dialog editor ids
90: * dlgsamp.h1 is standard application header for everything not in .h
91: *
92: ***************************************************************************/
93:
94: #include "dlgsamp.h"
95: #include "dlgsamp1.h"
96:
97: /***************************************************************************
98: *
99: * Function prototypes for private C functions
100: *
101: ***************************************************************************/
102:
103: VOID NEAR cdecl main( VOID );
104:
105: VOID cdecl CentreDlgBox( HWND hwnd );
106: VOID cdecl CheckColor( HWND hwndDlg, SHORT iDlgItem, COLOR *colorClient );
107: VOID cdecl EnableModality( HWND hwnd, BOOL bModal );
108: BOOL cdecl IsIntInRange( HWND hwndDlg, SHORT idEntryField,
109: SHORT iLoRange, SHORT iHiRange,
110: SHORT idErrMsg, SHORT idMessageBox );
111: VOID cdecl LoadDialog( HWND hwndParent, HWND hwndOwner,
112: SHORT idDlg, PFNWP fnwpDlgProc,
113: BOOL bModality );
114: VOID cdecl MainWndCommand( HWND hwnd, USHORT command, BOOL *bModality );
115: VOID cdecl MainWndPaint( HWND hwnd );
116: VOID cdecl SetModality( HWND hwnd, BOOL bModal );
117: VOID cdecl Trace( PSZ szCaption, PSZ szMessage );
118:
119: /**************************************************************************
120: *
121: * Function protypes for private WinProcs.
122: *
123: **************************************************************************/
124:
125: MRESULT EXPENTRY fnwpMainWnd( HWND hwnd, USHORT message,
126: MPARAM mp1, MPARAM mp2 );
127: MRESULT EXPENTRY fnwpEntryFieldDlg( HWND hwnd, USHORT message,
128: MPARAM mp1, MPARAM mp2 );
129: MRESULT EXPENTRY fnwpAutoRadioButtonDlg( HWND hwnd, USHORT message,
130: MPARAM mp1, MPARAM mp2 );
131: MRESULT EXPENTRY fnwpCheckBoxDlg( HWND hwnd, USHORT message,
132: MPARAM mp1, MPARAM mp2 );
133: MRESULT EXPENTRY fnwpListBoxDlg( HWND hwnd, USHORT message,
134: MPARAM mp1, MPARAM mp2 );
135:
136: /*************************************************************************
137: *
138: * Global variables
139: *
140: *************************************************************************/
141:
142: COLOR colorClient = CLR_RED | CLR_BLUE; /* Color of client area */
143:
144: CHAR szEntryField1[10] = ""; /* Used to pass back info */
145: CHAR szEntryField2[10] = ""; /* from entry fields */
146: /* in EntryFieldDlg */
147:
148: BOOL bModality = TRUE; /* Does the user want modal*/
149: /* or modeless dialogs? */
150: COLOR colorSave;
151: CHAR szSelection[LEN_LISTBOXENTRY] = ""; /* Used to pass back */
152: /* list box item selected */
153: /* in ListBoxDlg */
154:
155: HAB hab; /* Anchor block handle */
156: HWND hwndClient; /* Client Window handle */
157: HWND hwndFrame; /* Frame Window handle */
158: HWND hwndModelessDlg; /* Modeless Dialog handle */
159:
160: /**************************************************************************
161: *
162: * FUNCTION: main
163: *
164: * Typical PM main function which initialises PM, creates a message queue,
165: * registers a window class, creates a window, gets and dispatches
166: * messages to its winproc until its time to quit, and then tidies up
167: * before terminating.
168: *
169: * Side effects:
170: *
171: * Sets the values of the following globals:-
172: *
173: * hab, hwndClient, hwndFrame.
174: *
175: **************************************************************************/
176:
177: VOID NEAR cdecl main( )
178: {
179: HMQ hmq; /* Message Queue handle */
180: QMSG qmsg; /* Message */
181: ULONG flCreate;
182:
183: hab = WinInitialize( NULL ); /* Initialise PM */
184: hmq = WinCreateMsgQueue( hab, 0 );/* Create application msg queue */
185:
186: WinRegisterClass( /* Register Window Class */
187: hab, /* Anchor block handle */
188: "DlgSamp Class", /* Window Class name */
189: fnwpMainWnd, /* Address of Window Procedure */
190: NULL, /* No special class style */
191: 0 /* No extra window words */
192: );
193:
194: flCreate = FCF_STANDARD;
195:
196: hwndFrame = WinCreateStdWindow(
197: HWND_DESKTOP, /* Desktop Window is parent */
198: WS_VISIBLE |
199: FS_TASKLIST |
200: FS_ICON, /* Window styles */
201: (PVOID)&flCreate, /* Window creation parameters */
202: "DlgSamp Class", /* Window Class name */
203: "", /* Window Text */
204: 0L, /* Client style */
205: NULL, /* Module handle */
206: ID_MAINWND, /* Window ID */
207: (HWND FAR *)&hwndClient /* Client Window handle */
208: );
209:
210:
211: while( WinGetMsg( hab, (PQMSG)&qmsg, (HWND)NULL, 0, 0 ) )
212: WinDispatchMsg( hab, (PQMSG)&qmsg );
213:
214: WinDestroyWindow( hwndFrame );
215: WinDestroyMsgQueue( hmq );
216: WinTerminate( hab );
217: }
218:
219: /***********************************************************************
220: *
221: * WinProc: fnwpMainWnd
222: *
223: * Controls the state of the menu, and loads various dialogs. The
224: * dialogs will be modal or modeless depending on the setting of the
225: * Modality menuitem.
226: *
227: * Side Effects.
228: *
229: * Modifies the values of the following globals:-
230: *
231: * szEntryField1, szEntryField2, szSelection
232: *
233: ***********************************************************************/
234:
235: MRESULT EXPENTRY fnwpMainWnd( hwnd, message, mp1, mp2 )
236: HWND hwnd;
237: USHORT message;
238: MPARAM mp1;
239: MPARAM mp2;
240: {
241: USHORT Command; /* Command passed by WM_COMMAND */
242: SHORT id; /* ID of item selected from the list box */
243:
244: switch(message)
245: {
246: case WM_PAINT:
247: MainWndPaint( hwnd ); /* Invoke window painting routine */
248: break;
249: case WM_HELP:
250: /*********************************************************************
251: *
252: * This will be received when either:-
253: *
254: * 1. The user depresses F1
255: * 2. The user clicks on the action bar item F1=Help
256: *
257: *********************************************************************/
258: WinMessageBox( HWND_DESKTOP,
259: hwndFrame,
260: (PSZ)"Dialog Sample Application: Help",
261: (PSZ)"Try out the pulldown menus, or Alt+selection",
262: ID_MB,
263: MB_OK );
264: break;
265: case WM_COMMAND:
266: Command = SHORT1FROMMP( mp1 );
267: MainWndCommand( hwnd, Command, &bModality );
268: break;
269: case DLGSAMP_EFCOMPLETE:
270: WinQueryWindowText( WinWindowFromID( hwndModelessDlg, EF_1 ),
271: sizeof( szEntryField1 ), szEntryField1 );
272: WinQueryWindowText( WinWindowFromID( hwndModelessDlg, EF_2 ),
273: sizeof( szEntryField2 ), szEntryField2 );
274: WinInvalidateRect( hwnd, NULL, FALSE );/* Request whole window repaint */
275: break;
276: case DLGSAMP_LBCOMPLETE:
277: id = SHORT1FROMMR( WinSendDlgItemMsg( hwndModelessDlg,
278: LB_1,
279: LM_QUERYSELECTION,
280: 0L,
281: 0L ) );
282: if( id == LIT_NONE )
283: strcpy( szSelection, "" );
284: else
285: WinSendDlgItemMsg( hwndModelessDlg,
286: LB_1,
287: LM_QUERYITEMTEXT,
288: MPFROM2SHORT( id, sizeof( szSelection ) ),
289: MPFROMP( szSelection ) );
290: break;
291: case DLGSAMP_RBCOMPLETE:
292: case DLGSAMP_CBCOMPLETE:
293: break;
294: case DLGSAMP_DESTROYDLG:
295: WinDestroyWindow( hwndModelessDlg );
296: EnableModality( hwndFrame, TRUE );
297: WinInvalidateRect( hwnd, NULL, FALSE );/* Request whole window repaint */
298: break;
299: case WM_CLOSE:
300: WinPostMsg( hwnd, WM_QUIT, 0L, 0L ); /* Cause termination */
301: break;
302: default:
303: return WinDefWindowProc( hwnd, message, mp1, mp2 );
304: }
305: return FALSE;
306: }
307:
308: /***********************************************************************
309: *
310: * DlgProc: fnwpEntryFieldDlg
311: *
312: * A dialog proc which captures and validates the contents of two
313: * entry fields.
314: *
315: * Side effects.
316: *
317: * Modifies the globals szEntryField1, szEntryField2.
318: *
319: ***********************************************************************/
320:
321: MRESULT EXPENTRY fnwpEntryFieldDlg( hwndDlg, message, mp1, mp2 )
322: HWND hwndDlg;
323: USHORT message;
324: MPARAM mp1;
325: MPARAM mp2;
326: {
327: switch (message)
328: {
329: case WM_INITDLG:
330: CentreDlgBox( hwndDlg );
331: break;
332: case WM_COMMAND:
333: switch( SHORT1FROMMP( mp1 ) )
334: {
335: case DID_OK: /* Enter key or pushbutton pressed/ selected */
336:
337: /***************************************************************************
338: *
339: * Validate the contents of the two entry fields
340: *
341: ***************************************************************************/
342:
343: if( !IsIntInRange( hwndDlg, EF_1, 1, 100, ERR_EFINVALID, ID_MB ) )
344: return FALSE;
345: if( !IsIntInRange( hwndDlg, EF_2, 1, 100, ERR_EFINVALID, ID_MB ) )
346: return FALSE;
347:
348: /***************************************************************************
349: *
350: * A modal dialog is destroyed before control is returned to the
351: * invoking winproc, so it must pass the contents of its Entry Fields etc.
352: * back to the invoking window before it returns.
353: *
354: * When a modeless dialog box returns it still continues to exist. It
355: * could pass the contents of its Entry Fields etc. back to the
356: * invoking window in several ways.
357: *
358: * Here a user message is posted to the invoking window to say that the
359: * dialog has completed. The invoking window then has an opportunity
360: * to extract the contents of the Entry Fields etc.
361: *
362: ***************************************************************************/
363:
364: if( bModality )
365: {
366: WinQueryWindowText( WinWindowFromID( hwndDlg, EF_1 ),
367: sizeof( szEntryField1),
368: szEntryField1 );
369: WinQueryWindowText( WinWindowFromID( hwndDlg, EF_2 ),
370: sizeof( szEntryField2),
371: szEntryField2 );
372: }
373: else
374: WinPostMsg( hwndClient, DLGSAMP_EFCOMPLETE, 0L, 0L );
375:
376: case DID_CANCEL:/* Escape key or CANCEL pushbutton pressed/selected */
377: if( bModality )
378: WinDismissDlg( hwndDlg,TRUE );
379: else
380: WinPostMsg( hwndClient, DLGSAMP_DESTROYDLG, 0L, 0L );
381: return FALSE;
382: default:
383: break;
384: }
385: break;
386:
387: default: /* Pass all other messages to the default dialog proc */
388: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
389: }
390: return FALSE;
391: }
392:
393: /***********************************************************************
394: *
395: * DlgProc: fnwpAutoRadioButtonDlg
396: *
397: * A dialog procedure which uses auto radio buttons to change the
398: * color of the Client Area window.
399: *
400: * Side effects.
401: *
402: * Modifies the Client Area color and the global colorClient
403: *
404: ***********************************************************************/
405:
406: MRESULT EXPENTRY fnwpAutoRadioButtonDlg( hwndDlg, message, mp1, mp2 )
407: HWND hwndDlg;
408: USHORT message;
409: MPARAM mp1;
410: MPARAM mp2;
411: {
412: switch (message)
413: {
414: case WM_INITDLG:
415: colorSave = colorClient;
416: CentreDlgBox( hwndDlg );
417: break;
418: case WM_CONTROL:
419: if( SHORT2FROMMP( mp1 ) == BN_CLICKED )
420: switch( SHORT1FROMMP( mp1 ) )
421: {
422: case RB_RED:
423: colorClient = CLR_RED;
424: break;
425: case RB_GREEN:
426: colorClient = CLR_GREEN;
427: break;
428: case RB_BLUE:
429: colorClient = CLR_BLUE;
430: break;
431: default:
432: return FALSE;
433: }
434: WinInvalidateRect( hwndClient, NULL, FALSE );
435: break;
436: case WM_COMMAND:
437: switch( SHORT1FROMMP( mp1 ) )
438: {
439: case DID_OK: /* Enter key or pushbutton pressed/ selected */
440: if( !bModality )
441: WinPostMsg( hwndClient, DLGSAMP_RBCOMPLETE, 0L, 0L );
442: break;
443: case DID_CANCEL: /* Escape key or CANCEL pushbutton pressed/selected */
444: colorClient = colorSave;
445: break;
446: default:
447: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
448: }
449: if( bModality )
450: WinDismissDlg( hwndDlg, TRUE );
451: else
452: WinPostMsg( hwndClient, DLGSAMP_DESTROYDLG, 0L, 0L );
453: break;
454:
455: default: /* Pass all other messages to the default dialog proc */
456: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
457: }
458: return FALSE;
459: }
460:
461:
462: /***********************************************************************
463: *
464: * DlgProc: fnwpCheckBoxDlg
465: *
466: * A dialog procedure to which use checkboxes to change the color
467: * of the Client Area Window.
468: *
469: * Side effects
470: *
471: * Modifies the Client Area color and the global colorClient
472: *
473: ***********************************************************************/
474:
475: MRESULT EXPENTRY fnwpCheckBoxDlg( hwndDlg, message, mp1, mp2 )
476: HWND hwndDlg;
477: USHORT message;
478: MPARAM mp1;
479: MPARAM mp2;
480: {
481: switch (message)
482: {
483: case WM_INITDLG:
484: CentreDlgBox( hwndDlg );
485: colorSave = colorClient;
486: if( (colorClient & CLR_RED) == CLR_RED )
487: WinPostMsg( WinWindowFromID( hwndDlg, CB_RED ),
488: BM_SETCHECK,
489: MPFROM2SHORT( TRUE,0 ),
490: 0L );
491: if( (colorClient & CLR_GREEN) == CLR_GREEN )
492: WinPostMsg( WinWindowFromID( hwndDlg, CB_GREEN ),
493: BM_SETCHECK,
494: MPFROM2SHORT( TRUE,0 ),
495: 0L );
496: if( (colorClient & CLR_BLUE) == CLR_BLUE )
497: WinPostMsg( WinWindowFromID( hwndDlg, CB_BLUE ),
498: BM_SETCHECK,
499: MPFROM2SHORT( TRUE,0 ),
500: 0L );
501: break;
502: case WM_CONTROL: /* User has clicked on a checkbox */
503: if( SHORT2FROMMP( mp1 ) == BN_CLICKED )
504: CheckColor( hwndDlg, SHORT1FROMMP( mp1 ), &colorClient );
505: WinInvalidateRect( hwndClient, NULL, FALSE );
506: break;
507: case WM_COMMAND:
508: switch( SHORT1FROMMP( mp1 ) )
509: {
510: case DID_OK: /* Enter key or pushbutton pressed/ selected */
511: if( !bModality )
512: WinPostMsg( hwndClient, DLGSAMP_CBCOMPLETE, 0L, 0L );
513: break;
514: case DID_CANCEL: /* Escape key or CANCEL pushbutton pressed/selected */
515: colorClient = colorSave;
516: break;
517: default:
518: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
519: }
520: if( bModality )
521: WinDismissDlg( hwndDlg, TRUE );
522: else
523: WinPostMsg( hwndClient, DLGSAMP_DESTROYDLG, 0L, 0L );
524: return FALSE;
525:
526: default: /* Pass all other messages to the default dialog proc */
527: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
528: }
529: return FALSE;
530: }
531:
532: /***********************************************************************
533: *
534: * DlgProc: fnwpListBoxDlg
535: *
536: * Side effects
537: *
538: * Modifies the global szSelection
539: *
540: ***********************************************************************/
541:
542: MRESULT EXPENTRY fnwpListBoxDlg( hwndDlg, message, mp1, mp2 )
543: HWND hwndDlg;
544: USHORT message;
545: MPARAM mp1;
546: MPARAM mp2;
547: {
548: CHAR szBuffer[LEN_LISTBOXENTRY];
549: SHORT i;
550: SHORT id;
551:
552: switch (message)
553: {
554: case WM_INITDLG:
555: CentreDlgBox( hwndDlg );
556:
557: /*************************************************************************
558: *
559: * Initialise the listbox with a set of strings loaded from a
560: * resource file.
561: *
562: *************************************************************************/
563:
564: for ( i = 0; i < NUM_LISTBOXENTRIES; i++ )
565: {
566: WinLoadString( hab,
567: NULL,
568: LBI_1 + i, /****** WARNING *********/
569: LEN_LISTBOXENTRY, /* Differs */
570: (PSZ)szBuffer /* from spec */
571: );
572: WinSendDlgItemMsg( hwndDlg,
573: LB_1,
574: LM_INSERTITEM,
575: MPFROM2SHORT( LIT_END, 0 ),
576: MPFROMP( szBuffer )
577: );
578: }
579: break;
580: case WM_COMMAND:
581: switch( SHORT1FROMMP( mp1 ) )
582: {
583: case DID_OK: /* Enter key or pushbutton pressed/ selected */
584: if( bModality )
585: {
586:
587: /***********************************************************************
588: *
589: * Find out which item if any was selected and return the selected
590: * item text.
591: *
592: ***********************************************************************/
593:
594: id = SHORT1FROMMR( WinSendDlgItemMsg( hwndDlg,
595: LB_1,
596: LM_QUERYSELECTION,
597: 0L,
598: 0L ) );
599: if( id == LIT_NONE )
600: strcpy( szSelection, "" );
601: else
602: WinSendDlgItemMsg( hwndDlg,
603: LB_1,
604: LM_QUERYITEMTEXT,
605: MPFROM2SHORT( id, LEN_LISTBOXENTRY ),
606: MPFROMP( szSelection ) );
607: }
608: else
609: WinPostMsg( hwndClient, DLGSAMP_LBCOMPLETE, 0L, 0L );
610: case DID_CANCEL: /* Escape key or CANCEL pushbutton pressed/selected */
611: if( bModality )
612: WinDismissDlg( hwndDlg, TRUE );
613: else
614: WinPostMsg( hwndClient, DLGSAMP_DESTROYDLG, 0L, 0L );
615: return FALSE;
616: default:
617: break;
618: }
619: break;
620:
621: default: /* Pass all other messages to the default dialog proc */
622: return WinDefDlgProc( hwndDlg, message, mp1, mp2 );
623: }
624: return FALSE;
625: }
626:
627: /*************************************************************************
628: *
629: * PRIVATE FUNCTION : CentreDlgBox
630: *
631: * Positions the dialog box in the centre of the screen
632: *
633: *************************************************************************/
634:
635: VOID cdecl CentreDlgBox( hwnd )
636: HWND hwnd;
637: {
638: SHORT ix, iy;
639: SHORT iwidth, idepth;
640: SWP swp;
641:
642: iwidth = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
643: idepth = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
644: WinQueryWindowPos( hwnd, (PSWP)&swp );
645: ix = ( iwidth - swp.cx ) / 2;
646: iy = ( idepth - swp.cy ) / 2;
647: WinSetWindowPos( hwnd, HWND_TOP, ix, iy, 0, 0, SWP_MOVE );
648: }
649:
650: /***************************************************************************
651: *
652: * PRIVATE FUNCTION: CheckColor
653: *
654: * Toggle the Checked/UnChecked state of a checkbox and add/remove
655: * the corresponding CLR color component of the Client Area Color.
656: *
657: ***************************************************************************/
658:
659: VOID cdecl CheckColor( hwndDlg, iDlgItem, colorClient )
660: HWND hwndDlg;
661: SHORT iDlgItem;
662: COLOR *colorClient;
663: {
664: BOOL bChecked;
665: COLOR color;
666:
667: switch( iDlgItem )
668: {
669: case CB_RED:
670: color = CLR_RED;
671: break;
672: case CB_GREEN:
673: color = CLR_GREEN;
674: break;
675: case CB_BLUE:
676: color = CLR_BLUE;
677: break;
678: default:
679: return;
680: }
681:
682: bChecked = SHORT1FROMMR( WinSendMsg( WinWindowFromID( hwndDlg , iDlgItem ),
683: BM_QUERYCHECK,
684: 0L,
685: 0L ) );
686: WinPostMsg( WinWindowFromID( hwndDlg, iDlgItem ),
687: BM_SETCHECK,
688: MPFROM2SHORT( !bChecked, 0 ),
689: 0L );
690: if( bChecked ) /* If color previously checked */
691: *colorClient -= color; /* subtract it ... else */
692: else
693: *colorClient += color; /* ... add it. */
694: }
695:
696: /**************************************************************************
697: *
698: * PRIVATE FUNCTION: EnableModality
699: *
700: * Enable or disable the Modality menuitems depending on the value
701: * of modal. This is done to prevent the user from altering the
702: * modality setting while a modeless dialog is active.
703: *
704: **************************************************************************/
705:
706: VOID cdecl EnableModality( hwnd, bModal )
707: HWND hwnd;
708: BOOL bModal;
709: {
710: if( bModal )
711: {
712: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
713: MM_SETITEMATTR,
714: MPFROM2SHORT( MI_MODAL, TRUE ),
715: MPFROM2SHORT( MIA_DISABLED, ~MIA_DISABLED ) );
716: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
717: MM_SETITEMATTR,
718: MPFROM2SHORT( MI_MODELESS, TRUE ),
719: MPFROM2SHORT( MIA_DISABLED, ~MIA_DISABLED ) );
720: }
721: else
722: {
723: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
724: MM_SETITEMATTR,
725: MPFROM2SHORT( MI_MODAL, TRUE ),
726: MPFROM2SHORT( MIA_DISABLED, MIA_DISABLED ) );
727: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
728: MM_SETITEMATTR,
729: MPFROM2SHORT( MI_MODELESS, TRUE ),
730: MPFROM2SHORT( MIA_DISABLED, MIA_DISABLED ) );
731: }
732: }
733:
734: /***************************************************************************
735: *
736: * PRIVATE FUNCTION: IsIntInRange.
737: *
738: * Checks whether the value of a dialog item is in an integer in
739: * a given range.
740: *
741: ***************************************************************************/
742:
743: BOOL cdecl IsIntInRange( hwndDlg, idEntryField,
744: iLoRange, iHiRange,
745: idErrMsg, idMessageBox )
746: HWND hwndDlg;
747: SHORT idEntryField;
748: SHORT iLoRange;
749: SHORT iHiRange;
750: SHORT idErrMsg;
751: SHORT idMessageBox;
752: {
753: SHORT ivalue;
754: CHAR szErrMsg[80];
755:
756: /****************************************************************************
757: *
758: * Validate an entry field.
759: *
760: * If validation fails leave the dialog visible, issue an error message
761: * using a messagebox, and when the user dismisses the messagebox,
762: * set the input focus to the entry field containing the error. Leave
763: * the contents of the entry field unchanged, and return FALSE.
764: *
765: * If validation is successful return the value in ivalue and return
766: * TRUE.
767: *
768: ****************************************************************************/
769:
770: if( !WinQueryDlgItemShort( hwndDlg, idEntryField, &ivalue, TRUE ) ||
771: ( ivalue < iLoRange ) ||
772: ( ivalue > iHiRange ) )
773: {
774: WinLoadString( hab, NULL, idErrMsg, sizeof( szErrMsg ), szErrMsg );
775: WinMessageBox( HWND_DESKTOP,
776: hwndFrame,
777: (PSZ)szErrMsg,
778: NULL,
779: idMessageBox,
780: MB_OK );
781: WinSetFocus( HWND_DESKTOP, WinWindowFromID( hwndDlg, idEntryField ) );
782: return FALSE;
783: }
784: else
785: return TRUE;
786: }
787:
788: /***********************************************************************
789: *
790: * PRIVATE FUNCTION: LoadDialog
791: *
792: * Use the appropriate functions to put up a modal or modeless
793: * dialog box depending on the setting of the bModality parameter.
794: *
795: * Side Effects
796: *
797: * Stes the value of the global hwndModelessDlg
798: *
799: ***********************************************************************/
800:
801: VOID cdecl LoadDialog( hwndParent, hwndOwner, idDlg, fnwpDlgProc, bModality )
802: HWND hwndParent;
803: HWND hwndOwner;
804: SHORT idDlg;
805: PFNWP fnwpDlgProc;
806: BOOL bModality;
807: {
808: EnableModality( hwndOwner, FALSE ); /* Disable the Modality menu item */
809:
810: if( bModality )
811: {
812: WinDlgBox( hwndParent, /* Parent */
813: hwndOwner, /* Owner */
814: fnwpDlgProc, /* Address of dialog proc */
815: NULL, /* Module handle */
816: idDlg, /* Id of dialog in resource */
817: NULL ); /* Initialisation data */
818: EnableModality( hwndOwner, TRUE ); /* Enable the Modality menu item */
819: }
820: else
821: {
822: /*******************************************************************
823: *
824: * Check to see if a modeless dialog is already running: if
825: * so destroy it before for loading the requested dialog. Save
826: * the handle of the new dialog in a global variable so that in
827: * can be accessed by the WinProc that issued LoadDialog.
828: *
829: *******************************************************************/
830:
831: if( WinIsWindow( hab, hwndModelessDlg ) )
832: WinDestroyWindow( hwndModelessDlg );
833: hwndModelessDlg = WinLoadDlg( hwndParent,
834: hwndOwner,
835: fnwpDlgProc,
836: NULL,
837: idDlg,
838: NULL );
839: }
840: }
841:
842: /*************************************************************************
843: *
844: * PRIVATE FUNCTION: MainWndCommand
845: *
846: * Take the appropriate action when a WM_COMMAND message is received by
847: * MainWndProc. Issues calls which load dialogs in the prevailing state
848: * of modality.
849: *
850: *************************************************************************/
851:
852: VOID cdecl MainWndCommand( hwnd, Command, bModality )
853: HWND hwnd;
854: USHORT Command;
855: BOOL *bModality;
856: {
857: USHORT idDlg;
858: PFNWP pfnDlgProc;
859:
860: switch( Command )
861: {
862: case MI_MODAL:
863: case MI_MODELESS:
864: *bModality = ( Command == MI_MODAL ) ? TRUE
865: : FALSE;
866: SetModality( WinQueryWindow( hwnd, QW_PARENT, FALSE ), *bModality );
867: WinInvalidateRect( hwnd, NULL, FALSE );
868: return;
869: case MI_EXIT:
870: WinPostMsg( hwnd, WM_QUIT, 0L, 0L );
871: return;
872: case MI_RESUME:
873: return;
874: case MI_ENTRYFIELDEXAMPLE:
875: idDlg = DLG_ENTRYFIELDEXAMPLE;
876: pfnDlgProc = (PFNWP)fnwpEntryFieldDlg;
877: break;
878: case MI_AUTORADIOBUTTONEXAMPLE:
879: idDlg = DLG_AUTORADIOBUTTONEXAMPLE;
880: pfnDlgProc = (PFNWP)fnwpAutoRadioButtonDlg;
881: break;
882: case MI_CHECKBOXEXAMPLE:
883: idDlg = DLG_CHECKBOXEXAMPLE;
884: pfnDlgProc = (PFNWP)fnwpCheckBoxDlg;
885: break;
886: case MI_LISTBOXEXAMPLE:
887: idDlg = DLG_LISTBOXEXAMPLE;
888: pfnDlgProc = (PFNWP)fnwpListBoxDlg;
889: break;
890: default:
891: return;
892: }
893: LoadDialog( HWND_DESKTOP,
894: hwndFrame,
895: idDlg,
896: pfnDlgProc,
897: *bModality );
898: if( *bModality )
899: WinInvalidateRect( hwnd, NULL, FALSE ); /* Request whole window repaint */
900: }
901:
902: /************************************************************************
903: *
904: * PRIVATE FUNCTION: MainWndPaint
905: *
906: * An unsophisticated window painting routine which simply repaints the
907: * entire window when a WM_PAINT message is received. In a real
908: * application more sophisticated techniques could be used to determine
909: * the minimum region needing repainting, and to paint only that
910: * region
911: *
912: ************************************************************************/
913:
914: VOID cdecl MainWndPaint( hwnd )
915: HWND hwnd;
916: {
917: POINTL pointl;
918: HPS hps; /* Presentation space handle */
919: RECTL rcl; /* Window rectangle */
920: CHAR string[50];
921:
922: hps = WinBeginPaint( hwnd, (HPS)NULL, (PRECTL)&rcl );
923: WinFillRect( hps, (PRECTL)&rcl, colorClient );
924: GpiSetColor( hps, (colorClient == 0L) ? CLR_WHITE
925: : CLR_BLACK );
926: pointl.x = 10L; pointl.y = 70L;
927: strcpy( string, "Dialog modality = " );
928: strcat( string, (bModality) ? "Modal"
929: : "Modeless" );
930: GpiCharStringAt( hps, &pointl, (LONG)strlen( string ), (PSZ)string );
931: pointl.y = 50L;
932: strcpy( string, "Entry Field 1 = " );
933: strcat( string, szEntryField1 );
934: GpiCharStringAt( hps, &pointl, (LONG)strlen( string ), (PSZ)string );
935: pointl.y = 30L;
936: strcpy( string, "Entry Field 2 = " );
937: strcat( string, szEntryField2 );
938: GpiCharStringAt( hps, &pointl, (LONG)strlen( string ), (PSZ)string );
939: pointl.y = 10L;
940: strcpy( string, "List Box Selection = " );
941: strcat( string, szSelection );
942: GpiCharStringAt( hps, &pointl, (LONG)strlen( string ), (PSZ)string );
943: WinEndPaint( hps );
944: }
945:
946: /**************************************************************************
947: *
948: * PRIVATE FUNCTION: SetModality
949: *
950: * Check or uncheck Modal and Modeless menu items as appropriate.
951: *
952: **************************************************************************/
953:
954: VOID cdecl SetModality( hwnd, bModal )
955: HWND hwnd;
956: BOOL bModal;
957: {
958: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
959: MM_SETITEMATTR,
960: MPFROM2SHORT( MI_MODAL, TRUE ),
961: MPFROM2SHORT( MIA_CHECKED, (bModal) ? ( MIA_CHECKED)
962: : (~MIA_CHECKED) ) );
963:
964: WinPostMsg( WinWindowFromID( hwnd, FID_MENU ),
965: MM_SETITEMATTR,
966: MPFROM2SHORT( MI_MODELESS, TRUE ),
967: MPFROM2SHORT( MIA_CHECKED, (bModal) ? (~MIA_CHECKED)
968: : ( MIA_CHECKED) ) );
969:
970: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.