Vb.net Net打印表单自动拟合

Vb.net Net打印表单自动拟合,vb.net,winforms,powerpacks,printform,Vb.net,Winforms,Powerpacks,Printform,我在申请表中自动调整打印表格时遇到了问题。 我现在的代码是这样的 Dim pf As New PowerPacks.Printing.PrintForm pf.Form = Me pf.PrinterSettings.DefaultPageSettings.Landscape = True pf.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnl

我在申请表中自动调整打印表格时遇到了问题。 我现在的代码是这样的

Dim pf As New PowerPacks.Printing.PrintForm
            pf.Form = Me
            pf.PrinterSettings.DefaultPageSettings.Landscape = True
            pf.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnly)
然而,它在打印页上截取了我表格的一大块。
我在互联网上找不到任何与Autofit有关的东西,所以希望你们中的一个人能想出一些办法。

就我个人而言,我不太喜欢PowerPacks.Printing.PrintForm。我宁愿只使用GDI+并对它的打印方式有更多的控制权。本文可能有助于:

导入系统图形
导入System.Windows.Forms
''' 
''打印表单的截图
''' 
''' 
公共类打印表单
'用法:
'Dim pf作为新打印表单(Me)
'pf.PrintPreview()
”“或者-
'pf.Print()
'
私有声明自动函数BitBlt Lib“gdi32.dll”(ByVal hDIDest作为IntPtr,ByVal nxtest作为Integer,ByVal nYDest作为Integer,ByVal nWidth作为Integer,ByVal nHeight作为Integer,ByVal hdcSrc作为IntPtr,ByVal nXSrc作为Integer,ByVal nyrc作为Integer,ByVal dwRop作为System.Int32)作为布尔的API调用,以帮助生成最终屏幕截图
私有mbmpScreenshot作为位图变量来存储屏幕截图
Private mblnscape作为布尔值=False
公共枚举PrintMode_枚举为整数
[默认值]
菲托帕奇
结束枚举
私有menuPrintMode作为PrintMode_ENUM=PrintMode_ENUM.Default
'
作为表格的专用mfrm
公共子新(ByVal frm作为表格)
mfrm=frm
呼叫抓取屏幕()
端接头
'
''' 
''确定当前页面的页面设置,例如方向
''' 
''' 
''' 
''' 
私有子查询页面设置(ByVal sender作为System.Object,ByVal e作为System.Drawing.Printing.QueryPageSettingsEventArgs)
'
Dim pgsTemp As System.Drawing.Printing.PageSettings=新建System.Drawing.Printing.PageSettings()
pgsTemp.scape=mblnscape
e、 页面设置=pgsTemp
'
端接头
'
公共子打印(横向为布尔值,打印模式为打印模式_ENUM,可选ByVal docname为String=“PrintForm”,可选ByVal PrinterName为String=”“)
mblnscape=景观
menuPrintMode=printMode
'创建文档对象
使用pdcNew作为新的Printing.PrintDocument
'
'关联事件处理程序以处理分页
AddHandler pdcNew.PrintPage,PrintPage的地址
AddHandler pdcNew.QueryPageSettings,QueryPageSettings的地址
'
使用docOutput作为Printing.PrintDocument=pdcNew
如果PrinterName>“”则
docOutput.PrinterSettings.PrinterName=PrinterName
如果结束
docOutput.DocumentName=docname
docOutput.Print()
终端使用
终端使用
端接头
'
''' 
''在屏幕上预览报告
''' 
''' 
公共子打印预览(横向为布尔值,打印模式为打印模式_枚举,可选ByVal docname为String=“PrintForm”,可选ByVal所有者为Form=Nothing)
mblnscape=景观
menuPrintMode=printMode
'
'创建文档对象
使用pdcNew作为新的Printing.PrintDocument
'
'关联事件处理程序以处理分页
AddHandler pdcNew.PrintPage,PrintPage的地址
AddHandler pdcNew.QueryPageSettings,QueryPageSettings的地址
'
使用ppvPreview作为新的PrintPreviewDialog
ppvPreview.Document=pdcNew
ppvPreview.FindForm.WindowsState=FormWindowsState.Maximized
如果没有(所有者),则
ppvPreview.ShowDialog()
其他的
ppvPreview.ShowDialog(所有者)
如果结束
终端使用
终端使用
端接头
子打印页(ByVal sender作为System.Object,ByVal e作为System.Drawing.Printing.PrintPageEventArgs)
尺寸g作为图形=e.图形的快捷方式
“g.DrawRectangle(Pens.Red,e.MarginBounds)”调试:使用此行检查边距
'
'处理打印的方法
使用objImageToPrint作为图形=e.图形
选择Case menuPrintMode
案例打印模式_ENUM.FitToPage
将RCT目标设置为矩形
如果(mbmpScreenshot.Width/mbmpScreenshot.Height)<(e.MarginBounds.Width/e.MarginBounds.Height),则
“合身高度
rct目标=新矩形(e.MarginBounds.X,e.MarginBounds.Y,CInt(mbmpScreenshot.Width*e.MarginBounds.Height/mbmpScreenshot.Height),e.MarginBounds.Height)
其他的
“配合宽度
rct目标=新矩形(e.MarginBounds.X、e.MarginBounds.Y、e.MarginBounds.Width、CInt(mbmpScreenshot.Height*e.MarginBounds.Width/mbmpScreenshot.Width))
如果结束
“g.DrawRectangle(Pens.Blue,rctTarget)”调试:使用此行检查目标矩形
objImageToPrint.DrawImage(MB屏幕截图,rctTarget)
Case-Else违约
objImageToPrint.DrawImage(MB屏幕截图,0,0)
结束选择
终端使用
'
e、 HasMorePages=False
端接头
'
专用子屏幕()
'执行屏幕截图,将结果保存到bmpScreenshot
Dim objGraphics As Graphics=mfrm.CreateGraphics
Dim rctForm As Rectangle=mfrm.ClientRectangle'包括边框超出了此演示程序的范围。看见http://support.microsoft.com/kb/84066 用于获取边框大小的GetSystemMetrics()API
'
常量SRCCOPY为整数=&hcc020
mbmpScreenshot=新位图(rctForm.Width、rctForm.Height、objGraphics)
Dim objGraphics2 As Graphics=Graphics.FromImage(MB屏幕截图)
Dim deviceContext1作为IntPtr=objGraphics.GetHdc
Dim deviceContext2作为IntPtr=objGraphics2.GetHdc
'
BitBlt(deviceContext2、rctForm.X、rctForm.Y、rctForm.Width、rctForm.Height、deviceContext1、0、0、SRCCOPY)
objGraphics.ReleaseHdc(deviceContext1)
objGraphics2.ReleaseHdc(deviceContext2)
端接头
'
末级
'
Imports System.Drawing
Imports System.Windows.Forms
''' <summary>
''' Prints a screengrab of the form
''' </summary>
''' <remarks></remarks>
Public Class PrintForm
  'USAGE:
  ' Dim pf As New PrintForm(Me)
  ' pf.PrintPreview()
  ' - or-
  ' pf.Print()
'
  Private Declare Auto Function BitBlt Lib "gdi32.dll" (ByVal hDIDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As System.Int32) As Boolean ' API call to help generate final screenshot
  Private mbmpScreenshot As Bitmap ' Variable to store screenshot
  Private mblnLandscape As Boolean = False
  Public Enum PrintMode_ENUM As Integer
    [Default]
    FitToPage
  End Enum
  Private menuPrintMode As PrintMode_ENUM = PrintMode_ENUM.Default
'
  Private mfrm As Form
  Public Sub New(ByVal frm As Form)
    mfrm = frm
    Call GrabScreen()
  End Sub
'
  ''' <summary>
  ''' Determines page settings for current page e.g. Orientation 
  ''' </summary>
  ''' <param name="sender"></param>
  ''' <param name="e"></param>
  ''' <remarks></remarks>
  Private Sub QueryPageSettings(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs)
'
    Dim pgsTemp As System.Drawing.Printing.PageSettings = New System.Drawing.Printing.PageSettings()
    pgsTemp.Landscape = mblnLandscape
    e.PageSettings = pgsTemp
'
  End Sub
'
  Public Sub Print(landscape As Boolean, printMode As PrintMode_ENUM, Optional ByVal docname As String = "PrintForm", Optional ByVal PrinterName As String = "")
    mblnLandscape = landscape
    menuPrintMode = printMode
    'create the document object
    Using pdcNew As New Printing.PrintDocument
'
      'wire up event handlers to handle pagination
      AddHandler pdcNew.PrintPage, AddressOf PrintPage
      AddHandler pdcNew.QueryPageSettings, AddressOf QueryPageSettings
'
      Using docOutput As Printing.PrintDocument = pdcNew
        If PrinterName > "" Then
          docOutput.PrinterSettings.PrinterName = PrinterName
        End If
        docOutput.DocumentName = docname
        docOutput.Print()
      End Using
    End Using
  End Sub
'
  ''' <summary>
  ''' Preview the Report on screen
  ''' </summary>
  ''' <remarks></remarks>
  Public Sub PrintPreview(landscape As Boolean, printMode As PrintMode_ENUM, Optional ByVal docname As String = "PrintForm", Optional ByVal Owner As Form = Nothing)
    mblnLandscape = landscape
    menuPrintMode = printMode
'
    'create the document object
    Using pdcNew As New Printing.PrintDocument
'
      'wire up event handlers to handle pagination
      AddHandler pdcNew.PrintPage, AddressOf PrintPage
      AddHandler pdcNew.QueryPageSettings, AddressOf QueryPageSettings
'
      Using ppvPreview As New PrintPreviewDialog
        ppvPreview.Document = pdcNew
        ppvPreview.FindForm.WindowState = FormWindowState.Maximized
        If IsNothing(Owner) Then
          ppvPreview.ShowDialog()
        Else
          ppvPreview.ShowDialog(Owner)
        End If
      End Using
    End Using
  End Sub
  Sub PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    Dim g As Graphics = e.Graphics 'shortcut
    'g.DrawRectangle(Pens.Red, e.MarginBounds) 'DEBUG: use this line to check margins        
'
    ' Method that handles the printing
    Using objImageToPrint As Graphics = e.Graphics
      Select Case menuPrintMode
        Case PrintMode_ENUM.FitToPage
          Dim rctTarget As Rectangle
          If (mbmpScreenshot.Width / mbmpScreenshot.Height) < (e.MarginBounds.Width / e.MarginBounds.Height) Then
            'fit height
            rctTarget = New Rectangle(e.MarginBounds.X, e.MarginBounds.Y, CInt(mbmpScreenshot.Width * e.MarginBounds.Height / mbmpScreenshot.Height), e.MarginBounds.Height)
          Else
            'fit width
            rctTarget = New Rectangle(e.MarginBounds.X, e.MarginBounds.Y, e.MarginBounds.Width, CInt(mbmpScreenshot.Height * e.MarginBounds.Width / mbmpScreenshot.Width))
          End If
          'g.DrawRectangle(Pens.Blue, rctTarget) 'DEBUG: use this line to check target rectangle
          objImageToPrint.DrawImage(mbmpScreenshot, rctTarget)
        Case Else 'default
          objImageToPrint.DrawImage(mbmpScreenshot, 0, 0)
      End Select
    End Using
'
    e.HasMorePages = False
  End Sub
'
  Private Sub GrabScreen()
    ' Performs a screenshot, saving results to bmpScreenshot
    Dim objGraphics As Graphics = mfrm.CreateGraphics
    Dim rctForm As Rectangle = mfrm.ClientRectangle 'including the border is beyond the scope of this demo program. See http://support.microsoft.com/kb/84066 for GetSystemMetrics() API to get  size of border
'
    Const SRCCOPY As Integer = &HCC0020
    mbmpScreenshot = New Bitmap(rctForm.Width, rctForm.Height, objGraphics)
    Dim objGraphics2 As Graphics = Graphics.FromImage(mbmpScreenshot)
    Dim deviceContext1 As IntPtr = objGraphics.GetHdc
    Dim deviceContext2 As IntPtr = objGraphics2.GetHdc
'
    BitBlt(deviceContext2, rctForm.X, rctForm.Y, rctForm.Width, rctForm.Height, deviceContext1, 0, 0, SRCCOPY)
    objGraphics.ReleaseHdc(deviceContext1)
    objGraphics2.ReleaseHdc(deviceContext2)
  End Sub
'
End Class
'