Annotation of os232sdk/toolkt20/c/samples/template/main.c, revision 1.1

1.1     ! root        1: /*==============================================================*\
        !             2:  *  Main.c - Sample PM application main source file
        !             3:  *
        !             4:  *      Created 1989, 1990 Microsoft 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 as a template than can be
        !            20:  *  easily modified by an application developer.  The source
        !            21:  *  files are organized so that the overhead code that should
        !            22:  *  be in all applications is located in the same files so
        !            23:  *  that these files do not need to be modified.  The routines
        !            24:  *  that deal with application specific code are also located
        !            25:  *  in their own modules.  An application developer need only
        !            26:  *  change these files in order to modify this template for
        !            27:  *  his application.
        !            28:  *
        !            29:  *--------------------------------------------------------------
        !            30:  *
        !            31:  *  This source file contains the following functions:
        !            32:  *
        !            33:  *      main() - main routine
        !            34:  *      MainWndProc(hwnd, msg, mp1, mp2) - main window procedure
        !            35:  *      MessageBox(hwnd idMsg, fsStyle, fBeep) - Message box routine
        !            36:  *      MainCommand(mp1, mp2) - WM_COMMAND processing of Main
        !            37:  *
        !            38: \*==============================================================*/
        !            39: 
        !            40: /*--------------------------------------------------------------*\
        !            41:  *  Include files, macros, defined constants, and externs
        !            42: \*--------------------------------------------------------------*/
        !            43: 
        !            44: #define  INCL_WINHELP
        !            45: 
        !            46: #include <os2.h>
        !            47: #include "main.h"
        !            48: #include "help.h"
        !            49: #include "xtrn.h"
        !            50: 
        !            51: 
        !            52: /*----
        !            53:  * Define these constants when th corresponding components (Help manager,
        !            54:  *  etc.) are implimented in the product
        !            55:  *---
        !            56: /* #define PRINT_DLGS_ENABLED */
        !            57: 
        !            58: 
        !            59: /*--------------------------------------------------------------*\
        !            60:  *  Global variables
        !            61: \*--------------------------------------------------------------*/
        !            62: HWND hwndMainFrame = NULL;          /* handle to the main frame window */
        !            63: HWND hwndMain;                      /* handle to the main client window */
        !            64: HDC  hdcMain;                       /* handle to the DC of the client */
        !            65: HAB  hab;                           /* anchor block for the process */
        !            66: HMQ  hmq;                           /* handle to the process' message queue */
        !            67: CHAR szAppName[MAXNAMEL];           /* buffer for application name string */
        !            68: CHAR szUntitled[MESSAGELEN];        /* buffer for "Untitled" string */
        !            69: BOOL fPrintEnabled;                 /* flag to determine if we can print */
        !            70: BOOL fHelpEnabled;                  /* flag to determine if help is enabled */
        !            71: 
        !            72: /*--------------------------------------------------------------*\
        !            73:  *  Entry point declarations
        !            74: \*--------------------------------------------------------------*/
        !            75: 
        !            76: /****************************************************************\
        !            77:  *  Main routine
        !            78:  *--------------------------------------------------------------
        !            79:  *
        !            80:  *  Name:   main()
        !            81:  *
        !            82:  *  Purpose: Initializes the PM environment, calls the
        !            83:  *              initialization routine, creates the main
        !            84:  *              window,  and polls the message queue
        !            85:  *
        !            86:  *  Usage:
        !            87:  *
        !            88:  *  Method:
        !            89:  *          - obtains anchor block handle and creates message
        !            90:  *              queue
        !            91:  *          - calls the initialization routine
        !            92:  *          - creates the main frame window which creates the
        !            93:  *              main client window
        !            94:  *          - polls the message queue via Get/Dispatch Msg loop
        !            95:  *          - upon exiting the loop, exits
        !            96:  *
        !            97:  *  Returns:
        !            98:  *          1 - if sucessful execution completed
        !            99:  *          0 - if error
        !           100: \****************************************************************/
        !           101: BOOL cdecl main(VOID)
        !           102: {
        !           103:     QMSG qmsg;          /* message structure */
        !           104:     ULONG flCtlData;    /* frame control data */
        !           105: 
        !           106:     hab = WinInitialize(0);
        !           107: 
        !           108:     if(!hab)  {
        !           109:         DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
        !           110:         return(RETURN_ERROR);
        !           111:     }
        !           112: 
        !           113:     hmq = WinCreateMsgQueue(hab, 0);
        !           114: 
        !           115:     if(!hmq)  {
        !           116:         DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR);
        !           117:         WinTerminate(hab);
        !           118:         return(RETURN_ERROR);
        !           119:     }
        !           120: 
        !           121:     if(!Init())  {
        !           122:         MessageBox(HWND_DESKTOP,
        !           123:                    IDMSG_INITFAILED,
        !           124:                    MB_OK | MB_ERROR,
        !           125:                    TRUE);
        !           126: 
        !           127:         return(RETURN_ERROR);
        !           128:     }
        !           129: 
        !           130:     /* NOTE:  clean up from here is handled by the DosExitList processing */
        !           131: 
        !           132: 
        !           133:     /* create the main window */
        !           134:     flCtlData = FCF_STANDARD;
        !           135: 
        !           136:     hwndMainFrame = WinCreateStdWindow(HWND_DESKTOP,
        !           137:                                        WS_VISIBLE,
        !           138:                                        (PULONG)&flCtlData,
        !           139:                                        (PSZ)szAppName,
        !           140:                                        (PSZ)NULL,
        !           141:                                        WS_VISIBLE,
        !           142:                                        (HMODULE)NULL,
        !           143:                                        IDR_MAIN,
        !           144:                                        (PHWND)&hwndMain);
        !           145: 
        !           146:     if(hwndMainFrame == NULL)  {
        !           147:         MessageBox(HWND_DESKTOP,
        !           148:                    IDMSG_MAINWINCREATEFAILED,
        !           149:                    MB_OK | MB_ERROR,
        !           150:                    TRUE);
        !           151:         return(RETURN_ERROR);
        !           152:     }
        !           153: 
        !           154:     hdcMain = WinOpenWindowDC(hwndMain);
        !           155: 
        !           156:     InitHelp();
        !           157: 
        !           158:     /* Get/Dispatch Message loop */
        !           159:     while(WinGetMsg(hmq, (PQMSG)&qmsg, NULL, NULL, NULL))
        !           160:         WinDispatchMsg(hmq, (PQMSG)&qmsg);
        !           161: 
        !           162:     /* destroy the help instance */
        !           163:     DestroyHelpInstance();
        !           164: 
        !           165: #ifdef BACKGROUND_THREAD
        !           166:     /* see main.h for comment on using a background thread */
        !           167:     DestroyBackgroundThread();
        !           168: #endif
        !           169: 
        !           170: 
        !           171:     return(RETURN_SUCCESS);
        !           172: 
        !           173: }   /* main() */
        !           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:         case TM_THREADINITFAILED:
        !           228:             /* message is received if the background thread initialization
        !           229:                 fails.  A message box is displayed and the application is
        !           230:                 terminated */
        !           231:             MessageBox(HWND_DESKTOP,
        !           232:                        IDMSG_INITFAILED,
        !           233:                        MB_OK | MB_ERROR,
        !           234:                        TRUE);
        !           235: 
        !           236:             WinPostMsg(hwnd, WM_CLOSE, NULL, NULL);
        !           237:             break;
        !           238: 
        !           239:     /*--------------------------------------------------*\
        !           240:      *      Any messages not processed are passed on
        !           241:      *      to the user's window proc.  It is
        !           242:      *      responsible for passing any messages it
        !           243:      *      doesn't handle onto WinDefWindowProc()
        !           244:     \*--------------------------------------------------*/
        !           245: 
        !           246:         default:
        !           247:             return(UserWndProc(hwnd, msg, mp1, mp2));
        !           248:             break;
        !           249: 
        !           250:     }
        !           251:     return 0L;      /* all window procedures should return 0 as a default */
        !           252: 
        !           253: }   /* MainWndProc() */
        !           254: 
        !           255: /****************************************************************\
        !           256:  *  Message Box procedure
        !           257:  *--------------------------------------------------------------
        !           258:  *
        !           259:  *  Name:   MessageBox(hwndOwner, nIdMsg, fsStyle, fBeep)
        !           260:  *
        !           261:  *  Purpose: Displays the message box with the message
        !           262:  *              given in idMsg retrieved from the message table
        !           263:  *              and using the style flags in fsStyle
        !           264:  *
        !           265:  *  Usage:  Called whenever a MessageBox is to be displayed
        !           266:  *
        !           267:  *  Method: - Message string is loaded from the process'
        !           268:  *              message table
        !           269:  *          - Alarm beep is sounded if desired
        !           270:  *          - Message box with the message is displayed
        !           271:  *          - WinMessageBox return value is returned
        !           272:  *
        !           273:  *  Returns: return value from WinMessageBox()
        !           274:  *
        !           275: \****************************************************************/
        !           276: SHORT MessageBox(hwndOwner, idMsg, fsStyle, fBeep)
        !           277: HWND hwndOwner;     /* handle of the message box's owner */
        !           278: SHORT idMsg;        /* id if the message in the message table */
        !           279: SHORT fsStyle;      /* style of the message box */
        !           280: BOOL fBeep;         /* if TRUE, beep before message box is displayed */
        !           281: {
        !           282:     CHAR szText[MESSAGELEN];
        !           283: 
        !           284:     if(!WinLoadMessage(hab,
        !           285:                       (HMODULE)NULL,
        !           286:                       idMsg,
        !           287:                       MESSAGELEN,
        !           288:                       (PSZ)szText)) {
        !           289: 
        !           290:         WinAlarm(HWND_DESKTOP, WA_ERROR);
        !           291:         return MBID_ERROR;
        !           292:     }
        !           293: 
        !           294:     if(fBeep)  {
        !           295:         WinAlarm(HWND_DESKTOP, WA_ERROR);
        !           296:     }
        !           297: 
        !           298:     return(WinMessageBox(HWND_DESKTOP,
        !           299:                          hwndOwner,
        !           300:                          szText,
        !           301:                          (PSZ)NULL,
        !           302:                          MSGBOXID,
        !           303:                          fsStyle));
        !           304: 
        !           305: }   /* MessageBox() */
        !           306: 
        !           307: /****************************************************************\
        !           308:  *  Main window WM_COMMAND processing procedure
        !           309:  *--------------------------------------------------------------
        !           310:  *
        !           311:  *  Name:   MainCommand(mp1, mp2)
        !           312:  *
        !           313:  *  Purpose: Calls the appropriate procedures that deal with
        !           314:  *              the selected menu item.
        !           315:  *
        !           316:  *  Usage:  Routine is called whenever a WM_COMMAND message
        !           317:  *          is posted to the main window.
        !           318:  *
        !           319:  *  Method: a switch statement branches on the id of the
        !           320:  *          menu item that posted the message and the
        !           321:  *          appropriate action for that item is taken.  Any
        !           322:  *          menu ids that are not part of the standard menu
        !           323:  *          set are passed onto the user defined WM_COMMAND
        !           324:  *          processing procedure.
        !           325:  *
        !           326:  *  Returns:
        !           327:  *
        !           328: \****************************************************************/
        !           329: VOID MainCommand(mp1, mp2)
        !           330: MPARAM mp1;     /* first parameter of WM_COMMAND message */
        !           331: MPARAM mp2;     /* second parameter of WM_COMMAND message */
        !           332: {
        !           333: 
        !           334:     switch(SHORT1FROMMP(mp1))  {
        !           335: 
        !           336:         case IDM_FILENEW:
        !           337:             FileNew(mp2);
        !           338:             break;
        !           339: 
        !           340:         case IDM_FILEOPEN:
        !           341:             FileOpen(mp2);
        !           342:             break;
        !           343: 
        !           344:         case IDM_FILESAVE:
        !           345:             FileSave(mp2);
        !           346:             break;
        !           347: 
        !           348:         case IDM_FILESAVEAS:
        !           349:             FileSaveAs(mp2);
        !           350:             break;
        !           351: 
        !           352: #ifdef PRINT_DIALOGS_ENABLED
        !           353: 
        !           354:         case IDM_FILEPRINT:
        !           355:             FilePrint(mp2);
        !           356:             break;
        !           357: 
        !           358:         case IDM_FILEPAGESETUP:
        !           359:             FilePageSetup(mp2);
        !           360:             break;
        !           361: 
        !           362:         case IDM_FILEPRINTSETUP:
        !           363:             FilePrintSetup(mp2);
        !           364:             break;
        !           365: 
        !           366: #endif  /* PRINT_DLGS_ENABLED */
        !           367: 
        !           368:         case IDM_FILEEXIT:
        !           369:             FileExit(mp2);
        !           370:             break;
        !           371: 
        !           372:         case IDM_EDITUNDO:
        !           373:             EditUndo(mp2);
        !           374:             break;
        !           375: 
        !           376:         case IDM_EDITCUT:
        !           377:             EditCut(mp2);
        !           378:             break;
        !           379: 
        !           380:         case IDM_EDITCOPY:
        !           381:             EditCopy(mp2);
        !           382:             break;
        !           383: 
        !           384:         case IDM_EDITPASTE:
        !           385:             EditPaste(mp2);
        !           386:             break;
        !           387: 
        !           388:         case IDM_EDITCLEAR:
        !           389:             EditClear(mp2);
        !           390:             break;
        !           391: 
        !           392:         case IDM_HELPHELPFORHELP:
        !           393:             HelpHelpForHelp(mp2);
        !           394:             break;
        !           395: 
        !           396:         case IDM_HELPEXTENDED:
        !           397:             HelpExtended(mp2);
        !           398:             break;
        !           399: 
        !           400:         case IDM_HELPKEYS:
        !           401:             HelpKeys(mp2);
        !           402:             break;
        !           403: 
        !           404:         case IDM_HELPINDEX:
        !           405:             HelpIndex(mp2);
        !           406:             break;
        !           407: 
        !           408:         case IDM_HELPTUTORIAL:
        !           409:             HelpTutorial(mp2);
        !           410:             break;
        !           411: 
        !           412:         case IDM_HELPABOUT:
        !           413:             HelpAbout(mp2);
        !           414:             break;
        !           415: 
        !           416: 
        !           417: 
        !           418:     /*--------------------------------------------------*\
        !           419:      *      User command processing routine is called
        !           420:      *      here so any ids not processed here can be
        !           421:      *      processed
        !           422:     \*--------------------------------------------------*/
        !           423:         default:
        !           424:             UserCommand(mp1, mp2);
        !           425:             break;
        !           426:     }
        !           427: 
        !           428: }   /* MainCommand() */

unix.superglobalmegacorp.com

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