41章:チュートリアル40:WPFでの印刷(3) (VB)

    作成2013.04.08

     WPFアプリケーションにおける印刷に関しては、わかりやすい事例が見つかりませんでした。

  1. 参照元情報
     印刷の概要は
    「印刷の概要」にジャンプする
     XpsDocumentWriterクラスを使用するのがスマートのようです。

  2. WPFでの印刷(3)
     XpsDocumentWriterクラスを試行錯誤的に試した結果です。
     ダウンロード後は解凍してから使用してください。
      [WPFでの印刷(3)]をダウンロードする。
     解凍すると「41WPF_Printing3」フォルダーがあります。
    注(1)「41WPF_Printing3」フォルダーの「WPF_Printing2.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「MainWindow.xaml」をダブルクリックすると「デザイン」と「XAML」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「WPF_Printing2.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. WPF_Printing2.slnの実行
    (1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)図形がはいった印刷画面が表示されます。
    (4)印刷ボタンを押すと印刷が実行されます。
    (5)クローズボックスで終了します。


  4. プロジェクトの構成
    (1)XAMLコードとVBコードで構成されます。


  5. XAMLの全コード
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="401" Width="522">
        <Grid>
            <Grid Name="Grid1" Margin="0,25,0,0">
                <Ellipse Height="50" HorizontalAlignment="Left" Margin="65,91,0,0" Name="Ellipse1" Stroke="Black" VerticalAlignment="Top" Width="93" Fill="BlueViolet" />
                <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="225,167,0,0" Name="Label1" VerticalAlignment="Top" />
                <Rectangle Height="56" HorizontalAlignment="Left" Margin="264,85,0,0" Name="Rectangle1" Stroke="Black" VerticalAlignment="Top" Width="101" Fill="Magenta" />
            </Grid>
            <StackPanel Height="25" HorizontalAlignment="Left" Name="StackPanel1" VerticalAlignment="Top">
                <Button Content="印刷" Height="23" Name="Button1" Width="75" />
            </StackPanel>
        </Grid>
    </Window>
    


  6. XAMLのポイント
    (1)一般的な記載のみです。


  7. Class MainWindowクラスの全コード
    Imports System.Windows.Xps
    Imports System.Printing
    
    Class MainWindow
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
            Dim page As New FixedPage
            Dim content1 As New PageContent
            Dim doc As New FixedDocument
            page.Width = 120 * 96 / 25.4
            page.Height = 70 * 96 / 25.4
    
            Dim Ellipse2 As Ellipse = New Ellipse
            CopyEllipse(Ellipse1, Ellipse2)
            page.Children.Add(Ellipse2)
            Dim Rectangle2 As Rectangle = New Rectangle
            page.Children.Add(Rectangle2)
            CopyRectangle(Rectangle1, Rectangle2)
            Dim Label2 As Label = New Label
            CopyLabel(Label1, Label2)
    
            page.Children.Add(Label2)
            CType(content1, Markup.IAddChild).AddChild(page)
    
            doc.Pages.Add(content1)
    
            Dim imgArea As PrintDocumentImageableArea = Nothing
            Dim writer As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(imgArea)
            If writer Is Nothing Then
            Else
                writer.Write(doc)
            End If
        End Sub
    
        Sub CopyEllipse(Ellipse1 As Ellipse, Ellipse2 As Ellipse)
            Ellipse2.Height = Ellipse1.Height
            Ellipse2.HorizontalAlignment = Ellipse1.HorizontalAlignment
            Ellipse2.Margin = Ellipse1.Margin
            Ellipse2.Stroke = Ellipse1.Stroke
            Ellipse2.VerticalAlignment = Ellipse1.VerticalAlignment
            Ellipse2.Width = Ellipse1.Width
            Ellipse2.Fill = Ellipse1.Fill
        End Sub
    
        Sub CopyRectangle(Rectangle1 As Rectangle, Rectangle2 As Rectangle)
            Rectangle2.Height = Rectangle1.Height
            Rectangle2.HorizontalAlignment = Rectangle1.HorizontalAlignment
            Rectangle2.Margin = Rectangle1.Margin
            Rectangle2.Stroke = Rectangle1.Stroke
            Rectangle2.VerticalAlignment = Rectangle1.VerticalAlignment
            Rectangle2.Width = Rectangle1.Width
            Rectangle2.Fill = Rectangle1.Fill
        End Sub
        Sub CopyLabel(Label1 As Label, Label2 As Label)
            Label2.Content = Label1.Content
            Label2.Height = Label1.Height
            Label2.HorizontalAlignment = Label1.HorizontalAlignment
            Label2.Margin = Label1.Margin
            Label2.VerticalAlignment = Label1.VerticalAlignment
        End Sub
    End Class
    


  8. VBコードの解説
    (1)Imports System.Windows.XpsとImports System.Printingが必要です。
    (2)Dim page As New FixedPageで変数pageをFixedPage型で生成します。
    (3)Dim content1 As New PageContentで変数content1をPageContent型で生成します。
    (4)Dim doc As New FixedDocumentで変数docをFixedDocument型で生成します。
    (5)page.Widthとpage.Heightでページサイズを決定します。
    (6)CopyEllipse(Ellipse1, Ellipse2)で図形をコピーします。(独自定義にルーチンです。)
    (7)page.Children.Addでpageに図形を加えます。
    (8)CType(content1, Markup.IAddChild).AddChild(page)でcontent1にpageを加えます。
    (9)doc.Pages.Add(content1)でdocにcontent1を加えます。
    (10)Me.DocumentViewer1.Document = docでDocumentViewer1にdocを加えます。
    (11)Dim writer As XpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(imgArea)でプリントダイアログをひらきます。
    (12)writer.Write(doc)はプリントダイアログで印刷が選択された場合に実行します。


    感想:
    (1)やっとスマートな印刷処理となったようです。
    (2)VBでの比較演算子においては、If writer Is Nothing Thenとする必要があるようです。なぜ<>、や=で比較できないのか?(習慣の違いで苦労しました。)
    (3)Grid1に登録された図形は、Grid1から切り離すか、コピーしないとpageに登録できないようです。
    (4)Grid1から切り離すと戻すのが面倒なので、図形のコピーを採用しました。図形コピーの標準関数がよくわからないので、独自に定義したルーチンとしました。(もっとスマートなコピー方法があるような気がします。)






42章:チュートリアル41:VBでの演算能力の検証(VB)に行く。

トップページに戻る。