Index: base/applications/notepad/dialog.c =================================================================== --- base/applications/notepad/dialog.c (revision 66067) +++ base/applications/notepad/dialog.c (working copy) @@ -606,6 +606,7 @@ VOID DIALOG_FilePrint(VOID) { DOCINFO di; + TEXTMETRIC tm; PRINTDLG printer; SIZE szMetric; int cWidthPels, cHeightPels, border; @@ -648,7 +649,7 @@ printer.nFromPage = 0; printer.nMinPage = 1; /* we really need to calculate number of pages to set nMaxPage and nToPage */ - printer.nToPage = 0; + printer.nToPage = (WORD)-1; printer.nMaxPage = (WORD)-1; /* Let commdlg manage copy settings */ @@ -713,22 +714,39 @@ size = GetWindowText(Globals.hEdit, pTemp, size); } + /* 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 = 150; for (copycount=1; copycount <= printer.nCopies; copycount++) { i = 0; pagecount = 1; do { - static const TCHAR letterM[] = _T("M"); + /* Don't start a page if none of the conditions below are true */ + dopage = 0; - if (pagecount >= printer.nFromPage && - /* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/ - pagecount <= printer.nToPage) + /* The user wants to print the current selection */ + if (printer.Flags & PD_SELECTION) + { dopage = 1; - else - dopage = 0; + } + /* 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); - GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric); if (dopage) { if (StartPage(printer.hDC) <= 0) { @@ -741,13 +759,13 @@ return; } /* Write a rectangle and header at the top of each page */ - Rectangle(printer.hDC, border, border, cWidthPels-border, border+szMetric.cy*2); + Rectangle(printer.hDC, border, border, cWidthPels-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 + szMetric.cy / 2, + border + tm.tmHeight / 2, Globals.szFileTitle, lstrlen(Globals.szFileTitle)); } @@ -754,10 +772,9 @@ /* The starting point for the main text */ xLeft = border * 2; - yTop = border + szMetric.cy * 4; + yTop = border + tm.tmHeight * 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. */ @@ -764,12 +781,22 @@ do { if (pTemp[i] == '\n') { xLeft = border * 2; - yTop += szMetric.cy; + 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 > (cWidthPels - border * 2)) + { + xLeft = border * 2; + yTop = yTop + tm.tmHeight; + } } } while (i++ < size && yTop < (cHeightPels - border * 2));