|
|
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.