C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 印刷プレビューと印刷の方法について


(過去ログ 138 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■81116 / inTopicNo.1)  印刷プレビューと印刷の方法について
  
□投稿者/ グラ (1回)-(2016/08/30(Tue) 14:37:36)

分類:[.NET 全般] 

PrintPreviewControl と PrintDocument を使用しています。

PrintPreviewControl の Document に PrintDocument を設定し、

プレビューを行う場合は InvalidatePreview();
印刷を行うときは .Print() を使っています。

印刷もプレビューも PrintPage で指定して行うようですが、

プレビュー通りには印刷されません。

例えば (0, 0) に描画されているものは実際の印刷では右下にずれます。
この(0, 0) の位置は ハードマージンが考慮されているのでしょうか?

とすれば、見た目と印刷が同じになるようにするには
プレビューで描画するときと、印刷するときの位置を変更したものを2つ用意しなければならないのですが、
PrintPage のイベントの中で、現在プレビュー実行中か印刷中かを判断するものがわかりません。

もしくは、1つのコードで印刷の時もプレビューの時も同じにする方法があるのでしょうか?

引用返信 編集キー/
■81117 / inTopicNo.2)  Re[1]: 印刷プレビューと印刷の方法について
□投稿者/ kiku (111回)-(2016/08/30(Tue) 15:12:58)
2016/08/30(Tue) 15:15:18 編集(投稿者)

検証していませんが
PrintDocumentクラスのDesignModeプロパティにて
判断できないでしょうか?

https://msdn.microsoft.com/ja-jp/library/system.componentmodel.component.designmode(v=vs.110).aspx

※はずれでしたらごめんなさい
引用返信 編集キー/
■81118 / inTopicNo.3)  Re[2]: 印刷プレビューと印刷の方法について
□投稿者/ kiku (112回)-(2016/08/30(Tue) 15:25:13)
間違いでした。たぶん以下が正解と思います(同じく検証していません)。

PrintDocument.PrintControllerプロパティにて
PrintControllerクラスのインスタンスを取得し、
IsPreviewプロパティにて判断する

https://msdn.microsoft.com/ja-jp/library/system.drawing.printing.printcontroller.ispreview(v=vs.110).aspx

引用返信 編集キー/
■81126 / inTopicNo.4)  Re[3]: 印刷プレビューと印刷の方法について
□投稿者/ グラ (3回)-(2016/08/30(Tue) 16:06:31)
2016/08/30(Tue) 16:09:44 編集(投稿者)

No81118 (kiku さん) に返信
ありがとうございます。
IsPreviewで取得できました。

と、いうことで、やはり
印刷用と、プレビュー用の描画コードはそれぞれ2つ作って
メンテナンスしなければならないんですね。

せめて、e.Graphics に描画するときに
ページかマージンかのどちらを基準で指定描画ができると
いいのですが
引用返信 編集キー/
■81128 / inTopicNo.5)  Re[4]: 印刷プレビューと印刷の方法について
□投稿者/ shu (910回)-(2016/08/30(Tue) 16:16:40)
No81126 (グラ さん) に返信

> せめて、e.Graphics に描画するときに
> ページかマージンかのどちらを基準で指定描画ができると
> いいのですが

描画処理をオフセット値で指定して行うか
     g.DrawString("〜",fnt, brs, BaseX + 〜, BaseY + 〜)
  のように記述して
    BaseX,BaseYをプレビュー、印字で変えるとか


TranslateTransformで原点を移動するか
https://msdn.microsoft.com/ja-jp/library/6a1d65f4(v=vs.110).aspx

するとまるっきり別のものをコーディングする必要はなくなるかと思います。

引用返信 編集キー/
■81136 / inTopicNo.6)  Re[1]: 印刷プレビューと印刷の方法について
□投稿者/ 魔界の仮面弁士 (852回)-(2016/08/30(Tue) 18:18:51)
No81116 (グラ さん) に返信
> もしくは、1つのコードで印刷の時もプレビューの時も同じにする方法があるのでしょうか?

OriginAtMargins プロパティを、true にしてみるのは如何でしょう。
これで、プレビュー時にも余白が表示されるようになり、
印刷結果とプレビュー結果が近いイメージになると思います。

printDocument1.OriginAtMargins = true;

OriginAtMargins を true にしても
e.Graphics.VisibleClipBounds.Size は変わりませんが、
e.Graphics.VisibleClipBounds.Location は異なります。


ただ、OriginAtMargins を変更したとしても、プレビュー画面では
ハードマージンまでは考慮されません。そこまで調整する場合は、
((PrintDocument)sender).PrintController.IsPreview に応じて、
e.PageSettings.HardMarginX | .HardMarginY の分だけ
e.Graphics.TranslateTransform するなどして調整してみてください。
引用返信 編集キー/
■81156 / inTopicNo.7)  Re[2]: 印刷プレビューと印刷の方法について
□投稿者/ グラ (4回)-(2016/08/31(Wed) 10:19:29)
No81136 (魔界の仮面弁士 さん) に返信
> OriginAtMargins プロパティを、true にしてみるのは如何でしょう。
> これで、プレビュー時にも余白が表示されるようになり、
> 印刷結果とプレビュー結果が近いイメージになると思います。

true にするとプレビュー画面に何も表示されなくなりました。
どういうことでしょうか?
引用返信 編集キー/
■81157 / inTopicNo.8)  Re[3]: 印刷プレビューと印刷の方法について
□投稿者/ グラ (5回)-(2016/08/31(Wed) 10:23:17)
No81156 (グラ さん) に返信
> ■No81136 (魔界の仮面弁士 さん) に返信
>>OriginAtMargins プロパティを、true にしてみるのは如何でしょう。
>>これで、プレビュー時にも余白が表示されるようになり、
>>印刷結果とプレビュー結果が近いイメージになると思います。
>
> true にするとプレビュー画面に何も表示されなくなりました。
> どういうことでしょうか?
引用返信 編集キー/
■81168 / inTopicNo.9)  Re[3]: 印刷プレビューと印刷の方法について
□投稿者/ 魔界の仮面弁士 (862回)-(2016/08/31(Wed) 12:22:35)
No81156 (グラ さん) に返信
> true にするとプレビュー画面に何も表示されなくなりました。
> どういうことでしょうか?

下記のコードだとどうなりますか?


Public Class Form1
 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Me.Button1.Text = "100%"
  Me.Button2.Text = "全体"
  Me.Button3.Text = "再描画"

  Me.PrintDocument1.OriginAtMargins = True
  Me.PrintDocument2.OriginAtMargins = False

  Me.PrintPreviewControl1.Document = Me.PrintDocument1
  Me.PrintPreviewControl2.Document = Me.PrintDocument2

  Me.PrintPreviewControl1.AutoZoom = True
  Me.PrintPreviewControl2.AutoZoom = True

  AddHandler Me.PrintDocument1.PrintPage, AddressOf Me.PrintPage
  AddHandler Me.PrintDocument2.PrintPage, AddressOf Me.PrintPage
 End Sub

 Private Sub PrintPage(sender As Object, e As Printing.PrintPageEventArgs)
  Using fnt As New Font("MS Gothic", 18), _
     p1 As New Pen(Color.FromArgb(128, Color.Red), 15), _
     p2 As New Pen(Color.FromArgb(128, Color.Blue), 15), _
     p3 As New Pen(Color.FromArgb(128, Color.Green), 15), _
     p4 As New Pen(Color.FromArgb(128, Color.DarkMagenta), 15)

   e.Graphics.DrawRectangle(p1, e.PageBounds)
   e.Graphics.DrawRectangle(p2, e.MarginBounds)
   e.Graphics.DrawRectangle(p3, Rectangle.Round(e.PageSettings.PrintableArea))
   e.Graphics.DrawRectangle(p4, Rectangle.Round(e.Graphics.VisibleClipBounds))

   e.Graphics.DrawString(String.Format("IsPreView={0}", _
         DirectCast(sender, Printing.PrintDocument).PrintController.IsPreview), _
         fnt, Brushes.Black, New Point(0, 0))

   e.Graphics.DrawString(String.Format("OriginAtMargins={0}", _
         DirectCast(sender, Printing.PrintDocument).OriginAtMargins), _
         fnt, Brushes.Black, New Point(0, 30)) _

   e.Graphics.DrawString(String.Format("HardMargin={0},{1}", _
        e.PageSettings.HardMarginX, e.PageSettings.HardMarginY), _
         fnt, Brushes.Black, New Point(0, 60))

   e.Graphics.DrawString(String.Format("★Page={0}", e.PageBounds), _
         fnt, Brushes.Red, New Point(0, 90))

   e.Graphics.DrawString(String.Format("★Margin={0}", e.MarginBounds), _
         fnt, Brushes.Blue, New Point(0, 120))

   e.Graphics.DrawString(String.Format("★Printable={0}", e.PageSettings.PrintableArea), _
         fnt, Brushes.Green, New Point(0, 150))

   e.Graphics.DrawString(String.Format("★Clip={0}", e.Graphics.VisibleClipBounds), _
         fnt, Brushes.DarkMagenta, New Point(0, 180))

  End Using
 End Sub

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Me.PrintPreviewControl1.Zoom = 1.0
  Me.PrintPreviewControl2.Zoom = 1.0
 End Sub

 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  Me.PrintPreviewControl1.AutoZoom = True
  Me.PrintPreviewControl2.AutoZoom = True
 End Sub

 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  Me.PrintPreviewControl1.InvalidatePreview()
  Me.PrintPreviewControl2.InvalidatePreview()
 End Sub
End Class
引用返信 編集キー/
■81177 / inTopicNo.10)  Re[4]: 印刷プレビューと印刷の方法について
□投稿者/ グラ (6回)-(2016/08/31(Wed) 17:17:07)
No81168 (魔界の仮面弁士 さん) に返信

PrintPreviewControl1 の方は赤ラインが内側に入り余白(マージン?)部分が表示され
PrintPreviewControl2 の方は赤の部分が枠になっています。

おっしゃられっていた通りの表示になっていると思います。





引用返信 編集キー/
■81178 / inTopicNo.11)  Re[5]: 印刷プレビューと印刷の方法について
□投稿者/ 魔界の仮面弁士 (864回)-(2016/08/31(Wed) 17:28:24)
No81177 (グラ さん) に返信
> PrintPreviewControl1 の方は赤ラインが内側に入り余白(マージン?)部分が表示され
> PrintPreviewControl2 の方は赤の部分が枠になっています。

私のコードでは表示されているとのことなので、
>>> true にするとプレビュー画面に何も表示されなくなりました。
というのは、座標指定に問題があるのだと予想します。


> おっしゃられっていた通りの表示になっていると思います。

原点位置がずれているというだけではなく、
描画結果の右下部の違いにも注目です。

OriginAtMargins をどちらにするのかは任意ですが、
それらの結果をもとに座標の調整を行ってみれば
>>> もしくは、1つのコードで印刷の時もプレビューの時も同じにする方法があるのでしょうか?
の件に対処できるかと思います。
引用返信 編集キー/
■81180 / inTopicNo.12)  Re[3]: 印刷プレビューと印刷の方法について
□投稿者/ shu (911回)-(2016/08/31(Wed) 19:43:36)
No81156 (グラ さん) に返信

予想ですが

VisibleClipBounds

から外れたところに描画されているのではないでしょうか?
デバッグ実行して確認してみてはどうでしょう?
引用返信 編集キー/
■81181 / inTopicNo.13)  Re[4]: 印刷プレビューと印刷の方法について
□投稿者/ Jitta (208回)-(2016/09/01(Thu) 08:59:52)
もう一つ、unitの指定も見直してください。
100ピクセルのつもりで100インチ指定していたら、
全く違うところに表示されます。
# 別のプロパティ変えただけなら違うと思うけど、一応
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -