📄 tprint.c
字号:
/****************************** Module Header *******************************
* Module Name: TPRINT.C
*
* Print functions.
*
* Functions:
*
* gtab_print()
* gtab_printsetup()
* gtab_prtwidths()
* gtab_printjob()
* AbortProc()
* AbortDlg()
* gtab_printpage()
* gtab_setrects()
* gtab_printhead()
*
* Comments:
*
* See table.h for interface description.
*
****************************************************************************/
#include <string.h>
#include <windows.h>
#include <commdlg.h>
#include "gutils.h"
#include "gutilsrc.h"
#include "table.h"
#include "tpriv.h"
/* in tpaint.c, calls GetTextExtentPoint */
extern int GetTextExtent(HDC, LPSTR, int);
extern HANDLE hLibInst;
/* function prototypes */
lpTable gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap,
lpPrintContext pcontext);
BOOL gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext
pcontext);
void gtab_printjob(HWND hwnd, lpTable ptab, lpPrintContext pcontext);
int APIENTRY AbortProc(HDC hpr, int code);
int APIENTRY AbortDlg(HWND hdlg, UINT msg, UINT wParam, LONG lParam);
BOOL gtab_printpage(HWND hwnd, lpTable ptab, lpPrintContext pcontext, int page);
void gtab_setrects(lpPrintContext pcontext, LPRECT rcinner, LPRECT rcouter);
void gtab_printhead(HWND hwnd, HDC hdc, lpTable ptab, lpTitle head, int page);
/***************************************************************************
* Function: gtab_print
*
* Purpose:
*
* Prints a table.
*/
void
gtab_print(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
{
BOOL fNoContext, fNoMargin, fNoPD;
lpTable ptab_prt;
fNoContext = FALSE;
fNoPD = FALSE;
fNoMargin = FALSE;
if (pcontext == NULL) {
fNoContext = TRUE;
pcontext = (lpPrintContext) gmem_get(heap,
sizeof(PrintContext));
pcontext->head = pcontext->foot = NULL;
pcontext->margin = NULL;
pcontext->pd = NULL;
pcontext->id = 0;
}
if (pcontext->pd == NULL) {
fNoPD = TRUE;
}
if (pcontext->margin == NULL) {
fNoMargin = TRUE;
}
ptab_prt = gtab_printsetup(hwnd, ptab, heap, pcontext);
if (ptab_prt != NULL) {
gtab_printjob(hwnd, ptab_prt, pcontext);
gtab_deltable(hwnd, ptab_prt);
}
if (fNoMargin) {
gmem_free(heap, (LPSTR)pcontext->margin,
sizeof(Margin));
pcontext->margin = NULL;
}
if (fNoPD) {
if (pcontext->pd->hDevMode != NULL) {
GlobalFree(pcontext->pd->hDevMode);
}
if (pcontext->pd->hDevNames != NULL) {
GlobalFree(pcontext->pd->hDevNames);
}
gmem_free(heap, (LPSTR) pcontext->pd, sizeof(PRINTDLG));
pcontext->pd = NULL;
}
if (fNoContext) {
gmem_free(heap, (LPSTR) pcontext, sizeof(PrintContext));
}
}
/***************************************************************************
* Function: gtab_printsetup
*
* Purpose:
*
* Sets up printercontext - builds lpTable for printer, incl. sizing
* and initialises pcontext fields that may be null.
*/
lpTable
gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
{
lpTable pprttab;
PRINTDLG FAR * pd;
int ncols, i;
ColPropsList cplist;
/* set fields for context that user left null */
if (pcontext->margin == NULL) {
pcontext->margin = (lpMargin) gmem_get(heap, sizeof(Margin));
if (pcontext->margin == NULL) {
return(NULL);
}
pcontext->margin->left = 10;
pcontext->margin->right = 10;
pcontext->margin->top = 15;
pcontext->margin->bottom = 15;
pcontext->margin->topinner = 15;
pcontext->margin->bottominner = 15;
}
if (pcontext->pd == NULL) {
pd = (PRINTDLG FAR *) gmem_get(heap, sizeof(PRINTDLG));
if (pd == NULL) {
return(NULL);
}
pcontext->pd = pd;
pd->lStructSize = sizeof(PRINTDLG);
pd->hwndOwner = hwnd;
pd->hDevMode = (HANDLE) NULL;
pd->hDevNames = (HANDLE) NULL;
pd->Flags = PD_RETURNDC|PD_RETURNDEFAULT;
if (PrintDlg(pd) == FALSE) {
return(NULL);
}
}
/* now create a Table struct by querying the owner */
pprttab = (lpTable) gmem_get(heap, sizeof(Table));
if (pprttab == NULL) {
return(NULL);
}
pprttab->hdr = ptab->hdr;
/* get the row/column count from owner window */
if (pcontext->id == 0) {
pprttab->hdr.id = ptab->hdr.id;
} else {
pprttab->hdr.id = pcontext->id;
}
pprttab->hdr.props.valid = 0;
pprttab->hdr.sendscroll = FALSE;
if (gtab_sendtq(hwnd, TQ_GETSIZE, (long) (LPSTR)&pprttab->hdr) == FALSE) {
return(NULL);
}
/* alloc and init the col data structs */
ncols = pprttab->hdr.ncols;
pprttab->pcolhdr = (lpColProps) gmem_get(heap, sizeof(ColProps) * ncols);
if (pprttab->pcolhdr == NULL) {
gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
return(NULL);
}
/* init col properties to default */
for (i=0; i < ncols; i++) {
pprttab->pcolhdr[i].props.valid = 0;
pprttab->pcolhdr[i].nchars = 0;
}
/* get the column props from owner */
cplist.plist = pprttab->pcolhdr;
cplist.id = pprttab->hdr.id;
cplist.startcol = 0;
cplist.ncols = ncols;
gtab_sendtq(hwnd, TQ_GETCOLPROPS, (long) (LPSTR)&cplist);
pprttab->scrollscale = 1;
pprttab->pcellpos = (lpCellPos) gmem_get(heap,
sizeof(CellPos) * ptab->hdr.ncols);
if (pprttab->pcellpos == NULL) {
gmem_free(heap, (LPSTR) pprttab->pcolhdr, sizeof(ColProps) * ncols);
gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
return(NULL);
}
pprttab->pdata = NULL;
pprttab->nlines = 0;
if (!gtab_prtwidths(hwnd, pprttab, heap, pcontext)) {
gmem_free(heap, (LPSTR)pprttab->pcellpos,
sizeof(CellPos) * ptab->hdr.ncols);
gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
return(NULL);
}
return(pprttab);
}
/***************************************************************************
* Function: gtab_prtwidths
*
* Purpose:
*
* Calc the height/width settings and alloc line data
*/
BOOL
gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
{
TEXTMETRIC tm;
int cx, cxtotal, i, curx, cury;
lpProps hdrprops, cellprops;
lpCellPos xpos, ypos;
RECT rcinner, rcouter;
hdrprops = &ptab->hdr.props;
GetTextMetrics(pcontext->pd->hDC, &tm);
ptab->avewidth = tm.tmAveCharWidth;
ptab->rowheight = tm.tmHeight + tm.tmExternalLeading;
if (hdrprops->valid & P_HEIGHT) {
ptab->rowheight = hdrprops->height;
}
/* set sizes for headers */
gtab_setrects(pcontext, &rcinner, &rcouter);
/* set width/pos for each col. */
cxtotal = 0;
curx = rcinner.left;
for (i = 0; i < ptab->hdr.ncols; i++) {
cellprops = &ptab->pcolhdr[i].props;
xpos = &ptab->pcellpos[i];
if (cellprops->valid & P_WIDTH) {
cx = cellprops->width;
} else if (hdrprops->valid & P_WIDTH) {
cx = hdrprops->width;
} else {
cx = ptab->pcolhdr[i].nchars + 1;
cx *= ptab->avewidth;
}
/* add 2 for intercol spacing */
cx += 2;
xpos->size = cx;
xpos->start = curx + 1;
xpos->clipstart = xpos->start;
xpos->clipend = xpos->start + xpos->size - 2;
xpos->clipend = min(xpos->clipend, rcinner.right);
cxtotal += xpos->size;
curx += xpos->size;
}
ptab->rowwidth = cxtotal;
if(pcontext->head != NULL) {
xpos = &pcontext->head->xpos;
ypos = &pcontext->head->ypos;
xpos->start = rcouter.left + 1;
xpos->clipstart = rcouter.left + 1;
xpos->clipend = rcouter.right - 1;
xpos->size = rcouter.right - rcouter.left;
ypos->start = rcouter.top;
ypos->clipstart = rcouter.top;
ypos->clipend = rcinner.top;
ypos->size = ptab->rowheight;
}
if (pcontext->foot != NULL) {
xpos = &pcontext->foot->xpos;
ypos = &pcontext->foot->ypos;
xpos->start = rcouter.left + 1;
xpos->clipstart = rcouter.left + 1;
xpos->clipend = rcouter.right - 1;
xpos->size = rcouter.right - rcouter.left;
ypos->start = rcouter.bottom - ptab->rowheight;
ypos->clipstart = rcinner.bottom;
ypos->clipend = rcouter.bottom;
ypos->size = ptab->rowheight;
}
/* set nr of lines per page */
ptab->nlines = (rcinner.bottom - rcinner.top) / ptab->rowheight;
if (!gtab_alloclinedata(hwnd, heap, ptab)) {
return(FALSE);
}
/* set line positions */
cury = rcinner.top;
for (i = 0; i < ptab->nlines; i++) {
ypos = &ptab->pdata[i].linepos;
ypos->start = cury;
ypos->clipstart = ypos->start;
ypos->clipend = ypos->start + ypos->size;
ypos->clipend = min(ypos->clipend, rcinner.bottom);
cury += ypos->size;
}
return(TRUE);
}
/* static information for this module */
BOOL bAbort;
FARPROC lpAbortProc;
DLGPROC lpAbortDlg;
HWND hAbortWnd;
int npage;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -