none
PrintPreviewDialogにて RRS feed

  • 質問

  • おはようございます。

    印刷を行う際に、PrintPreviewDialogをShowDialogで開いて表示をしてから印刷するという手順を考えています。
    Previewと実際に印刷ではずれが生じるので、それを修正する方法はわかりました。

    そこで、PrintPreviewDialog上の印刷ボタンをクリックしたときのイベントの取得方法を知りたいと思います。

    というのも、Previewと実際に印刷のずれを解消するために、ひとつフラグを立てているのですが、それをセットするタイミングを
    どこで行えばよいかで悩んでおり、PrintPreviewDialogの印刷ボタンをクリックした際に、フラグを立て、それを抜けるタイミングで
    フラグをはずせばよいかと思い、試そうと思ったのですが、印刷ボタンをクリックしたというのはどのようにすれば取得ができるか、
    ということが調べてもわかりません。(どのようにキーワードで検索をすればよいかがわかりませんでした)

    どうか、アドバイスお願いします。

    2010年10月12日 19:06

すべての返信

  • MSDNで調べたところ、PrintPreviewDialogに印刷ボタンがクリックされたことを伝えるイベントは無いようです。

    試してはいませんが、印刷ボタンを自前のボタンと差し替えることで、印刷ボタンがクリックされたことを検出できると思います。

    http://winofsql.jp/VA003334/dnettool080613131401.htm

     

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年10月13日 2:11
  • 印刷ボタンのイベントではないですが、印刷かプレビューかを調べる方法は用意されています。

    ●BeginPrint イベントでは PrintEventArgs で取得できます。

    Private Sub PrintDocument1_BeginPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
        MessageBox.Show( _
            If(e.PrintAction = Printing.PrintAction.PrintToPreview, _
               "プレビュー", "印刷など"))
    End Sub

    ●PrintController だと任意の場所で取得できます。

    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim printDoc = DirectCast(sender, Printing.PrintDocument)

        MessageBox.Show( _
            If(printDoc.PrintController.IsPreview, _
               "プレビュー", "印刷など"))
    End Sub

    追記:
    と思ったのですが、これらの方法は→に表示されてた「関連トピック」の TI-cb400 さんのスレッドですでに書かれていますね。
    すると外しちゃったかな。

    http://social.msdn.microsoft.com/Forums/ja-JP/vbexpressja/thread/fcf8586d-2c1d-4cfe-af9d-23c9a839abce/

    • 編集済み TH01 2010年10月13日 2:33 追記
    • 回答の候補に設定 山本春海 2010年11月2日 2:15
    2010年10月13日 2:28
  • ご回答ありがとうございます。

    まだ、試していないので申し訳ありませんが、まずはご報告まで。

    私も、提示していなかったので申し訳なかったのですが、Printcontrollerを使用する方法で以前から試していたのですが、
    以前、教えていただいたときはうまく出来たと思っていたのですが、改めて別のもので試していたところ、プレビューと印刷との
    ずれの修正がごちゃごちゃになってしまい、問題の切り分けのため、上記の質問をさせていただきました。

    もう少し、以前の質問のご回答を踏まえて、順番に整理をしていきたいと思います。

    また、ご報告をさせていただきます。

    2010年10月13日 23:25
  • 私の場合、印刷とプレビューのズレを補正するためのメソッドを作成し、PrintPage イベントハンドラの先頭で実行するようにしています。OriginAtMargins は常に false でなければいけません。
    そのメソッドでは、PrintController.IsPreview 以外の時だけ補正を行うようにしてます。
    内容は、Graphics.PageUnit を考慮してマージンを計算し、TranslateTransform してます。

    TI-cb400 さんのズレに関するスレッドをみると、IsPreview の場合にも補正を行われていますが、その必要はないはずです。
    gekka さんのコードのままで大丈夫だと思います。

    PageSetupDialog が関係している場合は、EnableMetric プロパティは true にしておく必要もあります。

    • 回答の候補に設定 山本春海 2010年11月2日 2:15
    2010年10月14日 2:20
  • おはようございます。

    お返事が遅くなりました。

    改めて、自分のコードを見直してみると、ご指摘の通りおかしな記述ですね。

    やっと、時間がとれるようになってきたので、あらためてご指摘いただいた部分を修正して
    テストをしたいと思います。

    ありがとうございました。

    2010年10月31日 0:39