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