|
|
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: /****************************** Module Header ******************************* ! 13: * Module Name: TPRINT.C ! 14: * ! 15: * Print functions. ! 16: * ! 17: * Functions: ! 18: * ! 19: * gtab_print() ! 20: * gtab_printsetup() ! 21: * gtab_prtwidths() ! 22: * gtab_printjob() ! 23: * AbortProc() ! 24: * AbortDlg() ! 25: * gtab_printpage() ! 26: * gtab_setrects() ! 27: * gtab_printhead() ! 28: * ! 29: * Comments: ! 30: * ! 31: * See table.h for interface description. ! 32: * ! 33: ****************************************************************************/ ! 34: ! 35: #include <string.h> ! 36: #include <windows.h> ! 37: #include <commdlg.h> ! 38: ! 39: #include "gutils.h" ! 40: #include "gutilsrc.h" ! 41: #include "table.h" ! 42: #include "tpriv.h" ! 43: ! 44: /* in tpaint.c, calls GetTextExtentPoint */ ! 45: extern int GetTextExtent(HDC, LPSTR, int); ! 46: ! 47: extern HANDLE hLibInst; ! 48: ! 49: /* function prototypes */ ! 50: lpTable gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap, ! 51: lpPrintContext pcontext); ! 52: BOOL gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext ! 53: pcontext); ! 54: void gtab_printjob(HWND hwnd, lpTable ptab, lpPrintContext pcontext); ! 55: int APIENTRY AbortProc(HDC hpr, int code); ! 56: int APIENTRY AbortDlg(HWND hdlg, UINT msg, UINT wParam, LONG lParam); ! 57: BOOL gtab_printpage(HWND hwnd, lpTable ptab, lpPrintContext pcontext, int page); ! 58: void gtab_setrects(lpPrintContext pcontext, LPRECT rcinner, LPRECT rcouter); ! 59: void gtab_printhead(HWND hwnd, HDC hdc, lpTable ptab, lpTitle head, int page); ! 60: ! 61: ! 62: /*************************************************************************** ! 63: * Function: gtab_print ! 64: * ! 65: * Purpose: ! 66: * ! 67: * Prints a table. ! 68: */ ! 69: void ! 70: gtab_print(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext) ! 71: { ! 72: BOOL fNoContext, fNoMargin, fNoPD; ! 73: lpTable ptab_prt; ! 74: ! 75: fNoContext = FALSE; ! 76: fNoPD = FALSE; ! 77: fNoMargin = FALSE; ! 78: ! 79: if (pcontext == NULL) { ! 80: fNoContext = TRUE; ! 81: pcontext = (lpPrintContext) gmem_get(heap, ! 82: sizeof(PrintContext)); ! 83: pcontext->head = pcontext->foot = NULL; ! 84: pcontext->margin = NULL; ! 85: pcontext->pd = NULL; ! 86: pcontext->id = 0; ! 87: } ! 88: if (pcontext->pd == NULL) { ! 89: fNoPD = TRUE; ! 90: } ! 91: if (pcontext->margin == NULL) { ! 92: fNoMargin = TRUE; ! 93: } ! 94: ptab_prt = gtab_printsetup(hwnd, ptab, heap, pcontext); ! 95: ! 96: if (ptab_prt != NULL) { ! 97: gtab_printjob(hwnd, ptab_prt, pcontext); ! 98: ! 99: gtab_deltable(hwnd, ptab_prt); ! 100: } ! 101: if (fNoMargin) { ! 102: gmem_free(heap, (LPSTR)pcontext->margin, ! 103: sizeof(Margin)); ! 104: pcontext->margin = NULL; ! 105: } ! 106: if (fNoPD) { ! 107: if (pcontext->pd->hDevMode != NULL) { ! 108: GlobalFree(pcontext->pd->hDevMode); ! 109: } ! 110: if (pcontext->pd->hDevNames != NULL) { ! 111: GlobalFree(pcontext->pd->hDevNames); ! 112: } ! 113: gmem_free(heap, (LPSTR) pcontext->pd, sizeof(PRINTDLG)); ! 114: pcontext->pd = NULL; ! 115: } ! 116: if (fNoContext) { ! 117: gmem_free(heap, (LPSTR) pcontext, sizeof(PrintContext)); ! 118: } ! 119: } ! 120: ! 121: ! 122: ! 123: /*************************************************************************** ! 124: * Function: gtab_printsetup ! 125: * ! 126: * Purpose: ! 127: * ! 128: * Sets up printercontext - builds lpTable for printer, incl. sizing ! 129: * and initialises pcontext fields that may be null. ! 130: */ ! 131: lpTable ! 132: gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext) ! 133: { ! 134: lpTable pprttab; ! 135: PRINTDLG FAR * pd; ! 136: int ncols, i; ! 137: ColPropsList cplist; ! 138: ! 139: /* set fields for context that user left null */ ! 140: if (pcontext->margin == NULL) { ! 141: pcontext->margin = (lpMargin) gmem_get(heap, sizeof(Margin)); ! 142: if (pcontext->margin == NULL) { ! 143: return(NULL); ! 144: } ! 145: pcontext->margin->left = 10; ! 146: pcontext->margin->right = 10; ! 147: pcontext->margin->top = 15; ! 148: pcontext->margin->bottom = 15; ! 149: pcontext->margin->topinner = 15; ! 150: pcontext->margin->bottominner = 15; ! 151: } ! 152: ! 153: if (pcontext->pd == NULL) { ! 154: pd = (PRINTDLG FAR *) gmem_get(heap, sizeof(PRINTDLG)); ! 155: if (pd == NULL) { ! 156: return(NULL); ! 157: } ! 158: pcontext->pd = pd; ! 159: ! 160: pd->lStructSize = sizeof(PRINTDLG); ! 161: pd->hwndOwner = hwnd; ! 162: pd->hDevMode = (HANDLE) NULL; ! 163: pd->hDevNames = (HANDLE) NULL; ! 164: pd->Flags = PD_RETURNDC|PD_RETURNDEFAULT; ! 165: ! 166: if (PrintDlg(pd) == FALSE) { ! 167: return(NULL); ! 168: } ! 169: } ! 170: ! 171: /* now create a Table struct by querying the owner */ ! 172: pprttab = (lpTable) gmem_get(heap, sizeof(Table)); ! 173: ! 174: if (pprttab == NULL) { ! 175: return(NULL); ! 176: } ! 177: pprttab->hdr = ptab->hdr; ! 178: ! 179: /* get the row/column count from owner window */ ! 180: if (pcontext->id == 0) { ! 181: pprttab->hdr.id = ptab->hdr.id; ! 182: } else { ! 183: pprttab->hdr.id = pcontext->id; ! 184: } ! 185: pprttab->hdr.props.valid = 0; ! 186: pprttab->hdr.sendscroll = FALSE; ! 187: if (gtab_sendtq(hwnd, TQ_GETSIZE, (long) (LPSTR)&pprttab->hdr) == FALSE) { ! 188: return(NULL); ! 189: } ! 190: ! 191: /* alloc and init the col data structs */ ! 192: ncols = pprttab->hdr.ncols; ! 193: pprttab->pcolhdr = (lpColProps) gmem_get(heap, sizeof(ColProps) * ncols); ! 194: if (pprttab->pcolhdr == NULL) { ! 195: gmem_free(heap, (LPSTR)pprttab, sizeof(Table)); ! 196: return(NULL); ! 197: } ! 198: ! 199: /* init col properties to default */ ! 200: for (i=0; i < ncols; i++) { ! 201: pprttab->pcolhdr[i].props.valid = 0; ! 202: pprttab->pcolhdr[i].nchars = 0; ! 203: } ! 204: /* get the column props from owner */ ! 205: cplist.plist = pprttab->pcolhdr; ! 206: cplist.id = pprttab->hdr.id; ! 207: cplist.startcol = 0; ! 208: cplist.ncols = ncols; ! 209: gtab_sendtq(hwnd, TQ_GETCOLPROPS, (long) (LPSTR)&cplist); ! 210: ! 211: ! 212: pprttab->scrollscale = 1; ! 213: pprttab->pcellpos = (lpCellPos) gmem_get(heap, ! 214: sizeof(CellPos) * ptab->hdr.ncols); ! 215: if (pprttab->pcellpos == NULL) { ! 216: gmem_free(heap, (LPSTR) pprttab->pcolhdr, sizeof(ColProps) * ncols); ! 217: gmem_free(heap, (LPSTR)pprttab, sizeof(Table)); ! 218: return(NULL); ! 219: } ! 220: ! 221: ! 222: pprttab->pdata = NULL; ! 223: pprttab->nlines = 0; ! 224: ! 225: if (!gtab_prtwidths(hwnd, pprttab, heap, pcontext)) { ! 226: gmem_free(heap, (LPSTR)pprttab->pcellpos, ! 227: sizeof(CellPos) * ptab->hdr.ncols); ! 228: gmem_free(heap, (LPSTR)pprttab, sizeof(Table)); ! 229: return(NULL); ! 230: } ! 231: return(pprttab); ! 232: } ! 233: ! 234: ! 235: /*************************************************************************** ! 236: * Function: gtab_prtwidths ! 237: * ! 238: * Purpose: ! 239: * ! 240: * Calc the height/width settings and alloc line data ! 241: */ ! 242: BOOL ! 243: gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext) ! 244: { ! 245: TEXTMETRIC tm; ! 246: int cx, cxtotal, i, curx, cury; ! 247: lpProps hdrprops, cellprops; ! 248: lpCellPos xpos, ypos; ! 249: RECT rcinner, rcouter; ! 250: ! 251: hdrprops = &ptab->hdr.props; ! 252: GetTextMetrics(pcontext->pd->hDC, &tm); ! 253: ptab->avewidth = tm.tmAveCharWidth; ! 254: ptab->rowheight = tm.tmHeight + tm.tmExternalLeading; ! 255: if (hdrprops->valid & P_HEIGHT) { ! 256: ptab->rowheight = hdrprops->height; ! 257: } ! 258: ! 259: /* set sizes for headers */ ! 260: gtab_setrects(pcontext, &rcinner, &rcouter); ! 261: ! 262: /* set width/pos for each col. */ ! 263: cxtotal = 0; ! 264: curx = rcinner.left; ! 265: for (i = 0; i < ptab->hdr.ncols; i++) { ! 266: cellprops = &ptab->pcolhdr[i].props; ! 267: xpos = &ptab->pcellpos[i]; ! 268: ! 269: if (cellprops->valid & P_WIDTH) { ! 270: cx = cellprops->width; ! 271: } else if (hdrprops->valid & P_WIDTH) { ! 272: cx = hdrprops->width; ! 273: } else { ! 274: cx = ptab->pcolhdr[i].nchars + 1; ! 275: cx *= ptab->avewidth; ! 276: } ! 277: /* add 2 for intercol spacing */ ! 278: cx += 2; ! 279: ! 280: xpos->size = cx; ! 281: xpos->start = curx + 1; ! 282: xpos->clipstart = xpos->start; ! 283: xpos->clipend = xpos->start + xpos->size - 2; ! 284: xpos->clipend = min(xpos->clipend, rcinner.right); ! 285: ! 286: cxtotal += xpos->size; ! 287: curx += xpos->size; ! 288: } ! 289: ptab->rowwidth = cxtotal; ! 290: ! 291: if(pcontext->head != NULL) { ! 292: xpos = &pcontext->head->xpos; ! 293: ypos = &pcontext->head->ypos; ! 294: ! 295: xpos->start = rcouter.left + 1; ! 296: xpos->clipstart = rcouter.left + 1; ! 297: xpos->clipend = rcouter.right - 1; ! 298: xpos->size = rcouter.right - rcouter.left; ! 299: ! 300: ypos->start = rcouter.top; ! 301: ypos->clipstart = rcouter.top; ! 302: ypos->clipend = rcinner.top; ! 303: ypos->size = ptab->rowheight; ! 304: } ! 305: ! 306: if (pcontext->foot != NULL) { ! 307: xpos = &pcontext->foot->xpos; ! 308: ypos = &pcontext->foot->ypos; ! 309: ! 310: xpos->start = rcouter.left + 1; ! 311: xpos->clipstart = rcouter.left + 1; ! 312: xpos->clipend = rcouter.right - 1; ! 313: xpos->size = rcouter.right - rcouter.left; ! 314: ! 315: ypos->start = rcouter.bottom - ptab->rowheight; ! 316: ypos->clipstart = rcinner.bottom; ! 317: ypos->clipend = rcouter.bottom; ! 318: ypos->size = ptab->rowheight; ! 319: } ! 320: ! 321: /* set nr of lines per page */ ! 322: ptab->nlines = (rcinner.bottom - rcinner.top) / ptab->rowheight; ! 323: if (!gtab_alloclinedata(hwnd, heap, ptab)) { ! 324: return(FALSE); ! 325: } ! 326: /* set line positions */ ! 327: cury = rcinner.top; ! 328: for (i = 0; i < ptab->nlines; i++) { ! 329: ypos = &ptab->pdata[i].linepos; ! 330: ypos->start = cury; ! 331: ypos->clipstart = ypos->start; ! 332: ypos->clipend = ypos->start + ypos->size; ! 333: ypos->clipend = min(ypos->clipend, rcinner.bottom); ! 334: cury += ypos->size; ! 335: } ! 336: return(TRUE); ! 337: } ! 338: ! 339: ! 340: /* static information for this module */ ! 341: BOOL bAbort; ! 342: FARPROC lpAbortProc; ! 343: DLGPROC lpAbortDlg; ! 344: HWND hAbortWnd; ! 345: int npage; ! 346: int pages; ! 347: ! 348: /*************************************************************************** ! 349: * Function: gtab_printjob ! 350: * ! 351: * Purpose: ! 352: * ! 353: * Sets up print job and dialogs ! 354: */ ! 355: void ! 356: gtab_printjob(HWND hwnd, lpTable ptab, lpPrintContext pcontext) ! 357: { ! 358: int moveables; ! 359: int endpage; ! 360: int startpage = 1; ! 361: HDC hpr; ! 362: int status; ! 363: HANDLE hcurs; ! 364: static char str[256]; ! 365: DOCINFO di; ! 366: ! 367: hcurs = SetCursor(LoadCursor(NULL, IDC_WAIT)); ! 368: ! 369: moveables = ptab->nlines - ptab->hdr.fixedrows; ! 370: pages = (int) (ptab->hdr.nrows - ptab->hdr.fixedrows + moveables - 1) ! 371: / moveables; ! 372: endpage = pages; ! 373: ! 374: if (pcontext->pd->Flags & PD_PAGENUMS) { ! 375: startpage = pcontext->pd->nFromPage; ! 376: endpage = pcontext->pd->nToPage; ! 377: } ! 378: hpr = pcontext->pd->hDC; ! 379: ! 380: lpAbortDlg = (DLGPROC) MakeProcInstance((WNDPROC) AbortDlg, hLibInst); ! 381: lpAbortProc = (FARPROC) MakeProcInstance((WNDPROC)AbortProc, hLibInst); ! 382: ! 383: SetAbortProc(hpr, (ABORTPROC) lpAbortProc); ! 384: ! 385: di.lpszDocName = "Table"; ! 386: di.cbSize = lstrlen(di.lpszDocName); ! 387: di.lpszOutput = NULL; ! 388: ! 389: StartDoc(hpr, &di); ! 390: ! 391: bAbort = FALSE; ! 392: ! 393: /* add abort modeless dialog later!! */ ! 394: hAbortWnd = CreateDialog(hLibInst, "GABRTDLG", hwnd, lpAbortDlg); ! 395: if (hAbortWnd != NULL) { ! 396: ShowWindow(hAbortWnd, SW_NORMAL); ! 397: EnableWindow(hwnd, FALSE); ! 398: } ! 399: SetCursor(hcurs); ! 400: ! 401: ! 402: for (npage = startpage; npage<=endpage; npage++) { ! 403: wsprintf(str, "Page %d of %d pages", npage, pages); ! 404: SetDlgItemText(hAbortWnd, IDC_LPAGENR, str); ! 405: status = gtab_printpage(hwnd, ptab, pcontext, npage); ! 406: if (status < 0) { ! 407: AbortDoc(hpr); ! 408: break; ! 409: } ! 410: } ! 411: if (status >= 0) { ! 412: EndDoc(hpr); ! 413: } ! 414: ! 415: if (hAbortWnd != NULL) { ! 416: EnableWindow(hwnd, TRUE); ! 417: DestroyWindow(hAbortWnd); ! 418: } ! 419: FreeProcInstance((WNDPROC) lpAbortDlg); ! 420: FreeProcInstance(lpAbortProc); ! 421: ! 422: DeleteDC(hpr); ! 423: } ! 424: ! 425: /*************************************************************************** ! 426: * Function: AbortProc ! 427: * ! 428: * Purpose: ! 429: * ! 430: * Abort procedure for print job ! 431: */ ! 432: int APIENTRY ! 433: AbortProc(HDC hpr, int code) ! 434: { ! 435: ! 436: MSG msg; ! 437: ! 438: if (!hAbortWnd) { ! 439: return(TRUE); ! 440: } ! 441: while (!bAbort && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ! 442: if (!IsDialogMessage(hAbortWnd, &msg)) { ! 443: TranslateMessage(&msg); ! 444: DispatchMessage(&msg); ! 445: } ! 446: } ! 447: return(!bAbort); ! 448: } ! 449: ! 450: /*************************************************************************** ! 451: * Function: AbortDlg ! 452: * ! 453: * Purpose: ! 454: * ! 455: * Dialog for abort procedure ! 456: */ ! 457: int APIENTRY ! 458: AbortDlg(HWND hdlg, UINT msg, UINT wParam, LONG lParam) ! 459: { ! 460: switch(msg) { ! 461: ! 462: case WM_COMMAND: ! 463: bAbort = TRUE; ! 464: EndDialog(hdlg, TRUE); ! 465: return TRUE; ! 466: ! 467: case WM_INITDIALOG: ! 468: return TRUE; ! 469: } ! 470: return(FALSE); ! 471: } ! 472: ! 473: /*************************************************************************** ! 474: * Function: gtab_printpage ! 475: * ! 476: * Purpose: ! 477: * ! 478: * Print a single page. page number is 1-based ! 479: */ ! 480: BOOL ! 481: gtab_printpage(HWND hwnd, lpTable ptab, lpPrintContext pcontext, int page) ! 482: { ! 483: HDC hpr; ! 484: int moveables, i; ! 485: int x1, y1, x2, y2; ! 486: ! 487: hpr = pcontext->pd->hDC; ! 488: StartPage(hpr); ! 489: ! 490: moveables = ptab->nlines - ptab->hdr.fixedrows; ! 491: ptab->toprow = moveables * (page-1); ! 492: gtab_invallines(hwnd, ptab, ptab->hdr.fixedrows, moveables); ! 493: ! 494: for (i =0; i < ptab->nlines; i++) { ! 495: gtab_paint(hwnd, hpr, ptab, i); ! 496: } ! 497: if ((ptab->hdr.vseparator) && (ptab->hdr.fixedcols > 0)) { ! 498: x1 = ptab->pcellpos[ptab->hdr.fixedcols -1].clipend+1; ! 499: y1 = ptab->pdata[0].linepos.clipstart; ! 500: y2 = ptab->pdata[ptab->nlines-1].linepos.clipend; ! 501: MoveToEx(hpr, x1, y1, NULL); ! 502: LineTo(hpr, x1, y2); ! 503: } ! 504: if ((ptab->hdr.hseparator) && (ptab->hdr.fixedrows > 0)) { ! 505: y1 = ptab->pdata[ptab->hdr.fixedrows-1].linepos.clipend; ! 506: x1 = ptab->pcellpos[0].clipstart; ! 507: x2 = ptab->pcellpos[ptab->hdr.ncols-1].clipend; ! 508: MoveToEx(hpr, x1, y1, NULL); ! 509: LineTo(hpr, x2, y1); ! 510: } ! 511: ! 512: if (pcontext->head != NULL) { ! 513: gtab_printhead(hwnd, hpr, ptab, pcontext->head, page); ! 514: } ! 515: if (pcontext->foot != NULL) { ! 516: gtab_printhead(hwnd, hpr, ptab, pcontext->foot, page); ! 517: } ! 518: ! 519: return(EndPage(hpr)); ! 520: } ! 521: ! 522: ! 523: /*************************************************************************** ! 524: * Function: gtab_setrects ! 525: * ! 526: * Purpose: ! 527: * ! 528: * Calculate the outline positions in pixels for the headers ! 529: * (outer rect) and for the page itself (inner rect). Based on ! 530: * page size and PrintContext margin info (which is in millimetres). ! 531: */ ! 532: void ! 533: gtab_setrects(lpPrintContext pcontext, LPRECT rcinner, LPRECT rcouter) ! 534: { ! 535: HDC hpr; ! 536: int hpixels, hmms; ! 537: int vpixels, vmms; ! 538: int h_pixpermm, v_pixpermm; ! 539: ! 540: hpr = pcontext->pd->hDC; ! 541: hpixels = GetDeviceCaps(hpr, HORZRES); ! 542: vpixels = GetDeviceCaps(hpr, VERTRES); ! 543: vmms = GetDeviceCaps(hpr, VERTSIZE); ! 544: hmms = GetDeviceCaps(hpr, HORZSIZE); ! 545: ! 546: h_pixpermm = hpixels / hmms; ! 547: v_pixpermm = vpixels / vmms; ! 548: ! 549: rcouter->top = (pcontext->margin->top * v_pixpermm); ! 550: rcouter->bottom = vpixels - (pcontext->margin->bottom * v_pixpermm); ! 551: rcouter->left = (pcontext->margin->left * h_pixpermm); ! 552: rcouter->right = hpixels - (pcontext->margin->right * h_pixpermm); ! 553: ! 554: rcinner->left = rcouter->left; ! 555: rcinner->right = rcouter->right; ! 556: rcinner->top = rcouter->top + ! 557: (pcontext->margin->topinner * v_pixpermm); ! 558: rcinner->bottom = rcouter->bottom - ! 559: (pcontext->margin->bottominner * v_pixpermm); ! 560: } ! 561: ! 562: ! 563: /*************************************************************************** ! 564: * Function: gtab_printhead ! 565: * ! 566: * Purpose: ! 567: * ! 568: * Print header information ! 569: */ ! 570: void ! 571: gtab_printhead(HWND hwnd, HDC hdc, lpTable ptab, lpTitle head, int page) ! 572: { ! 573: RECT rc, rcbox; ! 574: int i, cx, x, y, tab; ! 575: UINT align; ! 576: LPSTR chp, tabp; ! 577: DWORD fcol, bkcol; ! 578: char str[256]; ! 579: ! 580: rc.top = head->ypos.clipstart; ! 581: rc.bottom = head->ypos.clipend; ! 582: rc.left = head->xpos.clipstart; ! 583: rc.right = head->xpos.clipend; ! 584: ! 585: /* update page number */ ! 586: chp = str; ! 587: for (i = 0; i < lstrlen(head->ptext); i++) { ! 588: switch(head->ptext[i]) { ! 589: ! 590: case '#': ! 591: chp += wsprintf(chp, "%d", page); ! 592: break; ! 593: ! 594: case '$': ! 595: chp += wsprintf(chp, "%d", pages); ! 596: break; ! 597: ! 598: default: ! 599: *chp++ = head->ptext[i]; ! 600: break; ! 601: } ! 602: } ! 603: *chp = '\0'; ! 604: chp = str; ! 605: ! 606: if (head->props.valid & P_ALIGN) { ! 607: align = head->props.alignment; ! 608: } else { ! 609: align = P_LEFT; ! 610: } ! 611: ! 612: /* set colours if not default */ ! 613: if (head->props.valid & P_FCOLOUR) { ! 614: fcol = SetTextColor(hdc, head->props.forecolour); ! 615: } ! 616: if (head->props.valid & P_BCOLOUR) { ! 617: bkcol = SetBkColor(hdc, head->props.backcolour); ! 618: } ! 619: ! 620: /* calc offset of text within cell for right-align or centering */ ! 621: if (align == P_LEFT) { ! 622: cx = ptab->avewidth/2; ! 623: } else { ! 624: cx = LOWORD(GetTextExtent(hdc, chp, lstrlen(chp))); ! 625: if (align == P_CENTRE) { ! 626: cx = (head->xpos.size - cx) / 2; ! 627: } else { ! 628: cx = head->xpos.size - cx - (ptab->avewidth/2); ! 629: } ! 630: } ! 631: cx += head->xpos.start; ! 632: ! 633: /* expand tabs on output */ ! 634: tab = ptab->avewidth * 8; ! 635: x = 0; ! 636: y = head->ypos.start; ! 637: ! 638: for ( ; (tabp = strchr(chp, '\t')) != NULL; ) { ! 639: /* perform output upto tab char */ ! 640: ExtTextOut(hdc, x+cx, y, ETO_CLIPPED, &rc, chp, tabp-chp, NULL); ! 641: ! 642: /* advance past the tab */ ! 643: x += LOWORD(GetTextExtent(hdc, chp, tabp - chp)); ! 644: x = ( (x + tab) / tab) * tab; ! 645: chp = ++tabp; ! 646: } ! 647: ! 648: /*no more tabs - output rest of string */ ! 649: ExtTextOut(hdc, x+cx, y, ETO_CLIPPED, &rc, chp, lstrlen(chp), NULL); ! 650: ! 651: /* reset colours to original if not default */ ! 652: if (head->props.valid & P_FCOLOUR) { ! 653: SetTextColor(hdc, fcol); ! 654: } ! 655: if (head->props.valid & P_BCOLOUR) { ! 656: SetBkColor(hdc, bkcol); ! 657: } ! 658: ! 659: /* now box cell if marked */ ! 660: if (head->props.valid & P_BOX) { ! 661: if (head->props.box != 0) { ! 662: rcbox.top = head->ypos.start; ! 663: rcbox.bottom = rcbox.top + head->ypos.size; ! 664: rcbox.left = head->xpos.start; ! 665: rcbox.right = rcbox.left + head->xpos.size; ! 666: gtab_boxcell(hwnd, hdc, &rcbox, &rc, head->props.box); ! 667: } ! 668: } ! 669: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.