DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プリントプレビューコントロールで現在表示している位置を知るには

環境/言語:[XPSP3 .VB.net2005]
分類:[.NET]

プリントプレビューコントロールで現在表示している位置を知るにはどうすればよいのでしょう
■No31595に返信(dehumanizeさんの記事)
> プリントプレビューコントロールで現在表示している位置を知るにはどうすればよいのでしょう

表示されているページのことならStartPageが表示中ページの最初になります。
複数ページ表示が可能なのでこのようなプロパティになっているようです。
StartPageの内容は実際には ページ番号-1 です。
■No31598に返信(shuさんの記事)
> ■No31595に返信(dehumanizeさんの記事)
>>プリントプレビューコントロールで現在表示している位置を知るにはどうすればよいのでしょう
>
> 表示されているページのことならStartPageが表示中ページの最初になります。
> 複数ページ表示が可能なのでこのようなプロパティになっているようです。
> StartPageの内容は実際には ページ番号-1 です。

説明が足りなくてすみません
ページ番号のことではなくズームした場合にページ内のどこを表示しているか、の位置です
■No31599に返信(dehumanizeさんの記事)
> ページ番号のことではなくズームした場合にページ内のどこを表示しているか、の位置です
座標情報のことでしょうか? だとすれば、それは公開されていないと思います。

どうしても必要なら、PrintPreviewControl には頼らず、
PreviewPrintController を使って自作されてみては如何でしょうか。


一応足掻いてみましたが…このあたりが限界でした。

Imports System.Drawing.Printing
Imports System.Reflection
Public Class Form1
    Private WithEvents ppc As New PrintPreviewControl()
    Private WithEvents doc As New PrintDocument()
    Private WithEvents tm As Timer

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles tm.Tick
        Me.Text = GetField(Of Point)(ppc, "lastOffset").ToString()
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        ppc.Dock = DockStyle.Fill
        Controls.Add(ppc)
        ppc.Document = doc
        ppc.Zoom = 2.5
        If Me.components Is Nothing Then
            Me.components = New System.ComponentModel.Container()
        End If
        tm = New Timer(Me.components)
        tm.Interval = 55
        tm.Start()
    End Sub

    Private Sub doc_PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) Handles doc.PrintPage
        e.Graphics.PageUnit = GraphicsUnit.Millimeter
        Dim xL As Integer = 0
        Dim xR As Integer = e.PageBounds.Right
        Dim yT As Integer = 0
        Dim yB As Integer = e.PageBounds.Bottom

        For x As Integer = xL To xR Step 10
            If x Mod 100 = 0 Then
                e.Graphics.DrawLine(Pens.Red, x, yT, x, yB)
            Else
                e.Graphics.DrawLine(Pens.Silver, x, yT, x, yB)
            End If
        Next
        For y As Integer = yT To yB Step 10
            If y Mod 100 = 0 Then
                e.Graphics.DrawLine(Pens.Blue, xL, y, xR, y)
            Else
                e.Graphics.DrawLine(Pens.Red, xL, y, xR, y)
            End If
        Next
    End Sub

    Private Function GetField(Of T)(ByVal target As Object, ByVal fieldName As String) As T
        Dim bf As BindingFlags = BindingFlags.Default
        bf = bf Or BindingFlags.GetProperty
        bf = bf Or BindingFlags.IgnoreCase
        bf = bf Or BindingFlags.NonPublic
        bf = bf Or BindingFlags.Public
        bf = bf Or BindingFlags.Instance
        bf = bf Or BindingFlags.Static
        Dim pi As FieldInfo = target.GetType().GetField(fieldName, bf)
        If pi Is Nothing Then
            Throw New MemberAccessException()
        Else
            Return CType(pi.GetValue(target), T)
        End If
    End Function

    Private Sub ppc_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ppc.MouseWheel
        Dim cnt As Integer = e.Delta / SystemInformation.MouseWheelScrollDelta
        Dim zoom As Double = ppc.Zoom + cnt * 0.05
        ppc.Zoom = Math.Max(0.05, zoom)
    End Sub
End Class
■No31600に返信(魔界の仮面弁士さんの記事)
> ■No31599に返信(dehumanizeさんの記事)
>>ページ番号のことではなくズームした場合にページ内のどこを表示しているか、の位置です
> 座標情報のことでしょうか? だとすれば、それは公開されていないと思います。

でしたか…いえ、プロパティ探しても無いし…とは思ってたのですが

> どうしても必要なら、PrintPreviewControl には頼らず、
> PreviewPrintController を使って自作されてみては如何でしょうか。
…略…

流石に私には手に負えなそうなのでPictureBoxで代用することにします
ってかそれが本当なんですけど
スクリーンショットのプレビュー出したらそこでトリミングしたいって言われて
何とかならんかなと…
素直にPictureBoxでトリミングさせてから印刷することにします
ありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板