Annotation of os232sdk/toolkt20/c/samples/semaph/sem_main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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