VOID DIALOG_FilePrint(VOID) { DOCINFO di; PRINTDLG printer; SIZE szMetric; int cWidthPels, cHeightPels, border; int xLeft, yTop, pagecount, dopage, copycount; unsigned int i; LOGFONT hdrFont; HFONT font, old_font=0; DWORD size; LPTSTR pTemp; static const TCHAR times_new_roman[] = _T("Times New Roman"); /* Get a small font and print some header info on each page */ ZeroMemory(&hdrFont, sizeof(hdrFont)); hdrFont.lfHeight = 100; hdrFont.lfWeight = FW_BOLD; hdrFont.lfCharSet = ANSI_CHARSET; hdrFont.lfOutPrecision = OUT_DEFAULT_PRECIS; hdrFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; hdrFont.lfQuality = PROOF_QUALITY; hdrFont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; _tcscpy(hdrFont.lfFaceName, times_new_roman); font = CreateFontIndirect(&hdrFont); /* Get Current Settings */ ZeroMemory(&printer, sizeof(printer)); printer.lStructSize = sizeof(printer); printer.hwndOwner = Globals.hMainWnd; printer.hInstance = Globals.hInstance; /* Set some default flags */ printer.Flags = PD_RETURNDC | PD_SELECTION; /* Disable the selection radio button if there is no text selected */ if (!GetSelectionTextLength(Globals.hEdit)) { printer.Flags = printer.Flags | PD_NOSELECTION; } printer.nFromPage = 0; printer.nMinPage = 1; /* we really need to calculate number of pages to set nMaxPage and nToPage */ printer.nToPage = 0; printer.nMaxPage = (WORD)-1; /* Let commdlg manage copy settings */ printer.nCopies = (WORD)PD_USEDEVMODECOPIES; printer.hDevMode = Globals.hDevMode; printer.hDevNames = Globals.hDevNames; if (!PrintDlg(&printer)) { DeleteObject(font); return; } Globals.hDevMode = printer.hDevMode; Globals.hDevNames = printer.hDevNames; assert(printer.hDC != 0); /* initialize DOCINFO */ di.cbSize = sizeof(DOCINFO); di.lpszDocName = Globals.szFileTitle; di.lpszOutput = NULL; di.lpszDatatype = NULL; di.fwType = 0; if (StartDoc(printer.hDC, &di) <= 0) { DeleteObject(font); return; } /* Get the page dimensions in pixels. */ cWidthPels = GetDeviceCaps(printer.hDC, HORZRES); cHeightPels = GetDeviceCaps(printer.hDC, VERTRES); /* Get the file text */ if (printer.Flags & PD_SELECTION) { size = GetSelectionTextLength(Globals.hEdit) + 1; } else { size = GetWindowTextLength(Globals.hEdit) + 1; } pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(TCHAR)); if (!pTemp) { EndDoc(printer.hDC); DeleteObject(font); ShowLastError(); return; } if (printer.Flags & PD_SELECTION) { size = GetSelectionText(Globals.hEdit, pTemp, size); } else { size = GetWindowText(Globals.hEdit, pTemp, size); } border = 150; for (copycount=1; copycount <= printer.nCopies; copycount++) { i = 0; pagecount = 1; do { static const TCHAR letterM[] = _T("M"); if (pagecount >= printer.nFromPage && /* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/ pagecount <= printer.nToPage) dopage = 1; else dopage = 0; old_font = SelectObject(printer.hDC, font); GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); if (dopage) { if (StartPage(printer.hDC) <= 0) { SelectObject(printer.hDC, old_font); EndDoc(printer.hDC); DeleteDC(printer.hDC); HeapFree(GetProcessHeap(), 0, pTemp); DeleteObject(font); AlertPrintError(); return; } /* Write a rectangle and header at the top of each page */ Rectangle(printer.hDC, 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(printer.hDC, border * 2, border + szMetric.cy / 2, Globals.szFileTitle, lstrlen(Globals.szFileTitle)); } /* The starting point for the main text */ xLeft = border * 2; yTop = border + szMetric.cy * 4; SelectObject(printer.hDC, old_font); GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); /* 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(printer.hDC, xLeft, yTop, &pTemp[i], 1); xLeft += szMetric.cx; } } while (i++ < size && yTop < (cHeightPels - border * 2)); if (dopage) EndPage(printer.hDC); pagecount++; } while (i < size); } if (old_font != 0) SelectObject(printer.hDC, old_font); EndDoc(printer.hDC); DeleteDC(printer.hDC); HeapFree(GetProcessHeap(), 0, pTemp); DeleteObject(font); }
VOID DIALOG_FilePrint(VOID) { DOCINFO di; TEXTMETRIC tm; PRINTDLG printer; SIZE szMetric; int border; int xLeft, yTop, pagecount, dopage, copycount; unsigned int i; LOGFONT hdrFont; HFONT font, old_font=0; DWORD size; LPTSTR pTemp; static const TCHAR times_new_roman[] = _T("Times New Roman"); RECT rcPrintRect; /* Get a small font and print some header info on each page */ ZeroMemory(&hdrFont, sizeof(hdrFont)); hdrFont.lfHeight = 100; hdrFont.lfWeight = FW_BOLD; hdrFont.lfCharSet = ANSI_CHARSET; hdrFont.lfOutPrecision = OUT_DEFAULT_PRECIS; hdrFont.lfClipPrecision = CLIP_DEFAULT_PRECIS; hdrFont.lfQuality = PROOF_QUALITY; hdrFont.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN; _tcscpy(hdrFont.lfFaceName, times_new_roman); font = CreateFontIndirect(&hdrFont); /* Get Current Settings */ ZeroMemory(&printer, sizeof(printer)); printer.lStructSize = sizeof(printer); printer.hwndOwner = Globals.hMainWnd; printer.hInstance = Globals.hInstance; /* Set some default flags */ printer.Flags = PD_RETURNDC | PD_SELECTION; /* Disable the selection radio button if there is no text selected */ if (!GetSelectionTextLength(Globals.hEdit)) { printer.Flags = printer.Flags | PD_NOSELECTION; } printer.nFromPage = 0; printer.nMinPage = 1; /* we really need to calculate number of pages to set nMaxPage and nToPage */ printer.nToPage = (WORD)-1; printer.nMaxPage = (WORD)-1; /* Let commdlg manage copy settings */ printer.nCopies = (WORD)PD_USEDEVMODECOPIES; printer.hDevMode = Globals.hDevMode; printer.hDevNames = Globals.hDevNames; if (!PrintDlg(&printer)) { DeleteObject(font); return; } Globals.hDevMode = printer.hDevMode; Globals.hDevNames = printer.hDevNames; assert(printer.hDC != 0); /* initialize DOCINFO */ di.cbSize = sizeof(DOCINFO); di.lpszDocName = Globals.szFileTitle; di.lpszOutput = NULL; di.lpszDatatype = NULL; di.fwType = 0; if (StartDoc(printer.hDC, &di) <= 0) { DeleteObject(font); return; } /* Get the file text */ if (printer.Flags & PD_SELECTION) { size = GetSelectionTextLength(Globals.hEdit) + 1; } else { size = GetWindowTextLength(Globals.hEdit) + 1; } pTemp = HeapAlloc(GetProcessHeap(), 0, size * sizeof(TCHAR)); if (!pTemp) { EndDoc(printer.hDC); DeleteObject(font); ShowLastError(); return; } if (printer.Flags & PD_SELECTION) { size = GetSelectionText(Globals.hEdit, pTemp, size); } else { size = GetWindowText(Globals.hEdit, pTemp, size); } /* Get the current printing area */ rcPrintRect = GetPrintingRect(printer.hDC, Globals.lMargins); /* Ensure that each logical unit maps to one pixel */ SetMapMode(printer.hDC, MM_TEXT); /* Needed to get the correct height of a text line */ GetTextMetrics(printer.hDC, &tm); border = 15; for (copycount=1; copycount <= printer.nCopies; copycount++) { i = 0; pagecount = 1; do { /* Don't start a page if none of the conditions below are true */ dopage = 0; /* The user wants to print the current selection */ if (printer.Flags & PD_SELECTION) { dopage = 1; } /* The user wants to print the entire document */ if (!(printer.Flags & PD_PAGENUMS) && !(printer.Flags & PD_SELECTION)) { dopage = 1; } /* The user wants to print a specified range of pages */ if ((pagecount >= printer.nFromPage && pagecount <= printer.nToPage)) { dopage = 1; } old_font = SelectObject(printer.hDC, font); if (dopage) { if (StartPage(printer.hDC) <= 0) { SelectObject(printer.hDC, old_font); EndDoc(printer.hDC); DeleteDC(printer.hDC); HeapFree(GetProcessHeap(), 0, pTemp); DeleteObject(font); AlertPrintError(); return; } SetViewportOrgEx(printer.hDC, rcPrintRect.left, rcPrintRect.top, NULL); /* Write a rectangle and header at the top of each page */ Rectangle(printer.hDC, border, border, rcPrintRect.right - border, border + tm.tmHeight * 2); /* I don't know what's up with this TextOut command. This comes out kind of mangled. */ TextOut(printer.hDC, border * 2, border + tm.tmHeight / 2, Globals.szFileTitle, lstrlen(Globals.szFileTitle)); } /* The starting point for the main text */ xLeft = 0; yTop = border + tm.tmHeight * 4; SelectObject(printer.hDC, old_font); /* Since outputting strings is giving me problems, output the main * text one character at a time. */ do { if (pTemp[i] == '\n') { xLeft = 0; yTop += tm.tmHeight; } else if (pTemp[i] != '\r') { if (dopage) TextOut(printer.hDC, xLeft, yTop, &pTemp[i], 1); /* We need to get the width for each individual char, since a proportional font may be used */ GetTextExtentPoint32(printer.hDC, &pTemp[i], 1, &szMetric); xLeft += szMetric.cx; /* Insert a line break if the current line does not fit into the printing area */ if (xLeft > rcPrintRect.right) { xLeft = 0; yTop = yTop + tm.tmHeight; } } } while (i++ < size && yTop < rcPrintRect.bottom); if (dopage) EndPage(printer.hDC); pagecount++; } while (i < size); } if (old_font != 0) SelectObject(printer.hDC, old_font); EndDoc(printer.hDC); DeleteDC(printer.hDC); HeapFree(GetProcessHeap(), 0, pTemp); DeleteObject(font); }