DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■32967 / inTopicNo.1)  印刷ページ数の取得
  
□投稿者/ TI 一般人(1回)-(2015/05/30(Sat) 17:43:03)
  • アイコン環境/言語:[VB2010] 
    分類:[.NET] 

    初めまして。

    VB2010+SQLServer2008を使用しております。

    PrintDocumentにて印刷を記述しております。
    Form(FormAとします)に
    ・PrintPreviewControl
    ・NumericUpDown
    を利用して、印刷のプレビューの表示、複数ページの場合のページ移動をできる
    ようにしております。

    NumericUpDownのMaximunプロパティをセットしたいのですが、どのタイミングで
    セットをすればよいかがわかりません。

    印刷のページ数は、PrintDocumetのPrintイベント内でカウントしていけばよいと
    思うのですが、FormAのNewで渡せばできたのですが、このタイミングでは
    PrintDocumentのPrintイベントが走っておらず、ページのカウントができて
    いません。

    どうかアドバイスをお願いします。
    コードは以下のようにしております。

    Private Sub btnPrint_Click(sender As System.Object, e As System.EventArgs) Handles btnPrint.Click


    pd = New PrintDocument


    ppc = New frmPrintPreview("タイムカード印刷", pd)
    →この時点では、PrintDocumentのPrintイベントが動いておらず、
     ページ数が取得できない

    'ppc.MaxPageNo = MaxPageNo

    ppc.Show()
    End Sub



    以下はFormAです
    Public Sub New(ByVal frmTitle As String _
    , ByVal doc As PrintDocument)

    ' この呼び出しはデザイナーで必要です。
    InitializeComponent()

    ' InitializeComponent() 呼び出しの後で初期化を追加します。
    Me.Text = frmTitle

    Me.ppc.Document = doc
    Me.ppc.StartPage = 0
    Me.Pagecount.Minimum = 1 →これがNumericUpDownです。
    Me.Pagecount.Maximum = 10 →これを外部から取得したい

    pd = doc

    Me.WindowState = FormWindowState.Maximized


    End Sub

    わかりにくい説明で申し訳ありませんが、よろしく御願い申し上げます。
引用返信 削除キー/
■32970 / inTopicNo.2)  Re[1]: 印刷ページ数の取得
□投稿者/ まりもん 一般人(27回)-(2015/06/01(Mon) 14:04:02)
  • アイコンPrintDocumentのPaintイベントにて自前の描画ロジックがあると思うのですが、
    自前でのロジックがあるなら、事前にページ数の取得も出来るのではないのですか?
    別にPaintイベントを実行させる必要はなく、Paintイベントで実行するロジックで
    ページ数を取得できる最低限のロジックでページ数を取得する関数を作るなどすれば
    いいのではないでしょうか?
引用返信 削除キー/
■32971 / inTopicNo.3)  Re[1]: 印刷ページ数の取得
□投稿者/ shu 大御所(464回)-(2015/06/01(Mon) 15:42:36)
  • アイコン
    No32967に返信(TIさんの記事)
    
    イメージ描画用のBMPを1枚のみ用意して仮に描画してみる方法
    
    
    Private Pages As Integer
    Private BmpW As Integer
    Private BmpH As Integer
    
    BeginPrintイベント:
      'プリンタの領域設定は1/100inch単位なのでそれを画面解像度を元に必要ピクセル数を求める。
     'プリンタに合わせたDPIで計算したい場合は96を変更
      BmpW = pd.DefaultPageSettings.Bounds.Width * 96 \ 100
      BmpH = pd.DefaultPageSettings.Bounds.Height * 96 \ 100
      初期化
      Pages = GetPageCnt()
      初期化
    
    PrintPageイベント:
      仮に Sub pd_PrintPage(s,e) とする
      通常の実装
    
    
    Function GetPageCnt() as Integer
        Dim Ret = 0
        Dim bmp as New Bitmap(BmpW, BmpH, その他適当なパラメータ)
        Dim Rect as Rectangle = 印刷範囲のRectangleを求める
    
        Using grp = Graphics.FromImage(bmp)
            Dim e as New PrintPageEventArgs(grp, Rect, pd.DefaultPageSettings.Bounds, pd.DefaultPageSettings)
            e.HasMorePages = True
            Do While e.HasMorePages
                pd_PrintPage(pd, e)
                ret += 1
            Loop
        End Using
        bmp.Dispose()
        Return Ret
    End Function

引用返信 削除キー/
■32974 / inTopicNo.4)  Re[1]: 印刷ページ数の取得
□投稿者/ 魔界の仮面弁士 大御所(966回)-(2015/06/01(Mon) 17:26:22)
  • アイコン2015/06/01(Mon) 19:09:40 編集(投稿者)

    No32967に返信(TIさんの記事)
    > Form(FormAとします)に
    FormA と frmPrintPreview の関係性が曖昧ですが、

     Dim formA As New frmPrintPreview("タイムカード印刷", pd)

    という意味でしょうか?


    > 印刷のページ数は、PrintDocumetのPrintイベント内で
    > カウントしていけばよいと思うのですが、

    そうですね(正確には PrintPage イベントですが)。
    HasMorePages が False に到達すれば最終ページです。



    > FormAのNewで渡せばできたのですが、このタイミングでは
    > PrintDocumentのPrintイベントが走っておらず、ページのカウントができて
    > いません。

    PrintPage イベントが呼ばれる「前」にセットするのではなく、
    PrintPage イベントが呼ばれた「後」にセットすればよいかと。


    手順的にはこんなイメージ。

    Public Class frmPrintPreview
     Private maxPageCount As Integer

     Public Sub New(ByVal frmTitle As String _
     , ByVal doc As PrintDocument)

      ' この呼び出しはデザイナーで必要です。
      InitializeComponent()

      ' InitializeComponent() 呼び出しの後で初期化を追加します。
      Me.Text = frmTitle

      Me.Pagecount.Minimum = 1
      Me.Pagecount.Maximum = 1

      AddHandler doc.BeginPrint, Sub() Me.maxPageCount = 0
      AddHandler doc.PrintPage, Sub() Me.maxPageCount += 1
      AddHandler doc.EndPrint, Sub() Me.Pagecount.Maximum = Me.maxPageCount

      Me.ppc.Document = doc
      Me.ppc.StartPage = 0

      pd = doc

      Me.WindowState = FormWindowState.Maximized
     End Sub

     Private Sub Pagecount_ValueChanged(sender As Object, e As EventArgs) Handles Pagecount.ValueChanged
      Me.ppc.StartPage = Pagecount.Value - 1
     End Sub
    '
    '  :
    '  :
    '
    End Sub
引用返信 削除キー/
■32979 / inTopicNo.5)  Re[2]: 印刷ページ数の取得
□投稿者/ TI 一般人(2回)-(2015/06/02(Tue) 18:56:20)
  • アイコン魔界の仮面弁士様へ

    ご提示いただいた方法で、無事希望の動作を実現することができました。
    本当に驚きです。

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

解決済み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -