2009-06-03 1 views
0

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

CPrintDialog printDialog(FALSE); printDialog.DoModal();

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, который я использую в буфер и отобразить весь отчет на экране.

ответ

2

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

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

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

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

+0

Это работает, я понял, почему крошечный внешний вид заключается в том, что у принтера DC больше пикселей, чем у экрана DC. Из-за этого все размеры шрифта кажутся маленькими при печати. Поэтому я написал свою логику рисования для печати с использованием новых размеров шрифта, проходящих через DC. Таким образом, это заняло почти всю страницу. thanx все. –

+0

Использование большего шрифта на самом деле не подходит для рисования большего размера. Правильный способ - установить правильный режим отображения и видовое окно для вашего DC. Взгляните на функции CDC :: SetMapMode() и :: SetWindowExtEx(). –

0

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

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

0

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

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