Artigo: 811401 - Última revisão: terça-feira, 13 de Novembro de 2007 - Revisão: 5.5

Como imprimir o conteúdo de um controlo RichTextBox utilizando o 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 obter uma versão de Microsoft Visual Basic 6.0 deste artigo, consulte 146022  (http://support.microsoft.com/kb/146022/EN-US/ ) .
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 812425  (http://support.microsoft.com/kb/812425/ ) .

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Este artigo passo a passo descreve como imprimir o conteúdo de um controlo RichTextBox . O controlo RichTextBox não fornece um método para imprimir o respectivo conteúdo. No entanto, pode expandir a classe RichTextBox utilizar mensagem EM_FORMATRANGE. Pode então enviar o conteúdo de um RichTextBox para um dispositivo de saída, tal como uma impressora.

Criar um controlo RichTextBoxPrintCtrl

Para expandir a classe RichTextBox e utilizar EM_FORMATRANGE para imprimir o conteúdo do controlo RichTextBox , siga estes passos:
  1. Utilizar o Microsoft Visual Basic .NET ou Microsoft Visual Basic 2005 para criar uma nova classe denominado RichTextBoxPrintCtrl projecto da biblioteca.

    Por predefinição, é criado Class1.vb.
  2. Altere o nome do ficheiro Class1.vb para RichTextBoxPrintCtrl.vb .
  3. No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em ' Adicionar referência .
  4. Na caixa de diálogo Adicionar referência , faça duplo clique em System.Drawing.dll e, em seguida, faça duplo clique em System.Windows.Forms.dll .
  5. Para adicionar referências, clique em OK .
  6. Elimine 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 Criar soluções , no menu criar .

Testar o controlo

Para testar o controlo, siga estes passos:
  1. Crie um novo projecto de aplicação do Windows utilizando o Visual Basic .NET ou Visual Basic 2005.

    Por predefinição, é criado Form1.VB.
  2. Da caixa de ferramentas, arraste um botão Form1. Alterar o nome para btnPageSetup e altere o texto para Configurar página .
  3. Da caixa de ferramentas, arraste outro botão Form1. Alterar o nome para btnPrintPreview e altere o texto para Pré-visualização .
  4. Da caixa de ferramentas, arraste outro botão Form1. Alterar o nome para btnPrint e altere o texto para Imprimir .
  5. Na caixa de ferramentas, faça duplo clique PrintDialog , faça duplo clique em PrintPreviewDialog , faça duplo clique em PrintDocument e, em seguida, faça duplo clique em PageSetupDialog para adicionar estes controlos ao Form1.
  6. Modifica a propriedade de documento de PrintDialog1 PrintPreviewDialog1 e PageSetupDialog1 para PrintDocument1 .
  7. No menu Ferramentas , clique em Personalizar caixa de ferramentas dos controlos .
  8. Clique em Componentes do .NET Framework , clique em Procurar , clique para seleccionar RichTextBoxPrintCtrl.dll e, em seguida, clique em OK .
  9. Da caixa de ferramentas, arraste RichTextBoxPrintCtrl Form1.
  10. No Solution Explorer, clique com o botão direito do rato em Form1.VB e, em seguida, clique em Código .
  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 a aplicação, clique em Iniciar , no menu Debug .
  13. Escreva o texto na RichTextBoxPrintCtrl .
  14. Para definir as definições de página, clique em Configurar página .
  15. Para ver uma pré-visualização da página, clique em impressão pré-visualização .
  16. Para imprimir o conteúdo do RichTextBoxPrintCtrl , clique em Imprimir .

Referências

Para mais informações, visite a documentação do Microsoft .NET Framework Software Development Kit (SDK) ou o seguinte MSDN online ajuda do Web site:
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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/ )