Я пытаюсь узнать макс. доступную область на своем принтере. Я распечатал простой прямоугольник, испытывающий различные граничные переменные. Мой вопрос, почему сначала два не работает правильно? Они не печатают полный прямоугольник на бумаге, только левые и главные стороны привлечены. То, почему делает только третий, печатает полный прямоугольник? У меня создалось впечатление, которого все три должны работать правильно. Что я пропускаю?
Вот мой код:
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));
}
Первый не работает, потому что вы пытаетесь распечатать без полей. Второй не работает, потому что вы пытаетесь печатать поверх поля, поэтому правая и нижняя линии выходят за границы на 1 пиксель. Теперь третий работает IMO, потому что координаты прямоугольника печати являются плавающей точкой, и вы преобразуете их в целые числа, тем самым округляя их вниз, поэтому прямоугольник попадает в область печати.
ИЗМЕНИТЬ Дополнительная информация, которую я нашел относительно вашего комментария: «Если объект Graphics использует не заданный по умолчанию PageUnit, [2], тогда VisibleClipBounds будет в других единицах, чем PageBounds (который всегда в единицах 100 dpi). Для обработки этих переменных полезно иметь вспомогательный метод для возврата» реальные «границы страниц в согласованной единице измерения»
Посмотрите эту статью , я считаю, что она охватывает все.
Сначала я предполагаю, что 2 работает с полями, которые вы установили ранее (0,0,0,0)
, и что ваш принтер на самом деле не поддерживает no- печать на полях (в большинстве случаев нет). Из-за того, что большинству принтеров требуются хотя бы некоторые поля, №1 практически никогда не сработает.
Метод 3 на самом деле запрашивает у драйвера область печати страницы, а затем использует ее, так что он работает.
Что касается того, почему вы получаете верхнее и левое вместо ничего с # 1 и # 2, это потому, что вы просто говорите «распечатайте мне прямоугольник этих размеров, начиная с верхнего левого угла области печати» не «распечатайте мне прямоугольник с этими размерами и начните в дальнем верхнем левом углу страницы, где вы не можете печатать», поэтому он пытается, а выходит за край страницы, поскольку он больше, чем область печати страницы.