1

私はGraphics.ScaleTransform、テキストの行をページの幅に合うように引き伸ばしてから、そのページを印刷するために使用しています。ただし、これにより印刷ジョブがビットマップに変換されます。ページ数が多い印刷の場合、これにより印刷ジョブのサイズがわいせつな比率になり、印刷速度が大幅に低下します。

このようにスケーリングしないと、テキスト印刷コマンドをプリンターに送信するだけなので、印刷ジョブは非常に小さいままです。

Graphics.ScaleTransform私の質問は、テキストの幅を伸ばすために使用する以外の方法はありますか?

これを示すサンプルコードを以下に示します(印刷ジョブでのスケーリングの効果を示すためにと呼ばれます)Print.Test(True)Print.Test(False)

Imports System.Drawing
Imports System.Drawing.Printing
Imports System.Drawing.Imaging

Public Class Print

    Dim FixedFont As Font
    Dim Area As RectangleF
    Dim CharHeight As Double
    Dim CharWidth As Double
    Dim Scale As Boolean

    Const CharsAcross = 80
    Const CharsDown = 66
    Const TestString = "!""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

    Private Sub PagePrinter(ByVal sender As Object, ByVal e As PrintPageEventArgs)

        Dim G As Graphics = e.Graphics
        If Scale Then
            Dim ws = Area.Width / G.MeasureString(Space(CharsAcross).Replace(" ", "X"), FixedFont).Width
            G.ScaleTransform(ws, 1)
        End If

        For CurrentLine = 1 To CharsDown
            G.DrawString(Mid(TestString & TestString & TestString, CurrentLine, CharsAcross), FixedFont, Brushes.Black, 0, Convert.ToSingle(CharHeight * (CurrentLine - 1)))
        Next

        e.HasMorePages = False

    End Sub

    Public Shared Sub Test(ByVal Scale As Boolean)

        Dim OutputDocument As New PrintDocument
        With OutputDocument
            Dim DP As New Print
            .PrintController = New StandardPrintController
            .DefaultPageSettings.Landscape = False
            DP.Area = .DefaultPageSettings.PrintableArea
            DP.CharHeight = DP.Area.Height / CharsDown
            DP.CharWidth = DP.Area.Width / CharsAcross
            DP.Scale = Scale
            DP.FixedFont = New Font("Courier New", DP.CharHeight / 100, FontStyle.Regular, GraphicsUnit.Inch)
            .DocumentName = "Test print (with" & IIf(Scale, "", "out") & " scaling)"
            AddHandler .PrintPage, AddressOf DP.PagePrinter
            .Print()
        End With
    End Sub
End Class

更新:代わりにGDI呼び出しとの相互運用を使用しました。関連するコードは次のとおりです。GDIクラスには、関連する関数と定数についてWiki( http://pinvoke.net/ )からコピーした定義がたくさんあります。

    ' convert from Graphics units (100 dpi) to device units
    Dim GDIMappedCharHeight As Double = CharHeight * G.DpiY / 100
    Dim GDIMappedCharWidth As Double = CharWidth * G.DpiX / 100

    Dim FixedFontGDI As IntPtr = GDI.CreateFont(GDIMappedCharHeight, GDIMappedCharWidth, 0, 0, 0, 0, 0, 0, GDI.DEFAULT_CHARSET, GDI.OUT_DEFAULT_PRECIS, GDI.CLIP_DEFAULT_PRECIS, GDI.DEFAULT_QUALITY, GDI.FIXED_PITCH, "Courier New")
    Dim CharRect As New GDI.STRUCT_RECT

    Dim hdc As IntPtr = G.GetHdc()
    GDI.SelectObject(hdc, FixedFontGDI)

    ' I used SetBkMode transparent as my text needed to overlay a background
    GDI.SetBkMode(hdc, GDI.TRANSPARENT)

    ' draw it character by character to get precise grid
    For CurrentLine = 1 To CharsDown
        For CurrentColumn = 1 To CharsAcross
            With CharRect
                .left = GDIMappedCharWidth * (CurrentColumn - 1)
                .right = GDIMappedCharWidth * CurrentColumn
                .top = GDIMappedCharHeight * (CurrentLine - 1)
                .bottom = GDIMappedCharHeight * CurrentLine
            End With
            ' 2341 == DT_NOPREFIX|DT_NOCLIP|DT_VCENTER|DT_CENTER|DT_SINGLELINE
            GDI.DrawText(hdc, Mid(TestString & TestString & TestString, CurrentLine+CurrentColumn, 1), 1, CharRect, 2341)
        Next
    Next

    GDI.DeleteObject(FixedFontGDI)

    G.ReleaseHdc(hdc)
4

2 に答える 2

1

はい、Graphicsクラスはテキストのスケーリングをサポートしています。ただし、最初にテキストをビットマップにレンダリングし、ビットマップを再スケーリングして、サイズ変更されたビットマップをプリンタードライバーに渡すことによってこれを行う必要があります。これらのビットマップはすべて、大きなスプーラファイルになります。

あなたは自分でテキストを正当化する必要があります。フレームワークではこれをサポートしていません。これを行う1つの方法は、豊富な編集コントロールを乗っ取って、正当化と印刷を処理させることです。バージョン5、msftedit.dllは、完全な正当化をサポートします。必要なコードを見つける最良の方法は、Windowsのワードパッドと同様に、RTBでテキストエディタを実装する多くのプロジェクトの1つを見つけることです。

于 2010-04-14T14:18:44.577 に答える
0

ここで推測していますが、フォントのサイズを拡大縮小したい割合のパーセンテージだけ増やす必要があります。

于 2010-04-14T12:26:37.593 に答える