Почему я не могу центрировать изображение на странице для печати в VB.NET? - PullRequest
1 голос
/ 15 сентября 2009

Мое приложение рисует диаграммы в метафайле Windows. Пользователи должны иметь возможность распечатывать диаграммы в центре страницы. Краткое описание кода печати:

Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)
     Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader()
     Dim sz As New SizeF(100 * header.Bounds.Width / header.DpiX, 100 * header.Bounds.Height / header.DpiY)
     Dim p As New PointF((e.PageBounds.Width - sz.Width) / 2, (e.PageBounds.Height - sz.Height) / 2)

     e.Graphics.DrawImage(metafile, p)
End Sub

Если я печатаю в PDF, это выглядит идеально. Но если я печатаю на реальном принтере, он смещен от центра, примерно на 1/8 дюйма вниз и вправо. Я сделал быстрый эксперимент, чтобы увидеть, где находятся PageBounds, выполнив

e.Graphics.DrawRectangle(Pens.Red, e.PageBounds)

и результаты были такими же, слегка смещенными от центра. В PDF это рисует прямоугольник на самом краю страницы. Для чего он стоит, я протестировал на Toshiba e-Studio 3510c и HP LaserJet 4000 с теми же результатами. Любая помощь приветствуется, это мучает меня уже несколько недель.

Обновление:

В итоге я использовал e.PageSettings.PrintableArea, но похоже, что e.Graphics.VisibleClipBounds возвращает те же значения, что и в ответе xpda.

Ответы [ 3 ]

2 голосов
/ 16 сентября 2009

Вместо использования e.pagebounds для ограничивающего прямоугольника попробуйте использовать e.graphics.VisibleClipBounds. Некоторые драйверы принтеров ненадежны с e.pagebounds, а видимые ограничения выглядят более точными.

0 голосов
/ 06 марта 2018

ниже код:

Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs)

Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader()
     Dim sz As New SizeF(100 * header.Bounds.Width / header.DpiX, 100 * header.Bounds.Height / header.DpiY)

 Dim LeftMargin, TopMargin As Single

LeftMargin = ((e.Graphics.VisibleClipBounds.Width - sz.width) / 2) + (e.Graphics.VisibleClipBounds.Left / 2)

TopMargin = ((e.Graphics.VisibleClipBounds.Height- sz.Height) / 2) + (e.Graphics.VisibleClipBounds.Top/ 2)


     e.Graphics.DrawImage(metafile, LeftMargin , TopMargin, sz )

End Sub
0 голосов
/ 15 сентября 2009

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

e.PageSettings.PaperSize.Width
e.PageSettings.PaperSize.Height

Проблема, вероятно, не возникает с PDF, потому что вы можете печатать на всей области страницы (т.е. Bounds.Width и Bounds.Height = 0, что аналогично использованию свойства PaperSize). 1008 *

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