Графика, созданная из PrintPreview, - это Портрет, а не Пейзаж? - PullRequest
1 голос
/ 27 октября 2011

Я печатаю пользовательские страницы в C #. При фактической печати документа он работает правильно, как и при отображении его в диалоговом окне (через тот же код). Когда код используется для PrintPreview, диалоговое окно показывает страницу в альбомном режиме, но созданный Graphics имеет размеры портретного документа, и поэтому предварительный просмотр не отображается правильно. Вот урезанная версия кода, который я использую

using (PrintDocument pd = new PrintDocument())
{
    pd.PrinterSettings.PrintToFile = false;
    pd.DefaultPageSettings.Landscape = true;
    pd.PrinterSettings.DefaultPageSettings.Landscape = true;
    pd.DefaultPageSettings.PrinterSettings.DefaultPageSettings.Landscape = true;

    PrintDialog pDialog = new PrintDialog();
    pDialog.Document = pd;
    pDialog.PrinterSettings.DefaultPageSettings.Landscape = true;
    pDialog.PrinterSettings.PrintToFile = false;
    pDialog.Document.DefaultPageSettings.Landscape = true;

    PrintPreviewDialog printPreview = new PrintPreviewDialog();

    printPreview.Document = pd;
    printPreview.ShowDialog();
}

Затем вызывается функция Print_Me, когда диалоговое окно PrintPreview запрашивает печать:

private void Print_Me(object sender, PrintPageEventArgs e)
{
    using (Graphics g = e.Graphics)
    {    
        DrawToDC(g);
        e.HasMorePages = hasMorePages;
    }
}

Внутри DrawToDC Я использую следующее, чтобы получить размеры, которые, как я уже говорил, прекрасно работает для реальной печати и отображения в диалоговом окне:

dc.VisibleClipBounds.Width
dc.VisibleClipBounds.Height

Ответы [ 3 ]

4 голосов
/ 24 марта 2012

У меня была точно такая же проблема, и в конце концов я нашел это. Добавьте обработчик делегата OnQueryPageSettings.

void OnQueryPageSettings(object obj,QueryPageSettingsEventArgs e)
{
    if (e.PageSettings.PrinterSettings.LandscapeAngle != 0)
        e.PageSettings.Landscape = true;            
}

и на ваш PrintDocument

prnDoc.QueryPageSettings + = new QueryPageSettingsEventHandler (OnQueryPageSettings);

Это исправило это для меня.

1 голос
/ 20 марта 2014

У меня была точно такая же проблема. Однако все работало нормально, если я рисовал содержимое страницы с правильной шириной и высотой (то есть менял их местами).

int width = dc.VisibleClipBounds.Width;
int height = dc.VisibleClipBounds.Height;
if(width < height)
{
    int temp = width;
    width = height;
    height = temp;
}

Затем нарисуйте содержимое страницы на основе ширины и высоты.

Не самое удачное решение, но гарантирует, что мы всегда рисуем на альбомной странице.

0 голосов
/ 25 июля 2012

Я не мог найти, где подключить решение Дэвида Болтона, но нашел другой способ.

http://wieser -software.blogspot.co.uk / 2012/07 / ландшафтно-полиграфический и предпросмотр-в-wpf.html

По сути, вам нужно установить размер страницы для каждой DocumentPage, возвращаемой методом GetPage вашего DocumentPaginator.

...