|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.