|
|
1.1 ! root 1: /*==============================================================*\ ! 2: * Vmm_main.c - Sample PM 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 nId, bBeep) - Warning 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 LINT_ARGS ! 55: ! 56: #define INCL_WIN ! 57: #define INCL_DOSPROCESS ! 58: #include <os2.h> ! 59: #include "vmm_main.h" ! 60: #include "vmm_help.h" ! 61: #include "vmm_xtrn.h" ! 62: ! 63: #define RETURN_SUCCESS 0 /* successful return in DosExit */ ! 64: #define RETURN_ERROR 1 /* error return in DosExit */ ! 65: #define BEEP_WARN_FREQ 60 /* frequency of warning beep */ ! 66: #define BEEP_WARN_DUR 100 /* duration of warning beep */ ! 67: ! 68: /*--------------------------------------------------------------*\ ! 69: * Global variables * ! 70: \*--------------------------------------------------------------*/ ! 71: HWND hwndMainFrame; /* handle to the main frame window */ ! 72: HWND hwndMain; /* handle to the main client window */ ! 73: HAB hab; /* anchor block for the process */ ! 74: HMQ hmq; /* handle to the process' message queue */ ! 75: CHAR szAppName[MAXAPPNAMELEN]; /* buffer for application name string */ ! 76: ! 77: /*--------------------------------------------------------------*\ ! 78: * Entry point declarations * ! 79: \*--------------------------------------------------------------*/ ! 80: ! 81: /****************************************************************\ ! 82: * Main routine * ! 83: *--------------------------------------------------------------* ! 84: * * ! 85: * Name: main() * ! 86: * * ! 87: * Purpose: Initializes the PM environment, calls the * ! 88: * initialization routine, creates the main * ! 89: * window, and polls the message queue * ! 90: * * ! 91: * Usage: * ! 92: * * ! 93: * Method: * ! 94: * - obtains anchor block handle and creates message * ! 95: * queue * ! 96: * - calls the initialization routine * ! 97: * - creates the main frame window which creates the * ! 98: * main client window * ! 99: * - polls the message queue via Get/Dispatch Msg loop * ! 100: * - upon exiting the loop, exits * ! 101: * * ! 102: * Returns: (via DosExit) * ! 103: * 1 - if sucessful execution completed * ! 104: * 0 - if error * ! 105: \****************************************************************/ ! 106: ! 107: VOID cdecl main(VOID) ! 108: { ! 109: QMSG qmsg; /* message structure */ ! 110: ULONG ctlData; /* frame control data */ ! 111: ! 112: hab = WinInitialize(0); ! 113: if(!hab) { ! 114: DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR); ! 115: DosExit(EXIT_PROCESS, RETURN_ERROR); ! 116: } ! 117: /* find a define for this v */ ! 118: hmq = WinCreateMsgQueue(hab, 0); ! 119: if(!hmq) { ! 120: DosBeep(BEEP_WARN_FREQ, BEEP_WARN_DUR); ! 121: WinTerminate(hab); ! 122: DosExit(EXIT_PROCESS, RETURN_ERROR); ! 123: } ! 124: ! 125: if(!Init()) { ! 126: MessageBox(HWND_DESKTOP, IDMSG_INITFAILED, TRUE); ! 127: DosExit(EXIT_PROCESS, RETURN_ERROR); ! 128: } ! 129: ! 130: /* create the main window */ ! 131: ! 132: ! 133: #ifdef VER630 ! 134: ctlData = FCF_STANDARD /* & ~FCF_ICON */ ; ! 135: #else ! 136: ! 137: ctlData = FCF_STANDARD; ! 138: ! 139: #endif ! 140: ! 141: hwndMainFrame = WinCreateStdWindow(HWND_DESKTOP, ! 142: WS_VISIBLE, ! 143: (PVOID)&ctlData, ! 144: (PSZ)szAppName, ! 145: (PSZ)NULL, ! 146: WS_VISIBLE, ! 147: (HMODULE)NULL, ! 148: IDR_SAMPLE, ! 149: (PHWND)&hwndMain); ! 150: ! 151: if(!hwndMainFrame) { ! 152: MessageBox(HWND_DESKTOP, IDMSG_MAINWINCREATEFAILED, TRUE); ! 153: DosExit(EXIT_PROCESS, RETURN_ERROR); ! 154: } ! 155: ! 156: // InitHelp(); ! 157: ! 158: /* Get/Dispatch Message loop */ ! 159: ! 160: while(WinGetMsg(hmq, (PQMSG)&qmsg, NULL, NULL, NULL)) ! 161: WinDispatchMsg(hmq, (PQMSG)&qmsg); ! 162: ! 163: ! 164: #ifdef VER630 ! 165: /* will normally be put in ExitProc */ ! 166: WinDestroyWindow(hwndMainFrame); ! 167: ! 168: /*--------------------------------------------------*\ ! 169: * Any other system resources used * ! 170: * (e.g. memory or files) should be freed here * ! 171: \*--------------------------------------------------*/ ! 172: ! 173: WinDestroyMsgQueue(hmq); ! 174: ! 175: WinTerminate(hab); ! 176: ! 177: #endif ! 178: ! 179: DosExit(EXIT_PROCESS, RETURN_SUCCESS); ! 180: ! 181: } /* main() */ ! 182: ! 183: ! 184: /****************************************************************\ ! 185: * Main client window procedure * ! 186: *--------------------------------------------------------------* ! 187: * * ! 188: * Name: MainWndProc(hwnd, msg, mp1, mp2) * ! 189: * * ! 190: * Purpose: Processes the messages sent to the main client * ! 191: * window. This routine processes the basic * ! 192: * messages all client windows should process * ! 193: * and passes all others onto UserWndProc where * ! 194: * the developer can process any others. * ! 195: * * ! 196: * Usage: Called for each message placed in the main * ! 197: * window's message queue * ! 198: * * ! 199: * Method: a switch statement branches to the routines to be * ! 200: * performed for each message processed. Any messages * ! 201: * not specifically process are passed to the user's * ! 202: * message processing procedure UserWndProc(). * ! 203: * * ! 204: * Returns: Return values are determined by each message * ! 205: * * ! 206: \****************************************************************/ ! 207: ! 208: MRESULT EXPENTRY MainWndProc(hwnd, msg, mp1, mp2) ! 209: HWND hwnd; /* handle of window */ ! 210: USHORT msg; /* id of message */ ! 211: MPARAM mp1; /* first message parameter */ ! 212: MPARAM mp2; /* second message parameter */ ! 213: { ! 214: ! 215: switch(msg) { ! 216: case WM_PAINT: ! 217: MainPaint(hwnd); ! 218: break; ! 219: ! 220: case WM_COMMAND: ! 221: MainCommand(mp1, mp2); ! 222: break; ! 223: ! 224: case HM_QUERY_KEYS_HELP: ! 225: return (MRESULT)PANEL_HELPKEYS; /* return id of key help panel */ ! 226: break; ! 227: ! 228: /*--------------------------------------------------*\ ! 229: * Any messages not processed are passed on * ! 230: * to the user's window proc. It is * ! 231: * responsible for passing any messages it * ! 232: * doesn't handle onto WinDefWindowProc() * ! 233: \*--------------------------------------------------*/ ! 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: #endif ! 399: ! 400: case IDM_HELPABOUT: ! 401: HelpAbout(mp2); ! 402: break; ! 403: ! 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() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.