見出し画像

わからないことはcopilotに聞いてVB.NETでディスクトップアプリを作ってみよう NO.11 プレビューと印刷

アオノおじさんのひとりごと

(本文とは関係ありません、ひとりごとです)
 おじさんは、数種類の左手デバイスを使用しています。一般には、あまり知られていないのかもしれませんが、キーボードにショートカットやマクロを登録して1キーで操作できるものです。日本製ものが説明書や登録ソフトも付属していますので安心です。中国製は安いですが、説明書がなかったり、ソフトもネットで探す必要があります。(英語の説明はあります)
 以下は日本製ですが、左でも右でも使用できるもので、おじさんは、会計ソフトでテンキーとその上のファンクションキーを登録して 右手だけで帳簿データを入力できるようにしています。左手は伝票めくりです。

中国製の安いものだと、12キーのものを使用しています。
プログラムのエディタで使用しています。ショートカットを覚える必要がないので、大変便利です。5画面切り替えできるので、使用するものを分けて登録できます。上段を画面切り替え、下段を操作するボタンを登録しています。

高価なものでは、キー自体が液晶になっていて、そのボタンの操作がわかるものもあります。中国製です。

フルキーボードとマクロキーが一体になったものも、あります。左に液晶付きのマクロキーが並んでいます。

プレビューと印刷

(ここから本文)
サンプルは以下からダウンロードできます。 
   (5~11回まですべてのサンプル) 

送りジョーの印刷PGはかなり長いですし、複雑です。今回 3項目だけを指定印字位置に印刷するプログラムをサンプルにしています。それでも、複雑ですので、サンプル11をダウンロードして確認してみてください。
以下のように、3項目を指定にプリンタでプレビュー、印刷できるサンプルです。

ます、フォームにツールボックスの印刷からPrintDocumentとPrintPreviewDialogの2つをドラックしてください。名称は変更せずにそのままでOKです

フォームの下に 以下にように小さなアイコンが追加されればOKです

No.06 No.07で作成したように 文字と数値を入力できるように作成します。 プリンタ、給紙選択はConboBoxをドラックして追加します。

A4縦の用紙に
届け先1は 横20mm 縦30mm
届け先1は 横20mm 縦45mm
代引額 は 横55mm 縦60mm
に印字するようにしています。

送りジョーソフトでは、用紙サイズA4やB4 ユーザーサイズ(インチ指定)で 各項目のフォント、フォントサイズ、フォント倍率、印字位置(横 縦)、右、左指定 などをCSVに登録し、そのデータから印字するようになります。11サンプルソフトでは、簡単に固定位置に印字するようにしています。

まず、印字位置は 以下のように 
  左合わせの場合 左上を指定します。
  右合わせの場合 右上を指定します。 印刷位置は1/100インチ

プリンタの印字位置の単位は インチになりますがわかりやすいようにmmで登録できるようにしています。
印刷位置に規定値は1/100インチになります。
 1インチ=25.4mm になります。 
 20mmの場合
  20÷0.254 = 78.74 
  この値が位置になります。

1/100インチですので0.7874 インチ(20mm) になります。

PrintDocument を使用して印刷するPGをcopilotに聞いてみると

この回答から、PrintDocumentのPrintPageに DrawStringで 文字、フォント、印字位置設定後 Printメソッドで 印字する手順のようですね。

これを、プレビューできるサンプルに書き換えするように、聞いてみると
 何度も追加で、問い合わせできるので、わかるまで問い合わせしてみてください。
 pd.Print() が previewDialog.ShowDialog() に変わっているだけですね。
PrintDocumentの部分は同じですね。

では、続いてcopilotに、DrawStringの仕様を聞いてみると

サンプルを見てみると、
e.Graphics.DrawString(text, font, brush, x, y) 
brushとは何 これも聞いてみると

詳しく説明してくれます、文字だけなので 単一の色で問題ないですね。
このように、わからないものは、次々に質問すればOKです。覚える必要はないですね、質問の方法を覚えるだけです。

サンプル11 PrintDocumentのPrintPage のPGが以下になります。
copilotのサンプルと違うのは、TranslateTransformで位置を移動後に
Graphics.DrawString でX,Yは 0にしています。
移動後にその位置で印字するようになります。
Xm、Ym は印字の補正値の計算になります。
 プリンタの余白に補正値を加減算したものです。

TranslateTransformの移動は Xのみスケール(拡大縮小)も計算しています
CSng(positionX / 0.254) - Xm) * scale の部分です。
文字の縮尺がない(1倍)の場合は ここのscaleは必要はありません。

g.ScaleTransform(scaleX, scaleY) 
scaleX  横は縮尺可能にしております。
     ここを 0.8Fなどに変更して印字してみてください。
     文字の幅が小さくなるのがわかると思います。 
scaleY  1固定

g.DrawString(Omei1.Text, New Font(FontName, FontSize), Brushes.Black, 0, 0, drawFormatL)
Omei1.Text   印字する文字列
New Font (FontName, FontSize)  フォント指定
Brushes.Black  ブラシは黒
0,0     印字する位置(移動後に印字しているので0,0)
drawFormatL  左合わせ

    '*********************************************************************************
    '*   印刷
    '*********************************************************************************
    Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.
            Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim Xm As Single = PrintDocument1.DefaultPageSettings.HardMarginX - CSng(CInt(HoseiX.Text) / 0.254)
        Dim Ym As Single = PrintDocument1.DefaultPageSettings.HardMarginY - CSng(CInt(HoseiY.Text) / 0.254)

        Dim g As Graphics = e.Graphics
        Dim drawFormatL As New StringFormat                 '左合わせ印字
        drawFormatL.Alignment = StringAlignment.Near
        Dim drawFormatR As New StringFormat                 '右合わせ印字
        drawFormatR.Alignment = StringAlignment.Far

        Dim scaleX As Single                                '横方向の倍率
        Dim scaleY As Single = 1.0F                         '縦方向の倍率
        Dim scale As Single                                 '横方向の倍率(1/scaleX)

        Dim FontName As String                              'フォント名
        Dim FontSize As Single                              'フォントサイズ
        Dim positionX As Single                             '横印字位置
        Dim positionY As Single                             '縦印字位置

        '届先1
        scaleX = 1.0F               'Font横倍率
        FontName = "MS ゴシック"  'フォント名
        FontSize = 11.0F            'フォントサイズ
        positionX = 20.0F           '横印字位置mm
        positionY = 30.0F           '縦印字位置mm

        g.ResetTransform()                  'リセット
        scale = CSng(1 / scaleX)    '横方向の倍率(1/scaleX)
        g.ScaleTransform(scaleX, scaleY)
        g.TranslateTransform((CSng(positionX / 0.254) - Xm) * scale, CSng(positionY / 0.254) - Ym)
        g.DrawString(Omei1.Text, New Font(FontName, FontSize), Brushes.Black, 0, 0, drawFormatL)

        '届先2
        scaleX = 1.0F               'Font横倍率
        FontName = "MS ゴシック"  'フォント名
        FontSize = 11.0F            'フォントサイズ
        positionX = 20.0F           '横印字位置mm
        positionY = 45.0F           '縦印字位置mm

        g.ResetTransform()                  'リセット
        scale = CSng(1 / scaleX)    '横方向の倍率(1/scaleX)
        g.ScaleTransform(scaleX, scaleY)
        g.TranslateTransform((CSng(positionX / 0.254) - Xm) * scale, CSng(positionY / 0.254) - Ym)
        g.DrawString(Omei2.Text, New Font(FontName, FontSize), Brushes.Black, 0, 0, drawFormatL)

        '代引額
        'scaleX = 1.0F               'Font横倍率
        FontName = "MS ゴシック"  'フォント名
        FontSize = 11.0F            'フォントサイズ
        positionX = 55.0F           '横印字位置mm
        positionY = 60.0F           '縦印字位置mm
        g.ResetTransform()                  'リセット
        If Daibiki.Text <> "0" Then
            g.TranslateTransform(CSng(positionX / 0.254) - Xm, CSng(positionY / 0.254) - Ym)
            g.DrawString(Daibiki.Text, New Font(FontName, FontSize), Brushes.Black, 0, 0, drawFormatR)
        End If
        drawFormatL.Dispose()
        drawFormatR.Dispose()
        g.Dispose()


    End Sub

印刷実行する前に プリンタの設定が必要になります。
プリンタの設定をしないと エラーになります。
printerSettings.Copies = 1 '発行枚数をセット
printerSettings.PrinterName = PrinterSel.Text '印刷するプリンタを設定
PrintDocument1.PrinterSettings = printerSettings  セット
PrintDocument1.DocumentName = "テスト印刷" 'ドキュメント名の設定

PrintDocument1.DefaultPageSettings.PaperSize  用紙サイズ

PrintDocument1.DefaultPageSettings.Landscape  用紙の向き

プリンタと用紙サイズを指定後

PrintDocument1.Print()   印刷

PrintPreviewDialog1.ShowDialog()   プレビュー

     できるようになります。

    '*********************************************************************************
    '*   印刷 プレビュー
    '*********************************************************************************
    Private Sub PrnJ()

        Dim printerSettings As New PrinterSettings()

        'プリンタ名が空白の場合 デフォルトプリンタをセットする
        If PrinterSel.Text = "" Then
            Dim pd As New System.Drawing.Printing.PageSettings
            PrinterSel.Text = pd.PrinterSettings.PrinterName
        End If

        printerSettings.Copies = 1                      '発行枚数をセット
        printerSettings.PrinterName = PrinterSel.Text   '印刷するプリンタを設定
        PrintDocument1.PrinterSettings = printerSettings

        PrintDocument1.DocumentName = "テスト印刷"      'ドキュメント名の設定

        Call PrintSizeSet("A4", False, 0, 0)            '用紙サイズと向きの設定

        If PfPrev = False Then                          '印刷
            PrintDocument1.Print()
        Else                                            'プレビュー
            PrintPreviewDialog1.Document = PrintDocument1
            PrintPreviewDialog1.Size = New Size(800, 900)
            PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0
            PrintPreviewDialog1.ShowDialog()
        End If
    End Sub

11 プレビューと印刷はこれで終了です。
   印刷PGは少し複雑です、サンプル11をダウンロードして確認し
   してみてください。

← 前の記事に戻る                次の記事に行く →

また、私のホームページには、住所データも登録できるソフトも公開しています。こちらをクリック

以下は、今回の作成予定の実行ファイル OkuriJyo100.zip(無料)です。
01で入手していないかたは、こちらからダウンロードできます。

全ソースプログラムと解説書PDFは こちらから DLできます。

以下 仕事のホームページです。業務用パソコンソフトを開発販売しています、ご訪問いただけると幸いです。https://aonosys.jp/

いいなと思ったら応援しよう!