[NOTEPAD] Printer output improvements by Ricardo Hanke. See CORE-9088 for more details.

svn path=/trunk/; revision=67890
This commit is contained in:
Amine Khaldi 2015-05-24 20:37:29 +00:00
parent b08761f826
commit bb9bbd5c2c

View file

@ -515,6 +515,7 @@ BOOL DIALOG_FileSaveAs(VOID)
VOID DIALOG_FilePrint(VOID) VOID DIALOG_FilePrint(VOID)
{ {
DOCINFO di; DOCINFO di;
TEXTMETRIC tm;
PRINTDLG printer; PRINTDLG printer;
SIZE szMetric; SIZE szMetric;
int cWidthPels, cHeightPels, border; int cWidthPels, cHeightPels, border;
@ -557,7 +558,7 @@ VOID DIALOG_FilePrint(VOID)
printer.nFromPage = 0; printer.nFromPage = 0;
printer.nMinPage = 1; printer.nMinPage = 1;
/* we really need to calculate number of pages to set nMaxPage and nToPage */ /* we really need to calculate number of pages to set nMaxPage and nToPage */
printer.nToPage = 0; printer.nToPage = (WORD)-1;
printer.nMaxPage = (WORD)-1; printer.nMaxPage = (WORD)-1;
/* Let commdlg manage copy settings */ /* Let commdlg manage copy settings */
@ -622,22 +623,39 @@ VOID DIALOG_FilePrint(VOID)
size = GetWindowText(Globals.hEdit, pTemp, size); 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; border = 150;
for (copycount=1; copycount <= printer.nCopies; copycount++) { for (copycount=1; copycount <= printer.nCopies; copycount++) {
i = 0; i = 0;
pagecount = 1; pagecount = 1;
do { 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 && /* The user wants to print the current selection */
/* ((printer.Flags & PD_PAGENUMS) == 0 || pagecount <= printer.nToPage))*/ if (printer.Flags & PD_SELECTION)
pagecount <= printer.nToPage) {
dopage = 1; 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); old_font = SelectObject(printer.hDC, font);
GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric);
if (dopage) { if (dopage) {
if (StartPage(printer.hDC) <= 0) { if (StartPage(printer.hDC) <= 0) {
@ -650,35 +668,44 @@ VOID DIALOG_FilePrint(VOID)
return; return;
} }
/* Write a rectangle and header at the top of each page */ /* 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 /* I don't know what's up with this TextOut command. This comes out
kind of mangled. kind of mangled.
*/ */
TextOut(printer.hDC, TextOut(printer.hDC,
border * 2, border * 2,
border + szMetric.cy / 2, border + tm.tmHeight / 2,
Globals.szFileTitle, Globals.szFileTitle,
lstrlen(Globals.szFileTitle)); lstrlen(Globals.szFileTitle));
} }
/* The starting point for the main text */ /* The starting point for the main text */
xLeft = border * 2; xLeft = border * 2;
yTop = border + szMetric.cy * 4; yTop = border + tm.tmHeight * 4;
SelectObject(printer.hDC, old_font); SelectObject(printer.hDC, old_font);
GetTextExtentPoint32(printer.hDC, letterM, 1, &szMetric);
/* Since outputting strings is giving me problems, output the main /* Since outputting strings is giving me problems, output the main
* text one character at a time. */ * text one character at a time. */
do { do {
if (pTemp[i] == '\n') { if (pTemp[i] == '\n') {
xLeft = border * 2; xLeft = border * 2;
yTop += szMetric.cy; yTop += tm.tmHeight;
} }
else if (pTemp[i] != '\r') { else if (pTemp[i] != '\r') {
if (dopage) if (dopage)
TextOut(printer.hDC, xLeft, yTop, &pTemp[i], 1); 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; 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)); } while (i++ < size && yTop < (cHeightPels - border * 2));