Как найти фактическую область печати? (PrintDocument)

Почему так сложно найти этот волшебный Прямоугольник?

В событии OnPrintPage у меня есть PrintPageEventArgs, и я пытаюсь рисовать с использованием Graphics в пределах максимальной области печати.

Я пробовал использовать PageBounds, PrintableArea, Graphics.VisibleClipBounds и т. Д. У всех не получается последовательно получить область рисования, особенно при переключении с альбомной на портретную. PrintableArea, кажется, никогда не меняется при переключении с альбомной на портретную.

Я также заметил, что есть разница в том, как устанавливается Graphics.VisibleClipBounds в зависимости от того, выполняю ли я предварительный просмотр и фактическую печать. В предварительном просмотре он всегда показывает ширину / высоту портретной ориентации, поэтому я должен проверить, является ли это предварительным просмотром, и мне нужно вручную поменять местами ширину / высоту, когда это пейзаж.

Мне нужен алгоритм для вычисления области печати , поскольку он относится к текущему контексту графики , а не к произвольной теоретической области печати, которая не используется в реальном рисовании.


Меня беспокоит смещение графической матрицы.До сих пор я заметил серьезные несоответствия между тем, как контекст Graphics предварительно транслируется с использованием жестких полей, в зависимости от таких факторов, как:

  • Если OriginAtMargins истинно или ложно (не так, как я думал)
  • Если я печатаю на принтер или с помощью PrintPreviewControl (я должен проверить, является ли это печать для предварительного просмотра или печать на страницу, чтобы правильно обработать перевод)
  • Если я использую свой принтер дома или мой принтер на работе (оба вести себя иначе)

Есть стандартный способ справиться с этим? Стоит ли просто сбросить матрицу? Когда я устанавливаю для OriginAtMargins значение true, Графика предварительно переводится на 84,84, но мои поля равны 100,100. Жесткие поля - 16,16. Разве не следует переводить на 100 100? Поскольку 0,0 должен находиться на границах страницы, а не на жестких полях.

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

43
задан Trevor Elliott 10 January 2012 в 15:20
поделиться