Implement printing in notepad.
This commit is contained in:
parent
99cd0de7d9
commit
4eb4c042cc
|
@ -357,134 +357,212 @@ VOID DIALOG_FileSaveAs(VOID)
|
||||||
|
|
||||||
VOID DIALOG_FilePrint(VOID)
|
VOID DIALOG_FilePrint(VOID)
|
||||||
{
|
{
|
||||||
LONG bFlags, nBase;
|
LONG bFlags;
|
||||||
WORD nOffset;
|
DOCINFO di;
|
||||||
DOCINFO di;
|
int nResult;
|
||||||
int nResult;
|
HDC hContext;
|
||||||
HDC hContext;
|
PRINTDLG printer;
|
||||||
PRINTDLG printer;
|
char *pDevNamesSpace;
|
||||||
|
LPDEVNAMES lpDevNames;
|
||||||
|
SIZE szMetric;
|
||||||
|
int cWidthPels, cHeightPels, border;
|
||||||
|
int xLeft, yTop, count, i, pagecount, dopage, copycount;
|
||||||
|
LOGFONT hdrFont;
|
||||||
|
HFONT font, old_font=0;
|
||||||
|
CHAR *pTemp;
|
||||||
|
int size;
|
||||||
|
|
||||||
CHAR szDocumentName[MAX_STRING_LEN]; /* Name of document */
|
CHAR szDocumentName[MAX_STRING_LEN]; /* Name of document */
|
||||||
CHAR szPrinterName[MAX_STRING_LEN]; /* Name of the printer */
|
CHAR szPrinterName[MAX_STRING_LEN]; /* Name of the printer */
|
||||||
CHAR szDeviceName[MAX_STRING_LEN]; /* Name of the printer device */
|
CHAR szDeviceName[MAX_STRING_LEN]; /* Name of the printer device */
|
||||||
CHAR szOutput[MAX_STRING_LEN]; /* in which file/device to print */
|
CHAR szOutput[MAX_STRING_LEN]; /* in which file/device to print */
|
||||||
|
|
||||||
/* LPDEVMODE hDevMode; */
|
strcpy(szDocumentName, Globals.szFileTitle);
|
||||||
/* LPDEVNAMES hDevNames; */
|
count = strlen(szDocumentName);
|
||||||
|
|
||||||
/* hDevMode = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVMODE)); */
|
/* Get a small font and print some header info on each page */
|
||||||
/* hDevNames = GlobalAlloc(GMEM_MOVEABLE + GMEM_ZEROINIT, sizeof(DEVNAMES)); */
|
hdrFont.lfHeight = 100;
|
||||||
|
hdrFont.lfWidth = 0;
|
||||||
|
hdrFont.lfEscapement = 0;
|
||||||
|
hdrFont.lfOrientation = 0;
|
||||||
|
hdrFont.lfWeight = FW_BOLD;
|
||||||
|
hdrFont.lfItalic = 0;
|
||||||
|
hdrFont.lfUnderline = 0;
|
||||||
|
hdrFont.lfStrikeOut = 0;
|
||||||
|
hdrFont.lfCharSet = ANSI_CHARSET;
|
||||||
|
hdrFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
|
||||||
|
hdrFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
||||||
|
hdrFont.lfQuality = PROOF_QUALITY;
|
||||||
|
hdrFont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
|
||||||
|
strcpy(hdrFont.lfFaceName, "Times New Roman");
|
||||||
|
|
||||||
/* Get Current Settings */
|
font = CreateFontIndirect(&hdrFont);
|
||||||
ZeroMemory(&printer, sizeof(printer));
|
|
||||||
printer.lStructSize = sizeof(printer);
|
|
||||||
printer.hwndOwner = Globals.hMainWnd;
|
|
||||||
printer.hInstance = Globals.hInstance;
|
|
||||||
|
|
||||||
nResult = PrintDlg(&printer);
|
/* Get Current Settings */
|
||||||
|
ZeroMemory(&printer, sizeof(printer));
|
||||||
|
printer.lStructSize = sizeof(printer);
|
||||||
|
printer.hwndOwner = Globals.hMainWnd;
|
||||||
|
printer.hInstance = Globals.hInstance;
|
||||||
|
|
||||||
/* hContext = CreateDC(, szDeviceName, "TEST.TXT", 0); */
|
/* Set some default flags */
|
||||||
|
bFlags = PD_RETURNDC + PD_SHOWHELP;
|
||||||
|
if (TRUE) {
|
||||||
|
/* Remove "Print Selection" if there is no selection */
|
||||||
|
bFlags = bFlags + PD_NOSELECTION;
|
||||||
|
}
|
||||||
|
printer.Flags = bFlags;
|
||||||
|
printer.nFromPage = 1;
|
||||||
|
printer.nMinPage = 1;
|
||||||
|
/* we really need to calculate number of pages to set nMaxPage and nToPage */
|
||||||
|
printer.nToPage = 20;
|
||||||
|
printer.nMaxPage = 20;
|
||||||
|
|
||||||
/* Congratulations to those Microsoft Engineers responsible */
|
/* Let commdlg manage copy settings */
|
||||||
/* for the following pointer acrobatics */
|
printer.nCopies = (WORD)PD_USEDEVMODECOPIES;
|
||||||
|
|
||||||
assert(printer.hDevNames!=0);
|
nResult = PrintDlg(&printer);
|
||||||
|
if (printer.hDevNames==0)
|
||||||
|
return;
|
||||||
|
if (!nResult) {
|
||||||
|
MessageBox(Globals.hMainWnd, "PrintDlg failed", "Print Error", MB_ICONEXCLAMATION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hContext = printer.hDC;
|
||||||
|
|
||||||
nBase = (LONG)(printer.hDevNames);
|
pDevNamesSpace = GlobalLock(printer.hDevNames);
|
||||||
|
lpDevNames = (LPDEVNAMES) pDevNamesSpace;
|
||||||
nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wDriverOffset;
|
lstrcpy(szPrinterName, pDevNamesSpace+lpDevNames->wDriverOffset);
|
||||||
lstrcpy(szPrinterName, (LPSTR) (nBase + nOffset));
|
lstrcpy(szDeviceName, pDevNamesSpace+lpDevNames->wDeviceOffset);
|
||||||
|
lstrcpy(szOutput, pDevNamesSpace+lpDevNames->wOutputOffset);
|
||||||
nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wDeviceOffset;
|
GlobalUnlock(printer.hDevNames);
|
||||||
lstrcpy(szDeviceName, (LPSTR) (nBase + nOffset));
|
|
||||||
|
|
||||||
nOffset = (WORD)((LPDEVNAMES) printer.hDevNames)->wOutputOffset;
|
|
||||||
lstrcpy(szOutput, (LPSTR) (nBase + nOffset));
|
|
||||||
|
|
||||||
MessageBox(Globals.hMainWnd, szPrinterName, "Printer Name", MB_ICONEXCLAMATION);
|
|
||||||
MessageBox(Globals.hMainWnd, szDeviceName, "Device Name", MB_ICONEXCLAMATION);
|
|
||||||
MessageBox(Globals.hMainWnd, szOutput, "Output", MB_ICONEXCLAMATION);
|
|
||||||
|
|
||||||
/* Set some default flags */
|
|
||||||
|
|
||||||
bFlags = PD_RETURNDC + PD_SHOWHELP;
|
|
||||||
|
|
||||||
if (TRUE) {
|
|
||||||
/* Remove "Print Selection" if there is no selection */
|
|
||||||
bFlags = bFlags + PD_NOSELECTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
printer.Flags = bFlags;
|
|
||||||
/*
|
/*
|
||||||
printer.nFromPage = 0;
|
MessageBox(Globals.hMainWnd, szPrinterName, "Printer Name", MB_ICONEXCLAMATION);
|
||||||
printer.nToPage = 0;
|
MessageBox(Globals.hMainWnd, szDeviceName, "Device Name", MB_ICONEXCLAMATION);
|
||||||
printer.nMinPage = 0;
|
MessageBox(Globals.hMainWnd, szOutput, "Output", MB_ICONEXCLAMATION);
|
||||||
printer.nMaxPage = 0;
|
|
||||||
*/
|
*/
|
||||||
|
/* initialize DOCINFO */
|
||||||
|
di.cbSize = sizeof(DOCINFO);
|
||||||
|
di.lpszDocName = szDocumentName;
|
||||||
|
di.lpszOutput = szOutput;
|
||||||
|
di.lpszDatatype = (LPTSTR) NULL;
|
||||||
|
di.fwType = 0;
|
||||||
|
|
||||||
/* Let commdlg manage copy settings */
|
/* The default resolution is pixels, ie MM_TEXT */
|
||||||
printer.nCopies = (WORD)PD_USEDEVMODECOPIES;
|
/* SetMapMode(hContext, MM_TWIPS);*/
|
||||||
|
/* SetViewPortExExt(hContext, 10, 10, 0);*/
|
||||||
|
/* SetBkMode(hContext, OPAQUE);*/
|
||||||
|
|
||||||
if (PrintDlg(&printer)) {
|
/* Get the page dimensions in pixels. */
|
||||||
|
cWidthPels = GetDeviceCaps(hContext, HORZRES);
|
||||||
|
cHeightPels = GetDeviceCaps(hContext, VERTRES);
|
||||||
|
|
||||||
/* initialize DOCINFO */
|
/* Get the file text */
|
||||||
di.cbSize = sizeof(DOCINFO);
|
size = GetWindowTextLength(Globals.hEdit);
|
||||||
lstrcpy((LPSTR)di.lpszDocName, szDocumentName);
|
pTemp = (LPSTR) GlobalAlloc(GMEM_FIXED, size);
|
||||||
lstrcpy((LPSTR)di.lpszOutput, szOutput);
|
if (!pTemp)
|
||||||
|
{
|
||||||
|
ShowLastError();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
GetWindowText(Globals.hEdit, pTemp, size);
|
||||||
|
if (!size)
|
||||||
|
{
|
||||||
|
ShowLastError();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
hContext = printer.hDC;
|
/* Okay, let's print */
|
||||||
assert(hContext!=0);
|
nResult = StartDoc(hContext, &di);
|
||||||
assert( (int) hContext!=PD_RETURNDC);
|
if (nResult <= 0) {
|
||||||
|
MessageBox(Globals.hMainWnd, "StartDoc failed", "Print Error", MB_ICONEXCLAMATION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SetMapMode(hContext, MM_LOMETRIC);
|
border = 150;
|
||||||
/* SetViewPortExExt(hContext, 10, 10, 0); */
|
for (copycount=1; copycount <= printer.nCopies; copycount++) {
|
||||||
SetBkMode(hContext, OPAQUE);
|
i = 0;
|
||||||
|
pagecount = 1;
|
||||||
|
do {
|
||||||
|
if (pagecount >= printer.nFromPage &&
|
||||||
|
/* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/
|
||||||
|
pagecount <= printer.nToPage)
|
||||||
|
dopage = 1;
|
||||||
|
else
|
||||||
|
dopage = 0;
|
||||||
|
|
||||||
nResult = TextOut(hContext, 0, 0, " ", 1);
|
old_font = SelectObject(hContext, font);
|
||||||
assert(nResult != 0);
|
GetTextExtentPoint32(hContext, "M", 1, &szMetric);
|
||||||
|
|
||||||
nResult = StartDoc(hContext, &di);
|
if (dopage) {
|
||||||
assert(nResult != SP_ERROR);
|
nResult = StartPage(hContext);
|
||||||
|
if (nResult <= 0) {
|
||||||
|
MessageBox(Globals.hMainWnd, "StartPage failed", "Print Error", MB_ICONEXCLAMATION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Write a rectangle and header at the top of each page */
|
||||||
|
Rectangle(hContext, border, border, cWidthPels-border, border+szMetric.cy*2);
|
||||||
|
/* I don't know what's up with this TextOut command. This comes out
|
||||||
|
kind of mangled.
|
||||||
|
*/
|
||||||
|
TextOut(hContext, border*2, border+szMetric.cy*0.5, szDocumentName, count);
|
||||||
|
}
|
||||||
|
|
||||||
nResult = StartPage(hContext);
|
/* The starting point for the main text */
|
||||||
assert(nResult >0);
|
xLeft = border*2;
|
||||||
|
yTop = border+szMetric.cy*4;
|
||||||
|
|
||||||
/* FIXME: actually print */
|
SelectObject(hContext, old_font);
|
||||||
|
GetTextExtentPoint32(hContext, "M", 1, &szMetric);
|
||||||
|
|
||||||
nResult = EndPage(hContext);
|
/* Since outputting strings is giving me problems, output the main
|
||||||
|
text one character at a time.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
if (pTemp[i] == '\n') {
|
||||||
|
xLeft = border*2;
|
||||||
|
yTop += szMetric.cy;
|
||||||
|
}
|
||||||
|
else if (pTemp[i] != '\r') {
|
||||||
|
if (dopage)
|
||||||
|
TextOut(hContext, xLeft, yTop, &pTemp[i], 1);
|
||||||
|
xLeft += szMetric.cx;
|
||||||
|
}
|
||||||
|
} while (i++<size && yTop<(cHeightPels-border*2));
|
||||||
|
|
||||||
switch (nResult) {
|
if (dopage)
|
||||||
case SP_ERROR:
|
EndPage(hContext);
|
||||||
MessageBox(Globals.hMainWnd, "Generic Error", "Print Engine Error", MB_ICONEXCLAMATION);
|
pagecount++;
|
||||||
break;
|
} while (i<size);
|
||||||
case SP_APPABORT:
|
}
|
||||||
MessageBox(Globals.hMainWnd, "The print job was aborted.", "Print Engine Error", MB_ICONEXCLAMATION);
|
|
||||||
break;
|
|
||||||
case SP_USERABORT:
|
|
||||||
MessageBox(Globals.hMainWnd, "The print job was aborted using the Print Manager ", "Print Engine Error", MB_ICONEXCLAMATION);
|
|
||||||
break;
|
|
||||||
case SP_OUTOFDISK:
|
|
||||||
MessageBox(Globals.hMainWnd, "Out of disk space", "Print Engine Error", MB_ICONEXCLAMATION);
|
|
||||||
break;
|
|
||||||
case SP_OUTOFMEMORY:
|
|
||||||
AlertOutOfMemory();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MessageBox(Globals.hMainWnd, "Default", "Print", MB_ICONEXCLAMATION);
|
|
||||||
} /* switch */
|
|
||||||
nResult = EndDoc(hContext);
|
|
||||||
assert(nResult>=0);
|
|
||||||
nResult = DeleteDC(hContext);
|
|
||||||
assert(nResult!=0);
|
|
||||||
} /* if */
|
|
||||||
|
|
||||||
/* GlobalFree(hDevNames); */
|
switch (nResult) {
|
||||||
/* GlobalFree(hDevMode); */
|
case SP_ERROR:
|
||||||
|
MessageBox(Globals.hMainWnd, "Generic Error", "Print Engine Error", MB_ICONEXCLAMATION);
|
||||||
|
break;
|
||||||
|
case SP_APPABORT:
|
||||||
|
MessageBox(Globals.hMainWnd, "The print job was aborted.", "Print Engine Error", MB_ICONEXCLAMATION);
|
||||||
|
break;
|
||||||
|
case SP_USERABORT:
|
||||||
|
MessageBox(Globals.hMainWnd, "The print job was aborted using the Print Manager ", "Print Engine Error", MB_ICONEXCLAMATION);
|
||||||
|
break;
|
||||||
|
case SP_OUTOFDISK:
|
||||||
|
MessageBox(Globals.hMainWnd, "Out of disk space", "Print Engine Error", MB_ICONEXCLAMATION);
|
||||||
|
break;
|
||||||
|
case SP_OUTOFMEMORY:
|
||||||
|
AlertOutOfMemory();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
} /* switch */
|
||||||
|
nResult = EndDoc(hContext);
|
||||||
|
assert(nResult>=0);
|
||||||
|
nResult = DeleteDC(hContext);
|
||||||
|
assert(nResult!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID DIALOG_FilePageSetup(VOID)
|
VOID DIALOG_FilePageSetup(VOID)
|
||||||
{
|
{
|
||||||
DIALOG_PageSetup();
|
DIALOG_PageSetup();
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID DIALOG_FilePrinterSetup(VOID)
|
VOID DIALOG_FilePrinterSetup(VOID)
|
||||||
|
|
Loading…
Reference in New Issue