Определение максимально доступной площади печати - PullRequest
1 голос
/ 29 мая 2010

Я пытаюсь определить максимально доступную область на моем принтере. Я напечатал простой прямоугольник, пробуя различные граничные переменные. Мой вопрос: почему первые два не работают правильно? Они не печатают полный прямоугольник на бумаге, рисуются только левая и верхняя стороны Почему только третий печатает полный прямоугольник? У меня сложилось впечатление, что все три должны работать правильно. Чего мне не хватает?

Вот мой код:

this.printDocument1.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);

...
private void PrintPage(object sender, PrintPageEventArgs e)
{
    //Method 1, no right and bottom sides are printed
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), e.PageBounds);

    //Method 2, same as Method 1
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), e.MarginBounds);

    //Method 3, works correctly
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1), new Rectangle((int)e.Graphics.VisibleClipBounds.X, (int)e.Graphics.VisibleClipBounds.Y, (int)e.Graphics.VisibleClipBounds.Width, (int)e.Graphics.VisibleClipBounds.Height));
}

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Первый не работает, потому что вы пытаетесь печатать без полей. Второй сбой, потому что вы пытаетесь печатать за полем, поэтому правая и нижняя линии падают на 1 пиксель за границы. Теперь третий работает IMO, потому что координаты прямоугольника печати являются плавающей точкой, и вы приводите их к целым числам, округляя их вниз, чтобы прямоугольник попадал в область печати. ​​

EDIT Некоторая дополнительная информация, которую я нашел относительно вашего комментария: «Если объект Graphics использует ненадежный PageUnit, [2], тогда VisibleClipBounds будет в других единицах, чем PageBounds (который всегда в единицах по 100 dpi). Для обработки этих переменных полезно иметь вспомогательный метод для возврата» реальные "границы страницы в единообразной единице измерения"

Проверьте эту статью , я думаю, что она охватывает все.

1 голос
/ 29 мая 2010

Мое первое предположение состоит в том, что 2 работает с полями, которые вы установили ранее (0,0,0,0), и что ваш принтер фактически не поддерживает печать без полей (большинство этого не делают). Из-за того, что большинству принтеров требуются хотя бы некоторые поля, # 1 практически никогда не будет работать.

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

Что касается того, почему вы получаете верхний и левый, а не ничего с # 1 и # 2, это потому, что вы просто говорите: «напечатайте мне прямоугольник этих размеров, начиная с верхнего левого угла области печати» не «напечатать мне прямоугольник с этими размерами и начать в дальнем верхнем левом углу страницы, где вы не можете на самом деле печатать», поэтому он пытается, но он выходит за край страницы, так как он больше, чем область печати страницы.

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