Печатный CDC кажется крошечным на бумаге - PullRequest
0 голосов
/ 03 июня 2009

Когда я печатаю CDC для созданного мной элемента управления отчетом, он кажется крошечным (менее 1 квадратного дюйма на бумаге). Как я могу получить отчет для печати, чтобы он занимал всю страницу? Или, другими словами, как сделать так, чтобы весь отчет отображался на одной печатной странице.

CPrintDialog printDialog(FALSE); printDialog.DoModal();</p> <pre><code>CDC dcPrint; if(dcPrint.Attach(printDialog.GetPrinterDC())) { int iHorzRes = dcPrint.GetDeviceCaps(HORZRES); int iVertRes = dcPrint.GetDeviceCaps(VERTRES); int iHorzResCDC = m_CDC.GetDeviceCaps(HORZRES); int iVertResCDC = m_CDC.GetDeviceCaps(VERTRES); dcPrint.m_bPrinting = TRUE; dcPrint.BitBlt(0,0, iHorzRes, iVertRes, &m_CDC, iHorzResCDC, iVertResCDC, SRCCOPY); CFont* pOldFont = dcPrint.SelectObject(&m_HeaderFont); dcPrint.TextOut(0,0,"HelloWorld") ; dcPrint.SelectObject(pOldFont); CPrintInfo printInfo; printInfo.m_rectDraw.SetRect(0,0, iHorzRes, iVertRes); dcPrint.StartDoc("Report Print"); dcPrint.StartPage(); if(dcPrint.EndPage()) dcPrint.EndDoc(); else dcPrint.AbortDoc(); } dcPrint.DeleteDC();

m_CDC - это DC памяти, который я использую для буферизации и отображения всего отчета на экране.

Ответы [ 3 ]

2 голосов
/ 04 июня 2009

Как уже говорили другие, это потому, что, как правило, разрешение дисплея принтеров намного выше, чем у дисплеев. Дисплеи обычно имеют разрешение от 96 до 120 точек на дюйм: при значении 96 точек на дюйм это означает, что изображение размером 96 пикселей (точек) на 96 пикселей занимает приблизительно 1 квадратный дюйм на дисплее. Однако если вы просто возьмете это изображение и распечатаете его на принтере с разрешением 600 точек на дюйм, размер изображения будет примерно 1/6 "на 1/6" - намного меньше. Это проклятие издательского мира - изображения, которые хорошо выглядят на экранах, при печати часто выглядят крошечными или ужасными.

Вы можете, как уже было предложено, использовать StretchBlt вместо BitBlt для увеличения изображения. В зависимости от разницы между вашим дисплеем и принтером, это может выглядеть либо блочно, либо совершенно ужасно блочно.

Гораздо лучший вариант - переписать ваш код, который рисует элемент управления, чтобы у вас был метод, который берет контекст устройства (и некоторые координаты) и рисует в нем. Ваш обычный код рисования окна может передать DC памяти в эту процедуру, а затем BitBlt результат в окно, и ваш код рисования может вызвать этот метод с DC принтера и некоторыми подходящими координатами.

При написании этой подпрограммы вам придется беспокоиться о масштабировании: например, вам нужно будет создать шрифты для данного контекста устройства и с размером, не зависящим от масштабирования (то есть указать размер шрифта в точках, не пикселей), а не полагаться на предварительно созданный шрифт.

0 голосов
/ 03 июня 2009

Ваш принтер имеет намного больше точек на дюйм, чем ваш экран. Вам нужно будет масштабировать объекты так, чтобы они лучше подходили к напечатанной странице.

Попробуйте использовать StretchBlt () вместо BitBlt ().

0 голосов
/ 03 июня 2009

Полагаю, вы не масштабируете свой отчет до разрешения принтера. Типичное разрешение экрана составляет 72 DPI (иногда 96 DPI). Разрешение принтера может составлять 300 точек на дюйм, 600 точек на дюйм или выше.

Вы должны перерисовать отчет на DC принтера со всеми координатами и размерами, масштабированными до разрешения принтера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...