ID do artigo: 811401 - Última revisão: terça-feira, 13 de novembro de 2007 - Revisão: 5.5

Como imprimir o conteúdo de um controle RichTextBox usando Visual Basic .NET ou Visual Basic 2005

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Para uma versão deste artigo do Microsoft Visual Basic 6.0, consulte 146022  (http://support.microsoft.com/kb/146022/EN-US/ ) .
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 812425  (http://support.microsoft.com/kb/812425/ ) .

Nesta página

Expandir tudo | Recolher tudo

Sumário

Este artigo passo a passo descreve como imprimir o conteúdo de um controle RichTextBox . O controle RichTextBox não fornece um método para imprimir seu conteúdo. No entanto, você pode estender a classe RichTextBox para usar a mensagem EM_FORMATRANGE. Você pode então enviar o conteúdo de um RichTextBox para um dispositivo de saída, como uma impressora.

Criar um controle RichTextBoxPrintCtrl

Para estender a classe RichTextBox e usar EM_FORMATRANGE para imprimir o conteúdo do controle RichTextBox , execute estas etapas:
  1. Use o Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 para criar uma nova classe projeto Library chamado RichTextBoxPrintCtrl .

    Por padrão, Class1.vb é criado.
  2. Altere o nome do arquivo Class1.vb para RichTextBoxPrintCtrl.vb .
  3. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .
  4. Na caixa de diálogo Add Reference , clique duplo em System.Drawing.dll e, em seguida, clique duas vezes em System.Windows.Forms.dll .
  5. Para adicionar referências, clique em OK .
  6. Exclua o código existente no RichTextBoxPrintCtrl.vb .
  7. Copy the following code to RichTextBoxPrintCtrl.vb:
    Option Explicit On 
    
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Runtime.InteropServices
    Imports System.Drawing.Printing
    
    Namespace RichTextBoxPrintCtrl
       Public Class RichTextBoxPrintCtrl
          Inherits RichTextBox
          ' Convert the unit that is used by the .NET framework (1/100 inch) 
          ' and the unit that is used by Win32 API calls (twips 1/1440 inch)
          Private Const AnInch As Double = 14.4
    
          <StructLayout(LayoutKind.Sequential)> _
           Private Structure RECT
             Public Left As Integer
             Public Top As Integer
             Public Right As Integer
             Public Bottom As Integer
          End Structure
    
          <StructLayout(LayoutKind.Sequential)> _
          Private Structure CHARRANGE
             Public cpMin As Integer          ' First character of range (0 for start of doc)
             Public cpMax As Integer          ' Last character of range (-1 for end of doc)
          End Structure
    
          <StructLayout(LayoutKind.Sequential)> _
          Private Structure FORMATRANGE
             Public hdc As IntPtr             ' Actual DC to draw on
             Public hdcTarget As IntPtr       ' Target DC for determining text formatting
             Public rc As Rect                ' Region of the DC to draw to (in twips)
             Public rcPage As Rect            ' Region of the whole DC (page size) (in twips)
             Public chrg As CHARRANGE         ' Range of text to draw (see above declaration)
          End Structure
    
          Private Const WM_USER As Integer = &H400
          Private Const EM_FORMATRANGE As Integer = WM_USER + 57
    
          Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr
    
          ' Render the contents of the RichTextBox for printing
          '	Return the last character printed + 1 (printing start from this point for next page)
          Public Function Print(ByVal charFrom As Integer, ByVal charTo As Integer, ByVal e As PrintPageEventArgs) As Integer
    
             ' Mark starting and ending character 
             Dim cRange As CHARRANGE
             cRange.cpMin = charFrom
             cRange.cpMax = charTo
    
             ' Calculate the area to render and print
             Dim rectToPrint As RECT
             rectToPrint.Top = e.MarginBounds.Top * AnInch
             rectToPrint.Bottom = e.MarginBounds.Bottom * AnInch
             rectToPrint.Left = e.MarginBounds.Left * AnInch
             rectToPrint.Right = e.MarginBounds.Right * AnInch
    
             ' Calculate the size of the page
             Dim rectPage As RECT
             rectPage.Top = e.PageBounds.Top * AnInch
             rectPage.Bottom = e.PageBounds.Bottom * AnInch
             rectPage.Left = e.PageBounds.Left * AnInch
             rectPage.Right = e.PageBounds.Right * AnInch
    
             Dim hdc As IntPtr = e.Graphics.GetHdc()
    
             Dim fmtRange As FORMATRANGE
             fmtRange.chrg = cRange                 ' Indicate character from to character to 
             fmtRange.hdc = hdc                     ' Use the same DC for measuring and rendering
             fmtRange.hdcTarget = hdc               ' Point at printer hDC
             fmtRange.rc = rectToPrint              ' Indicate the area on page to print
             fmtRange.rcPage = rectPage             ' Indicate whole size of page
    
             Dim res As IntPtr = IntPtr.Zero          
    
             Dim wparam As IntPtr = IntPtr.Zero
             wparam = New IntPtr(1)
    
             ' Move the pointer to the FORMATRANGE structure in memory
             Dim lparam As IntPtr = IntPtr.Zero
             lparam = Marshal.AllocCoTaskMem(Marshal.SizeOf(fmtRange))
             Marshal.StructureToPtr(fmtRange, lparam, False)
    
             ' Send the rendered data for printing 
             res = SendMessage(Handle, EM_FORMATRANGE, wparam, lparam)
    
             ' Free the block of memory allocated
             Marshal.FreeCoTaskMem(lparam)
    
             ' Release the device context handle obtained by a previous call
             e.Graphics.ReleaseHdc(hdc)
    
             ' Return last + 1 character printer
             Return res.ToInt32()
          End Function
    
       End Class
    End Namespace
    
  8. Para criar RichTextBoxPrintCtrl.dll , clique em Build Solution no menu Build .

Testar o controle

Para testar o controle, execute essas etapas:
  1. Crie um novo projeto Windows Application usando Visual Basic .NET ou Visual Basic 2005.

    Por padrão, Form1.vb é criado.
  2. A partir da caixa de ferramentas, arraste um botão para Form1. Altere o nome para btnPageSetup e altere o texto para Configurar página .
  3. A partir da caixa de ferramentas, arraste o outro botão para Form1. Altere o nome para btnPrintPreview e altere o texto para Visualização .
  4. A partir da caixa de ferramentas, arraste o outro botão para Form1. Altere o nome para btnPrint e altere o texto para impressão .
  5. Na caixa de ferramentas, clique duas vezes em PrintDialog , clique duas vezes em PrintPreviewDialog , clique duas vezes em PrintDocument e, em seguida, clique duas vezes PageSetupDialog para adicionar esses controles para Form1.
  6. Modifica a propriedade Document de PrintDialog1 , PrintPreviewDialog1 e PageSetupDialog1 para PrintDocument1 .
  7. No menu Ferramentas , clique em Customize Toolbox .
  8. Clique em .NET Framework Components , clique em Procurar , clique para selecionar RichTextBoxPrintCtrl.dll e, em seguida, clique em OK .
  9. Na caixa de ferramentas, arraste RichTextBoxPrintCtrl para Form1.
  10. Na Solution Explorer, clique com o botão direito do mouse em Form1.vb e, em seguida, clique em View Code .
  11. Adicione o seguinte código à classe Form1:
       Private checkPrint As Integer
    
       Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
          checkPrint = 0
       End Sub
    
       Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
          ' Print the content of the RichTextBox. Store the last character printed.
          checkPrint = RichTextBoxPrintCtrl1.Print(checkPrint, RichTextBoxPrintCtrl1.TextLength, e)
    
          ' Look for more pages
          If checkPrint < RichTextBoxPrintCtrl1.TextLength Then
             e.HasMorePages = True
          Else
             e.HasMorePages = False
          End If
       End Sub
    
       Private Sub btnPageSetup_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPageSetup.Click.Click
          PageSetupDialog1.ShowDialog()
       End Sub
    
       Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click
          If PrintDialog1.ShowDialog() = DialogResult.OK Then
             PrintDocument1.Print()
          End If
       End Sub
    
       Private Sub btnPrintPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrintPreview.Click
          PrintPreviewDialog1.ShowDialog()
       End Sub
  12. Para executar o aplicativo, clique em Iniciar no menu Debug .
  13. Digite texto na RichTextBoxPrintCtrl .
  14. Para definir as configurações de página, clique em Configurar página .
  15. Para ver uma visualização da página, clique em impressão visualizar .
  16. Para imprimir o conteúdo da RichTextBoxPrintCtrl , clique em Imprimir .

Referências

Para obter mais informações, visite a documentação do Microsoft .NET Framework Software Development Kit (SDK) ou a seguinte site da Ajuda on-line de MSDN:
Classe RichTextBox
http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.windows.forms.richtextbox(vs.71).aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbvs2005swept kbvs2005applies kbprint kbinheritance kbwindowsforms kbctrl kbcontrol kbhowtomaster kbhowto KB811401 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 811401  (http://support.microsoft.com/kb/811401/en-us/ )