39章:チュートリアル38:WPFでの印刷(1) (VB)

    作成2013.04.07

     WPFアプリケーションにおける印刷に関しては、わかりやすい事例が見つかりませんでした。
  1. 参照元情報
     印刷の概要は
    「印刷の概要」にジャンプする
     内容が難解で理解が難しかったため、サンプルコードを参照しました。


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


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


  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="350" Width="525">
        <Grid x:Name="grid1">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal" >
                <TextBlock Text="1. Using DrawingContext" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold" Margin="0,0,10,0"/>
                <Button Content="Print" Width="100" VerticalAlignment="Center" Click="Print_Click" Margin="0,10"/>
            </StackPanel>
        </Grid>
    </Window>
    


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


  7. Class MainWindowクラスの全コード
    Imports System.Globalization
    Class MainWindow
        Public Sub New()
            InitializeComponent()
            DataContext = Me
        End Sub
    
        Private Sub Print_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
            Dim printDialog As System.Windows.Controls.PrintDialog = New System.Windows.Controls.PrintDialog()
            If printDialog.ShowDialog() Then
                Dim dv As DrawingVisual = New DrawingVisual()
                Dim dc = dv.RenderOpen()
                Dim rect = New Rect(New System.Windows.Point(20, 20), New System.Windows.Size(350, 240))
                dc.DrawRoundedRectangle(System.Windows.Media.Brushes.Yellow, New Pen(Brushes.Purple, 2), rect, 20, 20)
                dc.DrawText(New FormattedText("WPF Printing", CultureInfo.CurrentCulture, FlowDirection,
                      New Typeface(New System.Windows.Media.FontFamily("Courier New"), FontStyles.Normal, FontWeights.Bold,
                          FontStretches.Normal), 13, System.Windows.Media.Brushes.Black), New System.Windows.Point(50, 180))
                dc.DrawGeometry(Brushes.Green, New Pen(Brushes.Gray, 2), New RectangleGeometry(New Rect(270, 110, 40, 80)))
                dc.DrawGeometry(Brushes.Blue, New Pen(Brushes.Gray, 2), New EllipseGeometry(New Rect(160, 150, 60, 100)))
                dc.DrawLine(New Pen(Brushes.Black, 2), New Point(230, 140), New Point(350, 200))
                dc.Close()
    
                printDialog.PrintVisual(dv, "TEST-Print")
                Dim bmp As RenderTargetBitmap = New RenderTargetBitmap(600, 350, 120, 96, PixelFormats.Pbgra32)
                bmp.Render(dv)
                Dim img As Image = New Image()
                img.Width = 100
                img.Height = 100
                img.Source = bmp
                img.Stretch = Stretch.Fill
    
                Dim r = New Rectangle()
                r.Fill = New ImageBrush(bmp)
                r.SetValue(Grid.RowProperty, 1)
                r.SetValue(Grid.ZIndexProperty, -1)
                grid1.Children.Add(r)
            End If
        End Sub
    End Class
    


  8. VBコードの解説
    (1)Imports System.Globalizationは CultureInfoクラスを使用するのに必要です。
    (2)DataContext = Meは不要な記載です。
    (3)Dim printDialog As System.Windows.Controls.PrintDialog = New System.Windows.Controls.PrintDialog()でプリントダイアログを開きます。
    (4)If printDialog.ShowDialog() Thenは印刷ボタンを押された場合、以下を実行します。
    (5)Dim dv As DrawingVisual = New DrawingVisual()は変数dvをDrawingVisual()型で生成します。
    (6)Dim dc = dv.RenderOpen()はDrawingVisual にレンダリングするために開きます。
    (7)dc.DrawRoundedRectangleは角丸四角形を描きます。
    (8)dc.DrawTextは文字を描きます。
    (9)dc.DrawGeometryは四角や楕円を描きます。
    (10)dc.Close()でレタリングを終了します。
    (11)printDialog.PrintVisual(dv, "TEST-Print")で印刷を実行します。
    (12)Dim bmp As RenderTargetBitmap = New RenderTargetBitmap(600, 350, 120, 96, PixelFormats.Pbgra32)以下のコードで図形をビットマップ形式に変換して、grid1に表示します。


    感想:
    (1)WPFの印刷機能は難解でまいりました。さまざまな機能があり、PDFファイルの置き換えとしてXPSファイルを位置づけているようです。
    (2)全てを理解しようとすると、かなり厄介そうですのでサンプルコード「WPF Printing Overvie1」を単純化して作成しました。
    (3)このサンプルでは、XAMLで作成した図形を全く利用していません。しかし、このほうがプログラム的には自由度が高く活用しやすいと思います。
    (4)XAMLで作成した図形の印刷方法については、40章で検討してみたいと思います。






40章:チュートリアル39:WPFでの印刷(2) (VB) に行く。

トップページに戻る。