Annotation of q_a/samples/platform/platform.c, revision 1.1

1.1     ! root        1: 
        !             2: /******************************************************************************\
        !             3: *       This is a part of the Microsoft Source Code Samples. 
        !             4: *       Copyright (C) 1993 Microsoft Corporation.
        !             5: *       All rights reserved. 
        !             6: *       This source code is only intended as a supplement to 
        !             7: *       Microsoft Development Tools and/or WinHelp documentation.
        !             8: *       See these sources for detailed information regarding the 
        !             9: *       Microsoft samples programs.
        !            10: \******************************************************************************/
        !            11: 
        !            12: /****************************************************************************
        !            13: 
        !            14:     PROGRAM: Platform.c
        !            15: 
        !            16:     PURPOSE: Platform template for Windows applications
        !            17: 
        !            18:     FUNCTIONS:
        !            19: 
        !            20:         WinMain() - calls initialization function, processes message loop
        !            21:         InitApplication() - initializes window data and registers window
        !            22:         InitInstance() - saves instance handle and creates main window
        !            23:         MainWndProc() - processes messages
        !            24:         About() - processes messages for "About" dialog box
        !            25: 
        !            26:     COMMENTS:
        !            27: 
        !            28:         Windows can have several copies of your application running at the
        !            29:         same time.  The variable hInst keeps track of which instance this
        !            30:         application is so that processing will be to the correct window.
        !            31: 
        !            32: ****************************************************************************/
        !            33: 
        !            34: #define STRICT
        !            35: 
        !            36: 
        !            37: #include <stddef.h>
        !            38: #include "windows.h"                /* required for all Windows applications */
        !            39: 
        !            40: #if defined(_WIN32)
        !            41: #define WIN32S  0x80000000l   // no manifest constance yet???
        !            42: #else
        !            43: #define APIENTRY FAR PASCAL
        !            44: #define WINAPI   FAR PASCAL
        !            45: #define TCHAR char
        !            46: #define LPTSTR LPSTR
        !            47: #define UNREFERENCED_PARAMETER(x) x;
        !            48: #define TEXT(x) x
        !            49: 
        !            50: #define WF1_WINNT 0x40        /* A special version of GetWinFlags() will
        !            51:                                * be provide in the WOW Layer which returns
        !            52:                                * a MANEFEST CONSTANT signifing to Win16
        !            53:                                * apps that it's running in WOW instead of
        !            54:                                * DOS/Windows. Unfortunately this value
        !            55:                                * was not specified at the time of this
        !            56:                                * sample. As *soon* as Development has set
        !            57:                                * on a manifest contanst PSS will upload a
        !            58:                                * KnowledgeBase article. Describing this flag
        !            59:                                * and any other relevent details need to get
        !            60:                                * this sample correctly identifing what platform
        !            61:                                * it's running on.
        !            62:                                */
        !            63: 
        !            64: #endif
        !            65: 
        !            66: 
        !            67: #include "Platform.h"               /* specific to this program              */
        !            68: 
        !            69: 
        !            70: HINSTANCE hInst;                       /* current instance                      */
        !            71: 
        !            72: 
        !            73: /****************************************************************************
        !            74: 
        !            75:     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
        !            76: 
        !            77:     PURPOSE: calls initialization function, processes message loop
        !            78: 
        !            79:     COMMENTS:
        !            80: 
        !            81:         Windows recognizes this function by name as the initial entry point
        !            82:         for the program.  This function calls the application initialization
        !            83:         routine, if no other instance of the program is running, and always
        !            84:         calls the instance initialization routine.  It then executes a message
        !            85:         retrieval and dispatch loop that is the top-level control structure
        !            86:         for the remainder of execution.  The loop is terminated when a WM_QUIT
        !            87:         message is received, at which time this function exits the application
        !            88:         instance by returning the value passed by PostQuitMessage().
        !            89: 
        !            90:         If this function must abort before entering the message loop, it
        !            91:         returns the conventional value NULL.
        !            92: 
        !            93: ****************************************************************************/
        !            94: 
        !            95: int WINAPI WinMain(HINSTANCE hInstance,      /* current instance  */
        !            96:                    HINSTANCE hPrevInstance,  /* previous instance */
        !            97:                    LPSTR     lpCmdLine,      /* command line      */
        !            98:                    int       nCmdShow)       /* show-window type (open/icon) */
        !            99: {
        !           100:     MSG msg;                                 /* message                      */
        !           101: 
        !           102:     if (!hPrevInstance)                  /* Other instances of app running? */
        !           103:         if (!InitApplication(hInstance)) /* Initialize shared things */
        !           104:             return (FALSE);              /* Exits if unable to initialize     */
        !           105: 
        !           106:     /* Perform initializations that apply to a specific instance */
        !           107: 
        !           108:     if (!InitInstance(hInstance, nCmdShow))
        !           109:         return (FALSE);
        !           110: 
        !           111:     /* Acquire and dispatch messages until a WM_QUIT message is received. */
        !           112: 
        !           113:     while (GetMessage(&msg,        /* message structure                      */
        !           114:             NULL,                  /* handle of window receiving the message */
        !           115:             0,                     /* lowest message to examine              */
        !           116:             0))                    /* highest message to examine             */
        !           117:     {
        !           118:             TranslateMessage(&msg);    /* Translates virtual key codes           */
        !           119:             DispatchMessage(&msg);     /* Dispatches message to window           */
        !           120:     }
        !           121: 
        !           122:     return (msg.wParam);           /* Returns the value from PostQuitMessage */
        !           123: UNREFERENCED_PARAMETER(lpCmdLine);
        !           124: }
        !           125: 
        !           126: 
        !           127: /****************************************************************************
        !           128: 
        !           129:     FUNCTION: InitApplication(HANDLE)
        !           130: 
        !           131:     PURPOSE: Initializes window data and registers window class
        !           132: 
        !           133:     COMMENTS:
        !           134: 
        !           135:         This function is called at initialization time only if no other
        !           136:         instances of the application are running.  This function performs
        !           137:         initialization tasks that can be done once for any number of running
        !           138:         instances.
        !           139: 
        !           140:         In this case, we initialize a window class by filling out a data
        !           141:         structure of type WNDCLASS and calling the Windows RegisterClass()
        !           142:         function.  Since all instances of this application use the same window
        !           143:         class, we only need to do this when the first instance is initialized.
        !           144: 
        !           145: 
        !           146: ****************************************************************************/
        !           147: 
        !           148: BOOL InitApplication(HANDLE hInstance)    /* current instance     */
        !           149: {
        !           150:     WNDCLASS  wc;
        !           151: 
        !           152:     /* Fill in window class structure with parameters that describe the       */
        !           153:     /* main window.                                                           */
        !           154: 
        !           155:     wc.style = 0;                        /* Class style(s).                    */
        !           156:     wc.lpfnWndProc = (WNDPROC)MainWndProc;       /* Function to retrieve messages for  */
        !           157:                                         /* windows of this class.             */
        !           158:     wc.cbClsExtra = 0;                  /* No per-class extra data.           */
        !           159:     wc.cbWndExtra = 0;                  /* No per-window extra data.          */
        !           160:     wc.hInstance = hInstance;           /* Application that owns the class.   */
        !           161:     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        !           162:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        !           163:     wc.hbrBackground = GetStockObject(WHITE_BRUSH);
        !           164:     wc.lpszMenuName =  "PlatformMenu";   /* Name of menu resource in .RC file. */
        !           165:     wc.lpszClassName = "PlatformWClass"; /* Name used in call to CreateWindow. */
        !           166: 
        !           167:     /* Register the window class and return success/failure code. */
        !           168: 
        !           169:     return (RegisterClass(&wc));
        !           170: 
        !           171: }
        !           172: 
        !           173: 
        !           174: /****************************************************************************
        !           175: 
        !           176:     FUNCTION:  InitInstance(HANDLE, int)
        !           177: 
        !           178:     PURPOSE:  Saves instance handle and creates main window
        !           179: 
        !           180:     COMMENTS:
        !           181: 
        !           182:         This function is called at initialization time for every instance of
        !           183:         this application.  This function performs initialization tasks that
        !           184:         cannot be shared by multiple instances.
        !           185: 
        !           186:         In this case, we save the instance handle in a static variable and
        !           187:         create and display the main program window.
        !           188: 
        !           189: ****************************************************************************/
        !           190: 
        !           191: BOOL InitInstance(HANDLE hInstance,     /* Current instance identifier.     */
        !           192:                   int nCmdShow )        /* Param for first ShowWindow() call. */
        !           193: {
        !           194:     HWND            hWnd;               /* Main window handle.                */
        !           195: 
        !           196:     /* Save the instance handle in static variable, which will be used in  */
        !           197:     /* many subsequence calls from this application to Windows.            */
        !           198: 
        !           199:     hInst = hInstance;
        !           200: 
        !           201:     /* Create a main window for this application instance.  */
        !           202: 
        !           203:     hWnd = CreateWindow(
        !           204:         "PlatformWClass",                /* See RegisterClass() call.          */
        !           205:         "Platform Sample Application",   /* Text for window title bar.         */
        !           206:         WS_OVERLAPPEDWINDOW,            /* Window style.                      */
        !           207:         10,                  /* Default horizontal position.       */
        !           208:         10,                  /* Default vertical position.         */
        !           209:         600,                  /* Default width.                     */
        !           210:         400,                  /* Default height.                    */
        !           211:         NULL,                           /* Overlapped windows have no parent. */
        !           212:         NULL,                           /* Use the window class menu.         */
        !           213:         hInstance,                      /* This instance owns this window.    */
        !           214:         NULL                            /* Pointer not needed.                */
        !           215:     );
        !           216: 
        !           217:     /* If window could not be created, return "failure" */
        !           218: 
        !           219:     if (!hWnd)
        !           220:         return (FALSE);
        !           221: 
        !           222:     /* Make the window visible; update its client area; and return "success" */
        !           223: 
        !           224:     ShowWindow(hWnd, nCmdShow);  /* Show the window                        */
        !           225:     UpdateWindow(hWnd);          /* Sends WM_PAINT message                 */
        !           226:     return (TRUE);               /* Returns the value from PostQuitMessage */
        !           227: 
        !           228: }
        !           229: 
        !           230: /****************************************************************************
        !           231: 
        !           232:     FUNCTION: MainWndProc(HWND, WORD, WPARAM, LPARAM)
        !           233: 
        !           234:     PURPOSE:  Processes messages
        !           235: 
        !           236:     MESSAGES:
        !           237: 
        !           238:         WM_COMMAND    - application menu (About dialog box)
        !           239:         WM_DESTROY    - destroy window
        !           240: 
        !           241:     COMMENTS:
        !           242: 
        !           243:         To process the IDM_ABOUT message, call MakeProcInstance() to get the
        !           244:         current instance address of the About() function.  Then call Dialog
        !           245:         box which will create the box according to the information in your
        !           246:         Platform.rc file and turn control over to the About() function. When
        !           247:         it returns, free the intance address.
        !           248: 
        !           249: ****************************************************************************/
        !           250: 
        !           251: long FAR PASCAL MainWndProc(HWND hWnd,      /* window handle             */
        !           252:                             UINT message,   /* type of message           */
        !           253:                             WPARAM wParam,  /* additional information    */
        !           254:                             LPARAM lParam ) /* additional information    */
        !           255: {
        !           256:     DLGPROC lpProcAbout;
        !           257:     DWORD   version, flags;
        !           258:     char    buf[80];
        !           259: 
        !           260:     switch (message) {
        !           261: 
        !           262:         case WM_COMMAND:           /* message: command from application menu */
        !           263:             if (LOWORD(wParam) == IDM_ABOUT) {
        !           264:                 lpProcAbout = (DLGPROC)MakeProcInstance((FARPROC)About, hInst );
        !           265: 
        !           266:                 DialogBox(hInst,                 /* current instance         */
        !           267:                     "AboutBox",                  /* resource to use          */
        !           268:                     hWnd,                        /* parent handle            */
        !           269:                     lpProcAbout);       /* About() instance address */
        !           270: 
        !           271:                 FreeProcInstance((FARPROC)lpProcAbout);
        !           272:                 break;
        !           273:             }
        !           274:             else if ( LOWORD(wParam) == IDM_PLATFORM ) {
        !           275:                 version = GetVersion();
        !           276:                 wsprintf( buf, "The version of Windows you're running is %d.%d",
        !           277:                          LOBYTE(LOWORD(version)), HIBYTE(LOWORD(version)) );
        !           278: 
        !           279:                  MessageBox( hWnd, buf, "Platform", MB_OK );
        !           280: #if defined(_WIN32) || defined(WIN32)
        !           281: /*
        !           282:  * bugbug Currently HIWORD of version is 500. The highbit is not set
        !           283:  */
        !           284: 
        !           285:                 if ( version & WIN32S )     /* High bit set */
        !           286:                     wsprintf ( buf, "This is running on Win32s" );
        !           287:                 else
        !           288:                     wsprintf ( buf, "This is running on Win32/NT" );
        !           289: 
        !           290: //              wsprintf( buf, "Verion = %#x", HIWORD(version) );
        !           291: //                MessageBox( hWnd, buf, "Platform", MB_OK );
        !           292: 
        !           293: 
        !           294:                 UNREFERENCED_PARAMETER(flags);
        !           295: #else
        !           296:                 flags = GetWinFlags();
        !           297:                 wsprintf ( buf, "flags are %#lx", flags );
        !           298:                 MessageBox ( hWnd, buf, NULL, MB_OK );
        !           299: 
        !           300:                 if ( flags & WF1_WINNT )
        !           301:                     wsprintf ( buf, "This is running in the WOW layer" );
        !           302:                 else
        !           303:                     wsprintf( buf, "The version of MS-DOS you're running is %d.%d",
        !           304:                          HIBYTE(HIWORD(version)), LOBYTE(HIWORD(version)) );
        !           305: #endif
        !           306:                 MessageBox( hWnd, buf, "Platform", MB_OK );
        !           307:             }
        !           308:             else                            /* Lets Windows process it       */
        !           309:                 return (DefWindowProc(hWnd, message, wParam, lParam));
        !           310: 
        !           311:             break;
        !           312: 
        !           313:         case WM_DESTROY:                  /* message: window being destroyed */
        !           314:             PostQuitMessage(0);
        !           315:             break;
        !           316: 
        !           317:         default:                          /* Passes it on if unproccessed    */
        !           318:             return (DefWindowProc(hWnd, message, wParam, lParam));
        !           319:     }
        !           320:     return ( 0 );
        !           321: }
        !           322: 
        !           323: 
        !           324: /****************************************************************************
        !           325: 
        !           326:     FUNCTION: About(HWND, unsigned, WORD, LONG)
        !           327: 
        !           328:     PURPOSE:  Processes messages for "About" dialog box
        !           329: 
        !           330:     MESSAGES:
        !           331: 
        !           332:         WM_INITDIALOG - initialize dialog box
        !           333:         WM_COMMAND    - Input received
        !           334: 
        !           335:     COMMENTS:
        !           336: 
        !           337:         No initialization is needed for this particular dialog box, but TRUE
        !           338:         must be returned to Windows.
        !           339: 
        !           340:         Wait for user to click on "Ok" button, then close the dialog box.
        !           341: 
        !           342: ****************************************************************************/
        !           343: 
        !           344: BOOL FAR PASCAL About(HWND hDlg,       /* window handle of the dialog box */
        !           345:                       UINT message,    /* type of message                 */
        !           346:                       WPARAM wParam,   /* message-specific information    */
        !           347:                       LPARAM lParam )
        !           348: {
        !           349:     switch (message) {
        !           350:         case WM_INITDIALOG:                /* message: initialize dialog box */
        !           351:             return (TRUE);
        !           352: 
        !           353:         case WM_COMMAND:                      /* message: received a command */
        !           354:             if (wParam == IDOK                /* "OK" box selected?          */
        !           355:                 || wParam == IDCANCEL) {      /* System menu close command? */
        !           356:                 EndDialog(hDlg, TRUE);        /* Exits the dialog box        */
        !           357:                 return (TRUE);
        !           358:             }
        !           359:             break;
        !           360:     }
        !           361:     return (FALSE);                           /* Didn't process a message    */
        !           362: UNREFERENCED_PARAMETER(lParam);
        !           363: }

unix.superglobalmegacorp.com

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