5

PageSettings.PrintableArea の幅と高さの値に問題があります。幅、高さ、およびサイズのプロパティは、値を「取得または設定」すると主張しています。また、inflate() 関数は、渡された値に基づいてサイズを変更すると主張しています。

ただし、値を変更するこれらの試みはすべてうまくいきませんでした。Inflate() は無視されます (エラーは発生せず、機能したかのように通過しますが、値は変更されません。

高さ、幅、またはサイズを設定しようとすると、「'System.Drawing.Printing.PageSettings.PrintableArea' の戻り値は変数ではないため変更できません」というコンパイラ エラーが発生します。

これは、説明の「またはセット」の部分が嘘であることを意味するように感じます。

これを知りたい理由: (誰かがいつも尋ねます...) ほとんどの場合、かなりうまく機能している印刷アプリケーション (C#、WinForm) があります。プリンター設定とページ設定オブジェクトを設定して、印刷ダイアログのプリンター プロパティに表示される内容を制御できます。ただし、Microsoft Office Document Image Writer では、これらの設定が無視されることがあり、別の表示がされていても用紙サイズが 0, 0 に戻ります。表示される値に関しては WYSIWYG にしたいので、用紙サイズを元のサイズに戻しますが、印刷可能領域が間違っていると、結果の画像が不安定になります。結果のイメージは、用紙サイズの値ではなく、印刷可能領域のサイズです。これには理由があるのか​​ 、それともそうしないようにする方法があるのか​​ 疑問に思っています.

前もって感謝します。:)

アップデート:

  //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 が自動的に変更されます。MDIW で PaperSize を変更すると、PageBounds のみが変更されます。何が原因なのかわかりません。

結論:

Nobugz は、PrintableArea を設定できない (通常は設定する必要がない) 理由と、その inflate() 関数が無視される理由を説明する素晴らしい仕事をしてくれたので、それを答えとしてマークします。

この質問をするように促した永続的な問題に関しては、私はまだ途方に暮れています。「ScaleTranform」の提案に応えて、PaperSize および Graphics オブジェクトには既に正しい値が設定されているため、これらの値をいじっても役に立たない可能性があります。そのルートに沿ってできることは、正しいサイズの画像を PrintableArea で取得しているガベージ値にサイズ変更することだと思います。PaperSize を明示的に設定しても PrintableArea を適切に変更できない場合は、バグに関連する動作であると想定します。

この問題に遭遇したのは私だけのようで、イライラしています。少なくとも、これまでのところ、この動作は MODIW でしか観察していません。誰の参考のためにも、できるだけ多くの情報が公開されています。VS2008 で開発している 32 ビットの Win7 を実行しています。問題を再現するには、次の手順を実行します。

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();
}
4

3 に答える 3

7

これは .NET プログラミングの非常に基本的な問題であり、すべてのプログラマーは少なくとも一度は陥ります。PrintableArea プロパティの型は RectangleF です。それは構造体、値型です。プロパティを使用すると、値のコピーが返されます。

コンパイラは、Height プロパティを割り当てようとしたときのように、コピーのメンバーを変更しようとしていることを認識します。しかし、Inflate() メソッドを使用すると、うんざりします。元の値ではなくコピーを膨らませており、コンパイラは気付くほど賢くありません。

ここでの重要な問題は、PrintableArea プロパティには getter しかなく、setter がないことです。つまり、変更することはできません。考えてみれば当然のことですが、紙のサイズを変更したり、プリンターのデザインを変更したりすることはできません。おそらく、Margins プロパティを使用する必要があります。

于 2010-04-07T21:02:41.893 に答える
2

OK、これは少し古いことを知っているので、お詫びしますが、同じ問題があり、PrintableArea が正しくなるように用紙サイズを正しく設定する方法を見つけました。問題を「ググって」ここに追加したいと思ったので、次につまずいた人が答えを得ます。

PaperSize = New PaperSize(...) を設定すると、「A4」または「A5」という名前を付けたとしても、カスタム サイズが作成されます。代わりに、用紙サイズを PrinterSettings.PaperSizes に保持されている標準サイズのいずれかに設定する必要があります。

以下は、A4 と A5 のサイズを変数として取得する方法を示す C# .NET 3.5 コードです。このコードは必要に応じて使用できます。最後の行で 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; 
于 2011-01-21T10:50:52.280 に答える
1

私は最近、これを自分で理解することができました。新しい用紙サイズを割り当てる場合: A) 「カスタム」を指定する必要があります B) 用紙サイズには制約があります。私はそれらを理解しておらず、プリンターに依存している可能性があります。サイズが無効な場合、印刷可能領域はデフォルトの 8.5x11 になります。10 の倍数でなければならない場合もあります。

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

動作しません:

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

また何かわかりましたら教えてください。

于 2010-05-18T14:44:51.393 に答える