2

完全に印刷したいスクロール可能なフォームがあります。

私はすでにこのコードを使用して印刷しようとしました:

    Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    Me.PrintForm.PrintAction = Printing.PrintAction.PrintToPreview
    Me.PrintForm.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable) 
End Sub

そして、結果はまったく正確ではありません。

私の問題を示すために、ここにいくつかの写真があります:

これは私が望む結果です(もちろん、スクロール可能なすべてのコンテンツも印刷したいです)

ご覧のとおり、この画像には画像に必要なすべての幅が含まれていますが、印刷画面の画像であるため、印刷可能なバージョンのフォームに必要なスクロール可能な領域は含まれていません。 良い結果

これが私のコードから得られるものです:

ここでわかるように、フォームの幅の約60%、高さの50%しか取得できず、明らかに、スクロール可能な領域は取得できません。

悪い結果

スクロール可能な領域を含むフォーム全体を印刷したいだけの品質は気にしません。

4

5 に答える 5

3

この行で:

PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

スクロール可能なフォームPrintOption.Scrollableがある場合にのみ機能するようです。フォーム内にスクロール可能なコントロール(おそらく) があります。この場合、その領域はプリンターに拡張されません。比較:Panel

スクロール可能なコントロール:

ここに画像の説明を入力

次のように出力します。

ここに画像の説明を入力

スクロール可能なフォーム:

ここに画像の説明を入力

次のように出力します。

ここに画像の説明を入力

Microsoft からのこの公式の回答によると、スクロール可能なコントロールをキャプチャすることはできませんPrintFormPrintDocument といくつかのカスタム コーディングを使用すると、スクロール可能な TextBox などの単純なケースで使用できます。あなたの場合、さらにカスタムコーディングを行う必要があるかもしれません。PrintDocument1.PrintPageあなたがそれまでなら、ハンドリングは始めるのに最適な場所のように見えます。

于 2013-03-14T18:29:12.220 に答える
1

答えは記事
にあると思いますが、 必要なのは FormPrinting ライブラリを参照する (またはソースをソリューションにインポートする) ことだけです。

Private Sub btnPrint_Click(object sender, EventArgs e)
        {
            var fp = new FormPrinting.FormPrinting(this);                
            fp.Print();
        }

印刷業務を行っていただきます。
ライブラリをテストしましたが、画像などのスクロール可能なコンテンツに問題はありませんでした....

于 2013-03-19T16:16:26.020 に答える
1

あなたが示しているものに基づいて...スクロール可能な領域はパネルのようなコンテナのようです。その場合、フォームの印刷は問題ではなく、スクロール可能なコントロールを印刷しています。

コントロールからビットマップを作成するには、このプロジェクトをご覧ください: http://www.codeproject.com/Articles/35734/Print-a-WinForms-User-Control

EDIT:考え直して、そのリンクのコードが実際のスクロールの問題にも対処しているとは思いません。

次の 2 つのいずれかを行う必要があると思います: 1) 一時的にパネルのサイズを変更して、スクロールバーが消えるのに十分な大きさにしてから、サイズを元に戻します。スクロール可能な要素をネストし、ページネーションなどを適切に処理します。

オプション #2 は大変な作業のように聞こえるかもしれませんが、新しいパネルを作成し、印刷する各コントロールを複製してパネルに追加し (スクロールを避けるために必要に応じてサイズを変更します)、パネルを廃棄します。

于 2013-03-14T19:03:22.663 に答える
0

コードの MSDN フォーラムで、 このようなコードを確認してください。

  1. ツールボックスで、[Visual Basic PowerPacks] タブをクリックし、PrintForm コンポーネントをフォームにドラッグします。

  2. PrintForm コンポーネントがコンポーネント トレイに追加されます。

  3. [プロパティ] ウィンドウで、PrintAction プロパティを PrintToPrinter に設定します。

次のコードを適切なイベント ハンドラー (たとえば、印刷ボタンの Click イベント ハンドラー) に追加します。

PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.Scrollable)

ここにあなたと 同じ質問があり、回答されています。

于 2013-03-15T03:44:03.740 に答える
0

追加のライブラリや拡張機能なしで解決できる同様の問題がありました。ほとんどの Forms コントロールで使用できる DrawToBitmap メソッドを使用すると簡単です。

    Dim ctrlColl As ControlCollection
    Dim i As Integer = 0

    ' Get collection of controls
    ctrlColl = Me.Controls

    ' create bitmap array
    Dim Bitmaps(ctrlColl.Count - 1) As Bitmap

    ' remove controls you have hidden before printing
    For Each ctrl As Control In ctrlColl
        If Not ctrl.Visible Then
            ctrlColl.Remove(ctrl)
        End If
    Next

    ' Loop through controls
    For Each ctrl As Control In ctrlColl
        ' create bitmap from control.DrawToBitmap
        Bitmaps(i) = New Bitmap(ctrl.Width, ctrl.Height)
        ctrl.DrawToBitmap(Bitmaps(i), ctrl.ClientRectangle)
        i = i + 1
    Next

    ' Print each bitmap in array
    i = 0
    For Each bmp As Bitmap In Bitmaps
        e.Graphics.DrawImage(bmp, New Point(ctrlColl(i).Location.X, ctrlColl(i).Location.Y))
        i = i + 1
    Next

End Sub
于 2016-10-18T21:33:32.643 に答える