mirror of
https://github.com/reactos/reactos.git
synced 2025-05-25 04:03:56 +00:00
[NOTEPAD] Printer output improvements by Ricardo Hanke. See CORE-9088 for more details.
svn path=/trunk/; revision=67890
This commit is contained in:
parent
b08761f826
commit
bb9bbd5c2c
1 changed files with 40 additions and 13 deletions
|
@ -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));
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue