Обнаружение макс. доступной области печати

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

Вот мой код:

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
задан dstr 29 May 2010 в 19:26
поделиться

2 ответа

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

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

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

1
ответ дан 3 September 2019 в 00:14
поделиться

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

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

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

1
ответ дан 3 September 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: