Annotation of mstools/samples/output/output.c, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2: 
        !             3:     PROGRAM: Output.c
        !             4: 
        !             5:     PURPOSE: Output template for Windows applications
        !             6: 
        !             7:     FUNCTIONS:
        !             8: 
        !             9:        WinMain() - calls initialization function, processes message loop
        !            10:        InitApplication() - initializes window data and registers window
        !            11:        InitInstance() - saves instance handle and creates main window
        !            12:        MainWndProc() - processes messages
        !            13:        About() - processes messages for "About" dialog box
        !            14: 
        !            15: ****************************************************************************/
        !            16: 
        !            17: #include "windows.h"
        !            18: #include "string.h"
        !            19: #include "output.h"
        !            20: 
        !            21: HANDLE hInst;
        !            22: 
        !            23: HPEN hDashPen;                                         /* "---" pen handle   */
        !            24: HPEN hDotPen;                                          /* "..." pen handle   */
        !            25: HBRUSH hOldBrush;                                      /* old brush handle   */
        !            26: HBRUSH hRedBrush;                                      /* red brush handle   */
        !            27: HBRUSH hGreenBrush;                                    /* green brush handle */
        !            28: HBRUSH hBlueBrush;                                     /* blue brush handle  */
        !            29: 
        !            30: 
        !            31: /****************************************************************************
        !            32: 
        !            33:     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
        !            34: 
        !            35:     PURPOSE: calls initialization function, processes message loop
        !            36: 
        !            37: ****************************************************************************/
        !            38: 
        !            39: int APIENTRY WinMain(
        !            40:     HANDLE hInstance,
        !            41:     HANDLE hPrevInstance,
        !            42:     LPSTR lpCmdLine,
        !            43:     int nCmdShow
        !            44:     )
        !            45: {
        !            46:     MSG msg;
        !            47: 
        !            48:     UNREFERENCED_PARAMETER( lpCmdLine );
        !            49: 
        !            50:     if (!hPrevInstance)
        !            51:        if (!InitApplication(hInstance))
        !            52:            return (FALSE);
        !            53: 
        !            54:     if (!InitInstance(hInstance, nCmdShow))
        !            55:         return (FALSE);
        !            56: 
        !            57:     while (GetMessage(&msg, NULL, NULL, NULL)) {
        !            58:        TranslateMessage(&msg);
        !            59:        DispatchMessage(&msg);
        !            60:     }
        !            61:     return (msg.wParam);
        !            62: }
        !            63: 
        !            64: 
        !            65: /****************************************************************************
        !            66: 
        !            67:     FUNCTION: InitApplication(HANDLE)
        !            68: 
        !            69:     PURPOSE: Initializes window data and registers window class
        !            70: 
        !            71: ****************************************************************************/
        !            72: BOOL InitApplication(HANDLE hInstance)
        !            73: {
        !            74:     WNDCLASS  wc;
        !            75: 
        !            76:     wc.style = NULL;
        !            77:     wc.lpfnWndProc = (WNDPROC) MainWndProc;
        !            78:     wc.cbClsExtra = 0;
        !            79:     wc.cbWndExtra = 0;
        !            80:     wc.hInstance = hInstance;
        !            81:     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        !            82:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        !            83:     wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
        !            84:     wc.lpszMenuName =  "OutputMenu";
        !            85:     wc.lpszClassName = "OutputWClass";
        !            86: 
        !            87:     return (RegisterClass(&wc));
        !            88: }
        !            89: 
        !            90: 
        !            91: /****************************************************************************
        !            92: 
        !            93:     FUNCTION:  InitInstance(HANDLE, int)
        !            94: 
        !            95:     PURPOSE:  Saves instance handle and creates main window
        !            96: 
        !            97: ****************************************************************************/
        !            98: 
        !            99: BOOL InitInstance(
        !           100:     HANDLE          hInstance,
        !           101:     INT             nCmdShow)
        !           102: {
        !           103:     HWND            hWnd;
        !           104: 
        !           105:     hInst = hInstance;
        !           106: 
        !           107:     hWnd = CreateWindow(
        !           108:         "OutputWClass",
        !           109:         "Output Sample Application",
        !           110:         WS_OVERLAPPEDWINDOW,
        !           111:        0,
        !           112:        0,
        !           113:        GetSystemMetrics(SM_CXSCREEN),
        !           114:        GetSystemMetrics(SM_CYSCREEN),
        !           115:         NULL,
        !           116:         NULL,
        !           117:         hInstance,
        !           118:         NULL
        !           119:     );
        !           120: 
        !           121:     if (!hWnd)
        !           122:         return (FALSE);
        !           123: 
        !           124:     ShowWindow(hWnd, nCmdShow);
        !           125:     UpdateWindow(hWnd);
        !           126:     return (TRUE);
        !           127: 
        !           128: }
        !           129: 
        !           130: /****************************************************************************
        !           131: 
        !           132:     FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
        !           133: 
        !           134:     PURPOSE:  Processes messages
        !           135: 
        !           136:     MESSAGES:
        !           137: 
        !           138:        WM_COMMAND    - application menu (About dialog box)
        !           139:        WM_CREATE     - create window and objects
        !           140:        WM_PAINT      - update window, draw objects
        !           141:        WM_DESTROY    - destroy window
        !           142: 
        !           143:     COMMENTS:
        !           144: 
        !           145:        Handles to the objects you will use are obtained when the WM_CREATE
        !           146:        message is received, and deleted when the WM_DESTROY message is
        !           147:        received.  The actual drawing is done whenever a WM_PAINT message is
        !           148:        received.
        !           149: 
        !           150: ****************************************************************************/
        !           151: 
        !           152: LONG APIENTRY MainWndProc(
        !           153:     HWND hWnd,
        !           154:     UINT message,
        !           155:     UINT wParam,
        !           156:     LONG lParam)
        !           157: {
        !           158:     FARPROC lpProcAbout;
        !           159: 
        !           160:     HDC hDC;                          /* display-context variable  */
        !           161:     PAINTSTRUCT ps;                   /* paint structure           */
        !           162:     RECT rcTextBox;                   /* rectangle around the text */
        !           163:     HPEN hOldPen;                     /* old pen handle            */
        !           164: 
        !           165: 
        !           166: 
        !           167:     switch (message) {
        !           168:        case WM_COMMAND:
        !           169:            if (LOWORD(wParam) == IDM_ABOUT) {
        !           170:                lpProcAbout = MakeProcInstance((FARPROC)About, hInst);
        !           171: 
        !           172:                DialogBox(hInst,
        !           173:                    "AboutBox",
        !           174:                    hWnd,
        !           175:                    (WNDPROC)lpProcAbout);
        !           176: 
        !           177:                FreeProcInstance(lpProcAbout);
        !           178:                break;
        !           179:            }
        !           180:            else
        !           181:                return (DefWindowProc(hWnd, message, wParam, lParam));
        !           182: 
        !           183:         case WM_CREATE:
        !           184: 
        !           185:             /* Create the brush objects */
        !           186: 
        !           187:             hRedBrush =   CreateSolidBrush(RGB(255,   0,   0));
        !           188:             hGreenBrush = CreateSolidBrush(RGB(  0, 255,   0));
        !           189:             hBlueBrush =  CreateSolidBrush(RGB(  0,   0, 255));
        !           190: 
        !           191:             /* Create the "---" pen */
        !           192: 
        !           193:             hDashPen = CreatePen(PS_DASH,                /* style */
        !           194:                 1,                                       /* width */
        !           195:                 RGB(0, 0, 0));                           /* color */
        !           196: 
        !           197:             /* Create the "..." pen */
        !           198: 
        !           199:             hDotPen = CreatePen(2,                       /* style */
        !           200:                 1,                                       /* width */
        !           201:                 RGB(0, 0, 0));                           /* color */
        !           202:             break;
        !           203: 
        !           204:         case WM_PAINT:
        !           205:             {
        !           206:                TEXTMETRIC textmetric;
        !           207:                INT nDrawX;
        !           208:                INT nDrawY;
        !           209:                CHAR szText[300];
        !           210: 
        !           211:                /* Set up a display context to begin painting */
        !           212: 
        !           213:                 hDC = BeginPaint (hWnd, &ps);
        !           214: 
        !           215:                 /* Get the size characteristics of the current font.  */
        !           216:                 /* This information will be used for determining the  */
        !           217:                 /* vertical spacing of text on the screen.            */
        !           218: 
        !           219:                 GetTextMetrics (hDC, &textmetric);
        !           220: 
        !           221:                 /* Initialize drawing position to 1/4 inch from the top  */
        !           222:                 /* and from the left of the top, left corner of the      */
        !           223:                 /* client area of the main windows.                      */
        !           224: 
        !           225:                 nDrawX = GetDeviceCaps(hDC, LOGPIXELSX) / 4;   /* 1/4 inch */
        !           226:                 nDrawY = GetDeviceCaps(hDC, LOGPIXELSY) / 4;   /* 1/4 inch */
        !           227: 
        !           228:                 /* Send characters to the screen.  After displaying each   */
        !           229:                 /* line of text, advance the vertical position for the     */
        !           230:                 /* next line of text.  The pixel distance between the top  */ 
        !           231:                 /* of each line of text is equal to the standard height of */
        !           232:                 /* the font characters (tmHeight), plus the standard       */
        !           233:                 /* amount of spacing (tmExternalLeading) between adjacent  */
        !           234:                 /* lines.                                                  */
        !           235: 
        !           236:                 strcpy (szText, "These characters are being painted using ");
        !           237:                 TextOut (hDC, nDrawX, nDrawY, szText, strlen (szText));
        !           238:                 nDrawY += textmetric.tmExternalLeading + textmetric.tmHeight;
        !           239: 
        !           240:                 strcpy (szText, "the TextOut() function, which is fast and ");
        !           241:                 TextOut (hDC, nDrawX, nDrawY, szText, strlen (szText));
        !           242:                 nDrawY += textmetric.tmExternalLeading + textmetric.tmHeight;
        !           243: 
        !           244:                 strcpy (szText, "allows programmer control of placement and ");
        !           245:                 TextOut (hDC, nDrawX, nDrawY, szText, strlen (szText));
        !           246:                 nDrawY += textmetric.tmExternalLeading + textmetric.tmHeight;
        !           247: 
        !           248:                 strcpy (szText, "formatting details.  However, TextOut() ");
        !           249:                 TextOut (hDC, nDrawX, nDrawY, szText, strlen (szText));
        !           250:                 nDrawY += textmetric.tmExternalLeading + textmetric.tmHeight;
        !           251: 
        !           252:                 strcpy (szText, "does not provide any automatic formatting.");
        !           253:                 TextOut (hDC, nDrawX, nDrawY, szText, strlen (szText));
        !           254:                 nDrawY += textmetric.tmExternalLeading + textmetric.tmHeight;
        !           255: 
        !           256:                 /* Put text in a 5-inch by 1-inch rectangle and display it. */
        !           257:                 /* First define the size of the rectangle around the text   */
        !           258: 
        !           259:                 nDrawY += GetDeviceCaps(hDC, LOGPIXELSY) / 4;  /* 1/4 inch */
        !           260:                 SetRect (
        !           261:                       &rcTextBox
        !           262:                     , nDrawX
        !           263:                     , nDrawY
        !           264:                     , nDrawX + (5 * GetDeviceCaps(hDC, LOGPIXELSX)) /* 5" */
        !           265:                     , nDrawY + (1 * GetDeviceCaps(hDC, LOGPIXELSY)) /* 1" */
        !           266:                 );
        !           267: 
        !           268:                 /* Draw the text within the bounds of the above rectangle */
        !           269: 
        !           270:                 strcpy (szText, "This text is being displayed with a single "
        !           271:                             "call to DrawText().  DrawText() isn't as fast "
        !           272:                             "as TextOut(), and it is somewhat more "
        !           273:                             "constrained, but it provides numerous optional "
        !           274:                             "formatting features, such as the centering and "
        !           275:                             "line breaking used in this example.");
        !           276:                 DrawText (
        !           277:                       hDC
        !           278:                     , szText
        !           279:                     , strlen (szText)
        !           280:                     , &rcTextBox
        !           281:                     , DT_CENTER | DT_EXTERNALLEADING | DT_NOCLIP
        !           282:                                                 | DT_NOPREFIX | DT_WORDBREAK
        !           283:                 );
        !           284:             
        !           285:                 /*  Paint the next object immediately below the bottom of   */
        !           286:                 /*  the above rectangle in which the text was drawn.        */
        !           287: 
        !           288:                 nDrawY = rcTextBox.bottom;
        !           289: 
        !           290:                 /* The (x,y) pixel coordinates of the objects about to be   */
        !           291:                 /* drawn are below, and to the right of, the current        */
        !           292:                 /* coordinate (nDrawX,nDrawY).                              */
        !           293: 
        !           294:                 /* Draw a red rectangle.. */
        !           295: 
        !           296:                 hOldBrush = SelectObject(hDC, hRedBrush);
        !           297:                 Rectangle (
        !           298:                       hDC
        !           299:                     , nDrawX
        !           300:                     , nDrawY
        !           301:                     , nDrawX + 50
        !           302:                     , nDrawY + 30
        !           303:                 );
        !           304: 
        !           305:                 /* Draw a green ellipse */
        !           306: 
        !           307:                 SelectObject(hDC, hGreenBrush);
        !           308:                 Ellipse (
        !           309:                       hDC
        !           310:                     , nDrawX + 150
        !           311:                     , nDrawY
        !           312:                     , nDrawX + 150 + 50
        !           313:                     , nDrawY + 30
        !           314:                 );
        !           315: 
        !           316:                 /* Draw a blue pie shape */
        !           317: 
        !           318:                 SelectObject(hDC, hBlueBrush);
        !           319:                 Pie (
        !           320:                       hDC
        !           321:                     , nDrawX + 300
        !           322:                     , nDrawY
        !           323:                     , nDrawX + 300 + 50
        !           324:                     , nDrawY + 50
        !           325:                     , nDrawX + 300 + 50
        !           326:                     , nDrawY
        !           327:                     , nDrawX + 300 + 50
        !           328:                     , nDrawY + 50
        !           329:                 );
        !           330: 
        !           331:                 nDrawY += 50;
        !           332: 
        !           333:                 /* Restore the old brush */
        !           334: 
        !           335:                 SelectObject(hDC, hOldBrush);
        !           336: 
        !           337:                 /* Select a "---" pen, save the old value */
        !           338: 
        !           339:                 nDrawY += GetDeviceCaps(hDC, LOGPIXELSY) / 4;  /* 1/4 inch */
        !           340:                 hOldPen = SelectObject(hDC, hDashPen);
        !           341: 
        !           342:                 /* Move to a specified point */
        !           343: 
        !           344:                MoveToEx(hDC, nDrawX, nDrawY, NULL );
        !           345: 
        !           346:                 /* Draw a line */
        !           347: 
        !           348:                 LineTo(hDC, nDrawX + 350, nDrawY);
        !           349: 
        !           350:                 /* Select a "..." pen */
        !           351: 
        !           352:                 SelectObject(hDC, hDotPen);
        !           353: 
        !           354:                 /* Draw an arc connecting the line */
        !           355: 
        !           356:                 Arc (
        !           357:                       hDC
        !           358:                     , nDrawX
        !           359:                     , nDrawY - 20
        !           360:                     , nDrawX + 350
        !           361:                     , nDrawY + 20
        !           362:                     , nDrawX
        !           363:                     , nDrawY
        !           364:                     , nDrawX + 350
        !           365:                     , nDrawY
        !           366:                 );
        !           367: 
        !           368:                 /* Restore the old pen */
        !           369: 
        !           370:                 SelectObject(hDC, hOldPen);
        !           371: 
        !           372:                 /* Tell Windows you are done painting */
        !           373: 
        !           374:                 EndPaint (hWnd,  &ps);
        !           375:             }
        !           376:             break;
        !           377: 
        !           378:        case WM_DESTROY:
        !           379:             DeleteObject(hRedBrush);
        !           380:             DeleteObject(hGreenBrush);
        !           381:             DeleteObject(hBlueBrush);
        !           382:             DeleteObject(hDashPen);
        !           383:             DeleteObject(hDotPen);
        !           384:            PostQuitMessage(0);
        !           385:            break;
        !           386: 
        !           387:        default:
        !           388:            return (DefWindowProc(hWnd, message, wParam, lParam));
        !           389:     }
        !           390:     return (NULL);
        !           391: }
        !           392: 
        !           393: 
        !           394: /****************************************************************************
        !           395: 
        !           396:     FUNCTION: About(HWND, unsigned, WORD, LONG)
        !           397: 
        !           398:     PURPOSE:  Processes messages for "About" dialog box
        !           399: 
        !           400:     MESSAGES:
        !           401: 
        !           402:        WM_INITDIALOG - initialize dialog box
        !           403:        WM_COMMAND    - Input received
        !           404: 
        !           405: ****************************************************************************/
        !           406: 
        !           407: BOOL APIENTRY About(
        !           408:     HWND hDlg,
        !           409:     UINT message,
        !           410:     UINT wParam,
        !           411:     LONG lParam)
        !           412: {
        !           413:     switch (message) {
        !           414:        case WM_INITDIALOG:
        !           415:            return (TRUE);
        !           416: 
        !           417:        case WM_COMMAND:
        !           418:            if (LOWORD(wParam) == IDOK
        !           419:                || LOWORD(wParam) == IDCANCEL) {
        !           420:                EndDialog(hDlg, TRUE);
        !           421:                return (TRUE);
        !           422:            }
        !           423:            break;
        !           424:     }
        !           425:     return (FALSE);
        !           426:        UNREFERENCED_PARAMETER(lParam);
        !           427: }

unix.superglobalmegacorp.com

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