皆様、お世話になります。
VB6で作成したプログラムをVB.NETにコンバートしています。
VB6時代ではフォームの印刷は、Form1.PrintForm
で簡単に出来ましたよね。
しかし、VB.NETでは .PrintForm は「サポートしていません」
と冷たくあしらわれてしまいます。
皆様はどのようにしていますか?
教えて下さい。
> 皆様はどのようにしていますか?
PrintFormは、スクロールしなければ見えない領域の出力には使えないとか、用紙サイズや印刷位置の指定などに難があるなどの理由から、私の場合は、ほとんど使っていませんでした。
かわりに、Printerオブジェクトに直接Printするか、何らかの帳票ツール(DataReport, ActiveReport, Crystal Report, WebBrowser, Excelでの印刷など)で出力するようにしていましたね。
なので.NETも同様で、PrintDocumentクラスで出力を行うようにしています。
(CrystalReportViewer クラスについては、使った事がありません)
魔界の仮面弁士さん、ありがとうございます。
私もちゃんと印刷するときはPrinterオブジェクトや
クリスタルレポートを使っています。
魔界の仮面弁士さんが言うような問題点はわかりますが、
画面のハードコピーを取りたいときにForm1.PrintFormを使っています。
> 魔界の仮面弁士さんが言うような問題点はわかりますが、
あとは、コントロールによっては、PrintFormで正常に出力されない物がある……という問題点もありましたね。
> 画面のハードコピーを取りたいときにForm1.PrintFormを使っています。
PrintFormって、TextBoxとLabelで、出力結果が異なりますよね。
TextBoxの文字はビットマップ出力されるため、文字の輪郭が汚くなるとか…。
そうした部分まで再現したいのであれば、自前で描画するしか無いと思います。
単純にビットマップイメージを出力するだけでも良ければ、BitBlt APIを併用して、Formのデバイスコンテキスト(GetHdcメソッド)の内容を、新規に作成したBitmapオブジェクトに割り当ててやり、それをPrintDocumentで処理してやればOKかと。
>皆様はどのようにしていますか?
無くなってしまったのでしょうがなく
色々拾い集めて来て、こんなものを作ってやっていますが。
一応これでフォームはプリントアウトできます。
このコードはあるのは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
魔界の仮面弁士さん、ねろさん、お世話になっています。
APIを使って作成してみます。
ツイート | ![]() |