首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.Net PrintForm自动调整

VB.Net PrintForm自动调整
EN

Stack Overflow用户
提问于 2012-03-20 03:26:56
回答 2查看 8.7K关注 0票数 3

我在应用程序中自动调整打印的表单时遇到了问题。我现在的代码是这样的。

代码语言:javascript
复制
Dim pf As New PowerPacks.Printing.PrintForm
            pf.Form = Me
            pf.PrinterSettings.DefaultPageSettings.Landscape = True
            pf.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.ClientAreaOnly)

然而,它在打印页面上切掉了我的表单的一大块。我在互联网上找不到任何与Autofit有关的东西,所以希望你们中的一个人能想出一些东西来。

EN

回答 2

Stack Overflow用户

发布于 2012-03-20 14:37:14

代码语言:javascript
复制
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
'
票数 4
EN

Stack Overflow用户

发布于 2012-03-20 03:33:29

就我个人而言,我不太喜欢PowerPacks.Printing.PrintForm。我宁愿只使用GDI+,并更好地控制它的打印方式。这篇文章可能会有所帮助:

http://www.c-sharpcorner.com/uploadfile/srajlaxmi/printing-windows-form-in-C-Sharp-net/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9776561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档