Область печати в C # - Ошибка? - PullRequest
5 голосов
/ 08 апреля 2010

У меня проблема со значениями ширины и высоты PageSettings.PrintableArea. Свойства Width, Height и Size утверждают, что «получают или устанавливают» значения. Кроме того, функция inflate () утверждает, что изменяет размер на основе значений, переданных в.

Однако все эти попытки изменить значение не сработали. Inflate () игнорируется (без ошибок, просто проходит, как если бы он работал, но значения остаются неизменными.

Попытка установить высоту, ширину или размер приводит к ошибке компилятора: «Невозможно изменить возвращаемое значение« System.Drawing.Printing.PageSettings.PrintableArea », поскольку оно не является переменной».

У меня такое ощущение, что это означает, что часть описания "или набор" - ложь.

Почему я хочу знать это: (Кто-то всегда спрашивает ...) У меня есть приложение для печати (C #, WinForm), которое для большинства вещей работает довольно хорошо. Я могу установить параметры принтера и объекты параметров страницы, чтобы управлять тем, что отображается в свойствах принтера в диалоговом окне печати. Однако в Microsoft Office Document Image Writer эти параметры иногда игнорируются, и размер бумаги возвращается к 0, 0, даже если отображается что-то еще. Все, что я действительно хочу, чтобы это было WYSIWYG, насколько отображаемые значения идут, поэтому я изменяю размер бумаги обратно на то, что должно быть, но область печати, если она неправильная, делает получающееся изображение выигрышным. Полученное изображение - это размер области печати, а не значение в формате бумаги. Просто интересно, была ли причина для этого или способ заставить ее этого не делать.

Заранее спасибо. :)

UPDATE:

  //ignored 
  PrintDocument.DefaultPageSettings.PrintableArea.Inflate(XOffset, YOffset);

 //causes compiler error
 PrintDocument.DefaultPageSettings.PrintableArea.Size = new SizeF((float)DimensionsPaperSize.Width, (float)DimensionsPaperSize.Height);
 PrintDocument.DefaultPageSettings.PrintableArea.Height = DimensionsPaperSize.Height;
 PrintDocument.DefaultPageSettings.PrintableArea.Width = DimensionsPaperSize.Width;

ОБНОВЛЕНИЕ 2:

Для моих принтеров (нестандартного размера), которые печатаются правильно, когда я изменяю PaperSize, PrintableArea и PageBounds автоматически изменяются в соответствии с ним. Когда я изменяю PaperSize на MDIW, меняются только границы страницы. Я не понимаю, что вызвало это.

ВЫВОД:

Nobugz проделал большую работу, объясняя, почему PrintableArea нельзя установить (и обычно это никогда не требуется) и почему его функция inflate () игнорируется, поэтому я отмечаю это как ответ.

Что касается постоянной проблемы, которая побудила меня задать этот вопрос, я все еще в растерянности. В ответ на предложение «ScaleTranform» объекты PaperSize и Graphics уже имеют правильные значения, поэтому использование этих значений вряд ли поможет. Я подозреваю, что самое большее, что я мог сделать по этому маршруту, это изменить размер моего изображения правильного размера до значений мусора, которые я получаю для PrintableArea. Я собираюсь предположить, что это связано с ошибкой поведения, когда явная настройка PaperSize не может соответствующим образом изменить PrintableArea.

Это расстраивает, что я, кажется, единственный человек, который столкнулся с этой проблемой. По крайней мере, до сих пор я наблюдал это поведение только для MODIW. Для чьих-либо ссылок, и поэтому существует как можно больше информации; Я использую 32-разрядную версию Win7, которая разрабатывается в VS2008. Чтобы воспроизвести проблему, выполните следующие действия:

PrintDialog PrintDlg = new PrintDialog();
PrintDocument PrintDoc = new PrintDocument();
PrintDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(DocumentPrintPage);
PrintDlg.PrinterSettings.PrinterName = printerName; //MODIW
PrintDoc = AlterPaperSize(PrintDoc); //A function that just changes the papersize
PrintDlg.Document = PrintDoc;
PrintDlg.PrinterSettings = PrintDoc.PrinterSettings;
if (PrintDlg.ShowDialog() == DialogResult.OK)
{
   if ((PrintDoc.DefaultPageSettings.PaperSize.Width == 0) &&
       (PrintDoc.DefaultPageSettings.PaperSize.Height == 0))
   {
      PrintDoc.DefaultPageSettings.PaperSize = DimensionsPaperSize;
   }
   PrintDoc.Print();
}

Ответы [ 3 ]

7 голосов
/ 08 апреля 2010

Это довольно фундаментальная проблема программирования на .NET, каждый программист влюбляется в него хотя бы раз.Тип свойства PrintableArea: RectangleF.Это структура, тип значения.Когда вы используете это свойство, вы возвращаете копию значения.

Компилятор заметит, что вы пытаетесь изменить элемент копии, например, когда вы пытаетесь назначитьСвойство высоты.Но это становится неряшливым, когда вы используете метод Inflate ().Вы надуваете копию, а не исходное значение, и компилятор недостаточно умен, чтобы заметить.

Ключевая проблема здесь в том, что свойство PrintableArea имеет только getter, но не имеет setter.Что означает, что вы не можете это изменить.Что имеет смысл, если вы подумаете об этом, вы не можете изменить размер листа бумаги или изменить дизайн принтера.Вы, вероятно, хотите использовать свойство Margins.

2 голосов
/ 21 января 2011

Хорошо, я знаю, что это немного устарело, так что извиняюсь, но у меня возникла та же проблема, и я узнал, как правильно установить размеры бумаги, чтобы PrintableArea была правильной, так как это была одна из немногих постов, Когда я «погуглил» проблему, я подумал, что добавлю, как я заставил ее работать здесь, так что следующий человек, спотыкающийся об этом, получит ответ.

При установке PaperSize = New PaperSize (...) вы создаете нестандартный размер, даже если вы называете его «A4» или «A5». Вместо этого вам нужно установить один из стандартных форматов бумаги в PrinterSettings.PaperSizes.

Ниже приведен код C # .NET 3.5, показывающий, как я получаю размеры A4 и A5 в качестве переменных, которые я затем могу использовать по мере необходимости, показанные в последней строке при установке PaperSize, теперь PrintableArea будет верным.

IEnumerable<PaperSize> paperSizes = settings.PaperSizes.Cast<PaperSize>();
PaperSize sizeA5 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A5);
PaperSize sizeA4 = paperSizes.First<PaperSize>(size => size.Kind == PaperKind.A4);
settings.DefaultPageSettings.PaperSize = sizeA5; 
1 голос
/ 18 мая 2010

Я недавно смог понять это для себя. При назначении нового формата бумаги: А) необходимо указать «Пользовательский» Б) Существуют ограничения на размеры бумаги. Я не понял их, и они могут зависеть от принтера. Если у вас неправильный размер, область печати становится размером по умолчанию 8.5x11. Возможно, они должны быть кратны 10.

.DefaultPageSettings.PaperSize = New PaperSize("Custom", 1100, 2200)

не работает:

.DefaultPageSettings.PaperSize = New PaperSize("Custom", 1093, 2290)

Дайте мне знать, если узнаете что-нибудь еще.

...