VB.NETでフォームの印刷をするには?

解決


愛犬はBeen  2003-10-28 00:57:19  No: 109441

皆様、お世話になります。
VB6で作成したプログラムをVB.NETにコンバートしています。
VB6時代ではフォームの印刷は、Form1.PrintForm  
で簡単に出来ましたよね。
しかし、VB.NETでは .PrintForm は「サポートしていません」
と冷たくあしらわれてしまいます。
皆様はどのようにしていますか?
教えて下さい。


魔界の仮面弁士  2003-10-28 06:34:55  No: 109442

> 皆様はどのようにしていますか?

PrintFormは、スクロールしなければ見えない領域の出力には使えないとか、用紙サイズや印刷位置の指定などに難があるなどの理由から、私の場合は、ほとんど使っていませんでした。
かわりに、Printerオブジェクトに直接Printするか、何らかの帳票ツール(DataReport, ActiveReport, Crystal Report, WebBrowser, Excelでの印刷など)で出力するようにしていましたね。

なので.NETも同様で、PrintDocumentクラスで出力を行うようにしています。
(CrystalReportViewer クラスについては、使った事がありません)


愛犬はBeen  2003-10-28 17:56:05  No: 109443

魔界の仮面弁士さん、ありがとうございます。
私もちゃんと印刷するときはPrinterオブジェクトや
クリスタルレポートを使っています。
魔界の仮面弁士さんが言うような問題点はわかりますが、
画面のハードコピーを取りたいときにForm1.PrintFormを使っています。


魔界の仮面弁士  2003-10-28 18:37:22  No: 109444

> 魔界の仮面弁士さんが言うような問題点はわかりますが、
あとは、コントロールによっては、PrintFormで正常に出力されない物がある……という問題点もありましたね。

> 画面のハードコピーを取りたいときにForm1.PrintFormを使っています。
PrintFormって、TextBoxとLabelで、出力結果が異なりますよね。
TextBoxの文字はビットマップ出力されるため、文字の輪郭が汚くなるとか…。
そうした部分まで再現したいのであれば、自前で描画するしか無いと思います。

単純にビットマップイメージを出力するだけでも良ければ、BitBlt APIを併用して、Formのデバイスコンテキスト(GetHdcメソッド)の内容を、新規に作成したBitmapオブジェクトに割り当ててやり、それをPrintDocumentで処理してやればOKかと。


ねろ  2003-10-28 23:39:42  No: 109445

>皆様はどのようにしていますか?
無くなってしまったのでしょうがなく
色々拾い集めて来て、こんなものを作ってやっていますが。
一応これでフォームはプリントアウトできます。
このコードはあるのはprintFormボタンが一つと、PrintDocument1コントロールが一つだけ 
  
    Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal _
     nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight _
     As Integer, ByVal hdcSrc As _
     IntPtr, ByVal nXSrc As Integer, _
     ByVal nYSrc As Integer, ByVal _
     dwRop As System.Int32) As Boolean

    Const SRCCOPY As Integer = &HCC0020

    Private bitImg As Bitmap  '最終的にプリントアウトするビットイメージ

    Private Sub printForm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles printForm.Click
        Dim gp As Graphics = Me.CreateGraphics                 'フォームのGraphicオブジェクトの作成
        bitImg = New Bitmap(Me.Size.Width, Me.Size.Height, gp) 'ビットマップ領域確保
        Dim fomG As Graphics = gp.FromImage(bitImg)
        Dim Hdc1 As IntPtr = gp.GetHdc()
        Dim Hdc2 As IntPtr = fomG.GetHdc()
        BitBlt(Hdc2, 0, 0, Me.ClientRectangle.Width, Me.ClientRectangle.Height, Hdc1, 0, 0, SRCCOPY)
        gp.ReleaseHdc(Hdc1)
        fomG.ReleaseHdc(Hdc2)
        PrintDocument1.Print()
    End Sub
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As _
    System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Dim fGraphics As Graphics = e.Graphics
        fGraphics.DrawImage(bitImg, 0, 0)
        bitImg.Dispose()
        fGraphics.Dispose()
    End Sub


愛犬はBeen  2003-10-29 00:57:41  No: 109446

魔界の仮面弁士さん、ねろさん、お世話になっています。
APIを使って作成してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加