Annotation of os232sdk/toolkt20/c/samples/style/sty_main.c, revision 1.1.1.1

1.1       root        1: /*==============================================================*\
                      2:  *  Main.c - Sample PM style application
                      3:  *
                      4:  *      Created 1990, Microsoft, IBM  Corp.
                      5:  *
                      6:  *     DISCLAIMER OF WARRANTIES.  The following [enclosed] code is 
                      7:  *     sample code created by Microsoft Corporation and/or IBM 
                      8:  *     Corporation. This sample code is not part of any standard 
                      9:  *     Microsoft or IBM product and is provided to you solely for 
                     10:  *     the purpose of assisting you in the development of your 
                     11:  *     applications.  The code is provided "AS IS", without 
                     12:  *     warranty of any kind.  Neither Microsoft nor IBM shall be 
                     13:  *     liable for any damages arising out of your use of the sample 
                     14:  *     code, even if they have been advised of the possibility of 
                     15:  *     such damages.
                     16:  *
                     17:  *--------------------------------------------------------------
                     18:  *
                     19:  *  This application serves two distinct purposes.  First, it
                     20:  *  demonstrates the standard menus and dialogs that most PM
                     21:  *  applications will contain.  The Demo menu calls dialog
                     22:  *  boxes that demonstrate all of the controls available for
                     23:  *  use in a dialog box.  There is also a dialog box which
                     24:  *  demonstrates the setting and removing of control
                     25:  *  Presentation Parameters.  Finally, the demo menu also has
                     26:  *  menu items that demonstrate the various types of message
                     27:  *  boxes that the system supports.
                     28:  *
                     29:  *  This application also serves as a template than can be
                     30:  *  easily modified by an application developer.  The source
                     31:  *  files are organized so that the overhead code that should
                     32:  *  be in all applications is located in the same files so
                     33:  *  that these files do not need to be modified.  The routines
                     34:  *  that deal with application specific code are also located
                     35:  *  in their own modules.  An application developer need only
                     36:  *  change these files in order to modify this template for
                     37:  *  his application.
                     38:  *
                     39:  *--------------------------------------------------------------
                     40:  *
                     41:  *  This source file contains the following functions:
                     42:  *
                     43:  *      main() - main routine
                     44:  *      MainWndProc(hwnd, msg, mp1, mp2) - main window procedure
                     45:  *      MessageBox(hwnd, id, fsShort, fBeep) - Message box routine
                     46:  *      MainCommand(mp1, mp2) - WM_COMMAND processing of Main
                     47:  *
                     48: \*==============================================================*/
                     49: 
                     50: /*--------------------------------------------------------------*\
                     51:  *  Include files, macros, defined constants, and externs
                     52: \*--------------------------------------------------------------*/
                     53: 
                     54: #define  INCL_WINHELP
                     55: 
                     56: #include <os2.h>
                     57: #include "sty_main.h"
                     58: #include "sty_xtrn.h"
                     59: #include "sty_help.h"
                     60: 
                     61: #define RETURN_SUCCESS      0   /* successful return in DosExit */
                     62: #define RETURN_ERROR        1   /* error return in DosExit */
                     63: #define BEEP_WARN_FREQ      60  /* frequency of warning beep */
                     64: #define BEEP_WARN_DUR      100  /* duration of warning beep */
                     65: 
                     66: /* The comments around this line should be removed when the import/export
                     67:     bug in MLEs is fixed */
                     68: /* #define MLE_BUGS_FIXED */
                     69: /* #define PRINT_DLGS_ENABLED */
                     70: 
                     71: /*--------------------------------------------------------------*\
                     72:  *  Global variables
                     73: \*--------------------------------------------------------------*/
                     74: HWND hwndMainFrame;             /* handle to the main frame window */
                     75: HWND hwndMain;                  /* handle to the main client window */
                     76: HDC  hdcMain;                   /* handle to the DC of the client */
                     77: HAB hab;                        /* anchor block for the process */
                     78: HMQ hmq;                        /* handle to the process' message queue */
                     79: CHAR szAppName[MAXNAMEL];       /* buffer for application name string */
                     80: CHAR szUntitled[MESSAGELEN];    /* buffer for "Untitled" string */
                     81: BOOL fPrintEnabled;             /* flag to determine if we can print */
                     82: BOOL fHelpEnabled;              /* flag to determine if help is enabled */
                     83: 
                     84: /*--------------------------------------------------------------*\
                     85:  *  Entry point declarations
                     86: \*--------------------------------------------------------------*/
                     87: 
                     88: 
                     89: /****************************************************************\
                     90:  *  Main routine
                     91:  *--------------------------------------------------------------
                     92:  *
                     93:  *  Name:   main()
                     94:  *
                     95:  *  Purpose: Initializes the PM environment, calls the
                     96:  *              initialization routine, creates the main
                     97:  *              window,  and polls the message queue
                     98:  *
                     99:  *  Usage:
                    100:  *
                    101:  *  Method:
                    102:  *          - obtains anchor block handle and creates message
                    103:  *              queue
                    104:  *          - calls the initialization routine
                    105:  *          - creates the main frame window which creates the
                    106:  *              main client window
                    107:  *          - polls the message queue via Get/Dispatch Msg loop
                    108:  *          - upon exiting the loop, exits
                    109:  *
                    110:  *  Returns:
                    111:  *          1 - if sucessful execution completed
                    112:  *          0 - if error
                    113: \****************************************************************/
                    114: BOOL cdecl main(VOID)
                    115: {
                    116:     QMSG qmsg;          /* message structure */
                    117:     ULONG ctlData;      /* frame control data */
                    118: 
                    119:     hab = WinInitialize(0);
                    120:     if(!hab)  {
                    121:         DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
                    122:         return(RETURN_ERROR);
                    123:     }
                    124: 
                    125:     hmq = WinCreateMsgQueue(hab, 0);
                    126:     if(!hmq)  {
                    127:         DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
                    128:         WinTerminate(hab);
                    129:         return(RETURN_ERROR);
                    130:     }
                    131: 
                    132:     if(!Init())  {
                    133:         MessageBox(HWND_DESKTOP, IDMSG_INITFAILED, MB_OK | MB_ERROR, TRUE);
                    134:         return(RETURN_ERROR);
                    135:     }
                    136: 
                    137:     /* NOTE:  clean up from here is handled by the DosExitList processing */
                    138: 
                    139:     /* create the main window */
                    140:     ctlData = FCF_STANDARD;
                    141: 
                    142:     hwndMainFrame = WinCreateStdWindow(HWND_DESKTOP,
                    143:                                        WS_VISIBLE,
                    144:                                        (PVOID)&ctlData,
                    145:                                        (PSZ)szAppName,
                    146:                                        (PSZ)NULL,
                    147:                                        WS_VISIBLE,
                    148:                                        (HMODULE)NULL,
                    149:                                        IDR_MAIN,
                    150:                                        (PHWND)&hwndMain);
                    151: 
                    152:     if(!hwndMainFrame)  {
                    153:         MessageBox(HWND_DESKTOP,
                    154:                    IDMSG_MAINWINCREATEFAILED,
                    155:                    MB_OK | MB_ERROR,
                    156:                    TRUE);
                    157:         return(RETURN_ERROR);
                    158:     }
                    159: 
                    160:     hdcMain = WinOpenWindowDC(hwndMain);
                    161: 
                    162:     InitHelp();
                    163: 
                    164:     /* Get/Dispatch Message loop */
                    165:     while(WinGetMsg(hmq, (PQMSG)&qmsg, NULL, NULL, NULL))
                    166:         WinDispatchMsg(hmq, (PQMSG)&qmsg);
                    167: 
                    168:     DestroyHelpInstance();
                    169: 
                    170:     return(RETURN_SUCCESS);
                    171: 
                    172: }   /* main() */
                    173: 
                    174: 
                    175: 
                    176: /****************************************************************\
                    177:  *  Main client window procedure
                    178:  *--------------------------------------------------------------
                    179:  *
                    180:  *  Name:   MainWndProc(hwnd, msg, mp1, mp2)
                    181:  *
                    182:  *  Purpose: Processes the messages sent to the main client
                    183:  *              window.  This routine processes the basic
                    184:  *              messages all client windows should process
                    185:  *              and passes all others onto UserWndProc where
                    186:  *              the developer can process any others.
                    187:  *
                    188:  *  Usage:  Called for each message placed in the main
                    189:  *          window's message queue
                    190:  *
                    191:  *  Method: a switch statement branches to the routines to be
                    192:  *          performed for each message processed.  Any messages
                    193:  *          not specifically process are passed to the user's
                    194:  *          message processing procedure UserWndProc().
                    195:  *
                    196:  *  Returns:  Return values are determined by each message
                    197:  *
                    198: \****************************************************************/
                    199: MRESULT EXPENTRY MainWndProc(hwnd, msg, mp1, mp2)
                    200: HWND hwnd;      /* handle of window */
                    201: USHORT msg;     /* id of message */
                    202: MPARAM mp1;     /* first message parameter */
                    203: MPARAM mp2;     /* second message parameter */
                    204: {
                    205: 
                    206:     switch(msg)  {
                    207:         case WM_CREATE:
                    208:             return(InitMainWindow(hwnd, mp1, mp2));
                    209:             break;
                    210: 
                    211:         case WM_PAINT:
                    212:             MainPaint(hwnd);
                    213:             break;
                    214: 
                    215:         case WM_COMMAND:
                    216:             MainCommand(mp1, mp2);
                    217:             break;
                    218: 
                    219:         case WM_INITMENU:
                    220:             InitMenu(mp1, mp2);
                    221:             break;
                    222: 
                    223:         case HM_QUERY_KEYS_HELP:
                    224:             return (MRESULT)PANEL_HELPKEYS;     /* return id of key help panel */
                    225:             break;
                    226: 
                    227:     /*--------------------------------------------------*\
                    228:      *      Any messages not processed are passed on
                    229:      *      to the user's window proc.  It is
                    230:      *      responsible for passing any messages it
                    231:      *      doesn't handle onto WinDefWindowProc()
                    232:     \*--------------------------------------------------*/
                    233: 
                    234:         default:
                    235:             return(UserWndProc(hwnd, msg, mp1, mp2));
                    236:             break;
                    237: 
                    238:     }
                    239:     return 0L;      /* all window procedures should return 0 as a default */
                    240: 
                    241: }   /* MainWndProc() */
                    242: 
                    243: /****************************************************************\
                    244:  *  Message Box procedure
                    245:  *--------------------------------------------------------------
                    246:  *
                    247:  *  Name:   MessageBox(hwndOwner, idMsg, fsStyle, fBeep)
                    248:  *
                    249:  *  Purpose: Displays the warning message box with the message
                    250:  *              given in idMsg retrived from the message table
                    251:  *
                    252:  *  Usage:  Called whever an error occurs and a message wishes
                    253:  *          to be displayed to the user
                    254:  *
                    255:  *  Method: - Message string is loaded from the process'
                    256:  *              message table
                    257:  *          - Alarm beep is sounded if desired
                    258:  *          - Message box with the message is displayed
                    259:  *
                    260:  *  Returns:
                    261:  *
                    262: \****************************************************************/
                    263: SHORT MessageBox(hwndOwner, idMsg, fsStyle, fBeep)
                    264: HWND hwndOwner;     /* handle of the message box's owner */
                    265: SHORT idMsg;        /* id if the message in the message table */
                    266: SHORT fsStyle;      /* style of the message box */
                    267: BOOL fBeep;         /* if TRUE, beep before message box is displayed */
                    268: {
                    269:     CHAR szText[MESSAGELEN];
                    270: 
                    271:     if(!WinLoadMessage(hab,
                    272:                       (HMODULE)NULL,
                    273:                       idMsg,
                    274:                       MESSAGELEN,
                    275:                       (PSZ)szText)) {
                    276: 
                    277:         WinAlarm(HWND_DESKTOP, WA_ERROR);
                    278:         return MBID_ERROR;
                    279:     }
                    280: 
                    281:     if(fBeep)
                    282:         WinAlarm(HWND_DESKTOP, WA_ERROR);
                    283: 
                    284:     return(WinMessageBox(HWND_DESKTOP,
                    285:                          hwndOwner,
                    286:                          szText,
                    287:                          (PSZ)NULL,
                    288:                          IDD_MSGBOX,
                    289:                          fsStyle));
                    290: 
                    291: }   /* MessageBox() */
                    292: 
                    293: /****************************************************************\
                    294:  *  Main window WM_COMMAND processing procedure
                    295:  *--------------------------------------------------------------
                    296:  *
                    297:  *  Name:   MainCommand(mp1, mp2)
                    298:  *
                    299:  *  Purpose: Calls the appropriate procedures that deal with
                    300:  *              the selected menu item.
                    301:  *
                    302:  *  Usage:  Routine is called whenever a WM_COMMAND message
                    303:  *          is posted to the main window.
                    304:  *
                    305:  *  Method: a switch statement branches on the id of the
                    306:  *          menu item that posted the message and the
                    307:  *          appropriate action for that item is taken.  Any
                    308:  *          menu ids that are not part of the standard menu
                    309:  *          set are passed onto the user defined WM_COMMAND
                    310:  *          processing procedure.
                    311:  *
                    312:  *  Returns:
                    313:  *
                    314: \****************************************************************/
                    315: VOID MainCommand(mp1, mp2)
                    316: MPARAM mp1;     /* first parameter of WM_COMMAND message */
                    317: MPARAM mp2;     /* second parameter of WM_COMMAND message */
                    318: {
                    319: 
                    320:     switch(SHORT1FROMMP(mp1))  {
                    321: 
                    322:         case IDM_FILENEW:
                    323:             FileNew(mp2);
                    324:             break;
                    325: 
                    326: #ifdef MLE_BUGS_FIXED
                    327:         case IDM_FILEOPEN:
                    328:             FileOpen(mp2);
                    329:             break;
                    330: 
                    331:         case IDM_FILESAVE:
                    332:             FileSave(mp2);
                    333:             break;
                    334: 
                    335:         case IDM_FILESAVEAS:
                    336:             FileSaveAs(mp2);
                    337:             break;
                    338: 
                    339: #endif
                    340: 
                    341: #ifdef PRINT_DIALOGS_ENABLED
                    342:         case IDM_FILEPRINT:
                    343:             FilePrint(mp2);
                    344:             break;
                    345: 
                    346:         case IDM_FILEPAGESETUP:
                    347:             FilePageSetup(mp2);
                    348:             break;
                    349: 
                    350:         case IDM_FILEPRINTSETUP:
                    351:             FilePrintSetup(mp2);
                    352:             break;
                    353: 
                    354: #endif
                    355: 
                    356:         case IDM_FILEEXIT:
                    357:             FileExit(mp2);
                    358:             break;
                    359: 
                    360:         case IDM_EDITUNDO:
                    361:             EditUndo(mp2);
                    362:             break;
                    363: 
                    364:         case IDM_EDITCUT:
                    365:             EditCut(mp2);
                    366:             break;
                    367: 
                    368:         case IDM_EDITCOPY:
                    369:             EditCopy(mp2);
                    370:             break;
                    371: 
                    372:         case IDM_EDITPASTE:
                    373:             EditPaste(mp2);
                    374:             break;
                    375: 
                    376:         case IDM_EDITCLEAR:
                    377:             EditClear(mp2);
                    378:             break;
                    379: 
                    380:         case IDM_HELPHELPFORHELP:
                    381:             HelpHelpForHelp(mp2);
                    382:             break;
                    383: 
                    384:         case IDM_HELPEXTENDED:
                    385:             HelpExtended(mp2);
                    386:             break;
                    387: 
                    388:         case IDM_HELPKEYS:
                    389:             HelpKeys(mp2);
                    390:             break;
                    391: 
                    392:         case IDM_HELPINDEX:
                    393:             HelpIndex(mp2);
                    394:             break;
                    395: 
                    396:         case IDM_HELPTUTORIAL:
                    397:             HelpTutorial(mp2);
                    398:             break;
                    399: 
                    400:         case IDM_HELPABOUT:
                    401:             HelpAbout(mp2);
                    402:             break;
                    403: 
                    404: 
                    405: 
                    406:     /*--------------------------------------------------*\
                    407:      *      User command processing routine is called
                    408:      *      here so any ids not procecessed here can be
                    409:      *      processed
                    410:     \*--------------------------------------------------*/
                    411:         default:
                    412:             UserCommand(mp1, mp2);
                    413:             break;
                    414:     }
                    415: 
                    416: }   /* MainCommand() */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.