tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルPrintFormへの用紙設定
記事No11562
投稿日: 2015/12/23(Wed) 12:16
投稿者たつや
VB6.0で作成した住所録(機能:登録、修正、はがきへの印刷)プログラムを
当サイト、MSDNを参考にしながらVB2015版に修正・テストしております。

テスト環境:Windows 8.1 / VB2015 / Framework 4.5 / 対象の CPU:x64

行き詰ってしまい、対処について、ご存じの方おられましたら
ご教示お願い致します。

★これ以降、当サイトの確認できませんので明日以降に確認させて頂く
★予定です。

よろしくお願いします。


<内容>
フォームイメージをはがきへの印刷時、ページ設定ダイアログにて
"はがき"にしてから、印刷プレビューを表示させると、どうみても
大きさが「はがき」ではなく、A4にみえます。
プリンタへは「はがき」をセットし、印刷するとA4に印刷されている
ようでズレて印刷されます。
ページ設定ダイアログの用紙:はがき が印刷プレビューに渡ってない
感じです。

    Public pf As New PrintForm
    Private printerPageSetting As New System.Drawing.Printing.PageSettings
    Private Sub 印刷ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 印刷ToolStripMenuItem.Click
        With printerPageSetting.Margins
            .Left = 0
            .Top = 0
            .Right = 0
            .Bottom = 0
        End With
        PageSetupDialog1.PageSettings = printerPageSetting
        If PageSetupDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            MenuStrip1.Visible = False
            pf.Form = Me
            MsgBox("printer=" & FrmKYK.SetPrinterName)
            pf.PrinterSettings.PrinterName = FrmKYK.SetPrinterName
            pf.PrintAction = Printing.PrintAction.PrintToPreview
            pf.Print()
            MenuStrip1.Visible = True
        End If
    End Sub

[ツリー表示へ]
タイトルRe: PrintFormへの用紙設定
記事No11564
投稿日: 2015/12/23(Wed) 15:20
投稿者花ちゃん
PrintForm を使って印刷する場合は、printerPageSetting の値を PrintForm に反映させる事は出来ないようです
VB6.0 と同様に使用するプリンターの用紙サイズ等を直接変更しないとだめなようです。

printerPageSetting の値を反映させてプレビュー表示や印刷をしたいなら Win32 API の BitBlt を
使って Form の印刷をするようにすればできます。

[ツリー表示へ]
タイトルRe^2: PrintFormへの用紙設定
記事No11565
投稿日: 2015/12/24(Thu) 14:57
投稿者たつや
> PrintForm を使って印刷する場合は、printerPageSetting の値を PrintForm に反映させる事は出来ないようです
> VB6.0 と同様に使用するプリンターの用紙サイズ等を直接変更しないとだめなようです。
>
> printerPageSetting の値を反映させてプレビュー表示や印刷をしたいなら Win32 API の BitBlt を
> 使って Form の印刷をするようにすればできます。
花ちゃんさん、早々のご回答、ありがとうございます。
確認遅くなり、すみませんでした。

Win32 API の BitBlt を使ってやってみます。
また、疑問点でましたら、よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: PrintFormへの用紙設定
記事No11566
投稿日: 2015/12/24(Thu) 19:47
投稿者花ちゃん
> Win32 API の BitBlt を使ってやってみます。

BitBlt を使っての Windows フォームを印刷する MSDN のサンプル
https://msdn.microsoft.com/ja-jp/library/cc464071(v=vs.71).aspx

CopyFromScreen を使っての Windows フォームを印刷する MSDN のサンプル
https://msdn.microsoft.com/ja-jp/library/6he9hz8c(v=vs.110).aspx

CopyFromScreen を使ったサンプル、必要なコントロールは貼り付けておいて下さい。
尚、マージンの設定は、プリンター独自の印刷余白は考慮しておりません。
下記も参考にして下さい。
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013print04.htm

Public Class Form1

    Private printerPageSetting As New System.Drawing.Printing.PageSettings

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'ページ設定ダイアログの設定及び表示
        '現在のページ設定ダイアログの設定を指定
        With printerPageSetting.Margins
            .Left = CInt(.Left * 2.54 / 10) * 10
            .Top = CInt(.Top * 2.54 / 10) * 10
            .Right = CInt(.Right * 2.54 / 10) * 10
            .Bottom = CInt(.Bottom * 2.54 / 10) * 10
        End With
        PageSetupDialog1.PageSettings = printerPageSetting
        'ページ設定ダイアログの設定 OK ボタンがクリックされたらプレビュー表示
        If PageSetupDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Button2.PerformClick()
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Call CaptureScreen()

        '印刷プレビューのダイアログボックスの表示位置と大きさを設定
        'ページ設定ダイアログの設定の内容を反映
        PrintDocument1.DefaultPageSettings = printerPageSetting

        PrintPreviewDialog1.Document = PrintDocument1
        '★表示位置を設定
        PrintPreviewDialog1.StartPosition = FormStartPosition.Manual
        PrintPreviewDialog1.Location = New Point(450, 20)
        '★表示するダイアログの大きさを設定する
        PrintPreviewDialog1.Size = New Size(440, 640)
        '★印刷プレビューの表示倍率を指定
        PrintPreviewDialog1.PrintPreviewControl.Zoom = 0.4
        PrintPreviewDialog1.ShowDialog()
    End Sub

    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        'Form を印刷
        e.Graphics.DrawImage(memoryImage, e.MarginBounds.Left, e.MarginBounds.Top)
    End Sub

    Dim memoryImage As Bitmap
    '下記の部分は、 MSDN のサンプルを利用(これでは、Form の枠やタイトルバーが写るので)
    Private Sub CaptureScreen()
        Dim myGraphics As Graphics = Me.CreateGraphics()
        Dim s As Size = Me.Size
        memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
        Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(Me.Location.X, Me.Location.Y, 0, 0, s)
    End Sub

  'Form の枠やタイトルバーが邪魔ならこちらを
    Private Sub CaptureScreen()
        Dim myGraphics As Graphics = Me.CreateGraphics()
        Dim s As Size = Me.ClientSize
        Dim cx As Integer = Me.Width - Me.ClientSize.Width
        Dim cy As Integer = Me.Height - Me.ClientSize.Height
        cx = cx \ 2
        cy = cy - cx
        memoryImage = New Bitmap(s.Width, s.Height, myGraphics)
        Dim memoryGraphics As Graphics = Graphics.FromImage(memoryImage)
        memoryGraphics.CopyFromScreen(Me.Location.X + cx, Me.Location.Y + cy, 0, 0, s)
    End Sub

End Class
 

[ツリー表示へ]
タイトルRe^4: PrintFormへの用紙設定
記事No11569
投稿日: 2015/12/29(Tue) 09:41
投稿者たつや
→花ちゃんさん
サンプルのご提示ありがとうございます。
サンプルを実行し、内容把握始めれそうなのが20160104以降になりそうです。

[ツリー表示へ]
タイトルRe^5: PrintFormへの用紙設定
記事No11575
投稿日: 2016/01/05(Tue) 17:15
投稿者たつや
> →花ちゃんさん
> サンプルのご提示ありがとうございます。
> サンプルを実行し、内容把握始めれそうなのが20160104以降になりそうです。

花ちゃんさん、遅くなりすみません。
下記ご提示頂いたサンプルの理解できました。
 1).Win32 API の BitBlt
 2)CopyFromScreen
2)を参考に修正してみる予定です。
「Form の枠やタイトルバーが邪魔」なロジックも
ご提示頂き、ありがとうございました。

また不明点あれば書込みさせて頂きますので
その折にはお願い致します。

[ツリー表示へ]