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. NET, consulte 811401
(http://support.microsoft.com/kb/811401/EN-US/
)
.
Este artigo passo a passo descreve como imprimir o conteúdo de um controle RichTextBox . O controle RichTextBox não fornece qualquer método para imprimir o conteúdo do RichTextBox. Você pode estender a classe RichTextBox para usar a mensagem EM_FORMATRANGE para enviar o conteúdo de um controle RichTextBox para um dispositivo de saída, como impressora.
O exemplo a seguir descreve como estender a classe RichTextBox e como usar EM_FORMATRANGE para imprimir o conteúdo do controle RichTextBox .
No Visual translation from VPE for Csharp .NET ou Visual translation from VPE for Csharp 2005, crie um novo projeto Class Library chamado RichTextBoxPrintCtrl. Por padrão, Class1.cs é criado.
Altere o nome de Class1.cs para RichTextBoxPrintCtrl.cs.
No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .
Na caixa de diálogo Add Reference , clique duas vezes em System.Windows.Forms.dll e System.Drawing.dll e, em seguida, clique em OK .
Replace the existing code in RichTextBoxPrintCtrl.cs with the following code:
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Drawing.Printing;
namespace RichTextBoxPrintCtrl
{
public class RichTextBoxPrintCtrl:RichTextBox
{
//Convert the unit used by the .NET framework (1/100 inch)
//and the unit used by Win32 API calls (twips 1/1440 inch)
private const double anInch = 14.4;
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
[StructLayout(LayoutKind.Sequential)]
private struct CHARRANGE
{
public int cpMin; //First character of range (0 for start of doc)
public int cpMax; //Last character of range (-1 for end of doc)
}
[StructLayout(LayoutKind.Sequential)]
private struct FORMATRANGE
{
public IntPtr hdc; //Actual DC to draw on
public IntPtr hdcTarget; //Target DC for determining text formatting
public RECT rc; //Region of the DC to draw to (in twips)
public RECT rcPage; //Region of the whole DC (page size) (in twips)
public CHARRANGE chrg; //Range of text to draw (see earlier declaration)
}
private const int WM_USER = 0x0400;
private const int EM_FORMATRANGE = WM_USER + 57;
[DllImport("USER32.dll")]
private static extern IntPtr SendMessage (IntPtr hWnd , int msg , IntPtr wp, IntPtr lp);
// Render the contents of the RichTextBox for printing
// Return the last character printed + 1 (printing start from this point for next page)
public int Print( int charFrom, int charTo,PrintPageEventArgs e)
{
//Calculate the area to render and print
RECT rectToPrint;
rectToPrint.Top = (int)(e.MarginBounds.Top * anInch);
rectToPrint.Bottom = (int)(e.MarginBounds.Bottom * anInch);
rectToPrint.Left = (int)(e.MarginBounds.Left * anInch);
rectToPrint.Right = (int)(e.MarginBounds.Right * anInch);
//Calculate the size of the page
RECT rectPage;
rectPage.Top = (int)(e.PageBounds.Top * anInch);
rectPage.Bottom = (int)(e.PageBounds.Bottom * anInch);
rectPage.Left = (int)(e.PageBounds.Left * anInch);
rectPage.Right = (int)(e.PageBounds.Right * anInch);
IntPtr hdc = e.Graphics.GetHdc();
FORMATRANGE fmtRange;
fmtRange.chrg.cpMax = charTo; //Indicate character from to character to
fmtRange.chrg.cpMin = charFrom;
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 size of page
IntPtr res = IntPtr.Zero;
IntPtr wparam = IntPtr.Zero;
wparam = new IntPtr(1);
//Get the pointer to the FORMATRANGE structure in memory
IntPtr lparam= 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();
}
}
}
No menu Build , clique em Build Solution para criar RichTextBoxPrintCtrl.dll.
No Visual translation from VPE for Csharp .NET ou Visual translation from VPE for Csharp 2005, criar um novo Windows Application projeto. Por padrão, Form1.cs é criado.
Observação O código deve ser alterado no Visual Studio 2005. Quando você cria um projeto Windows Forms, translation from VPE for Csharp Visual adiciona um formulário para o projeto por padrão. Este formulário é denominado Form1. Os dois arquivos que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever seu código no Form1.cs. O ficheiro Designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as ações que você executou adicionando controles. Para obter mais informações sobre o Windows Forms Designer no Visual translation from VPE for Csharp 2005, visite o seguinte site:
Arraste um controle de botão da caixa de ferramentas para Form1. Altere a propriedade Name btnPageSetup e a propriedade Text para Configurar página .
Arraste outro controle de botão da caixa de ferramentas para Form1. Altere a propriedade Name para btnPrintPreview e a propriedade Text para Visualização .
Arraste outro controle de botão da caixa de ferramentas para Form1. Altere a propriedade Name para btnPrint e a propriedade de texto para Imprimir .
Na caixa de ferramentas, clique duas vezes PrintDialog , PrintPreviewDialog , PrintDocument e PageSetupDialog para adicionar esses controles para Form1.
Modificar as propriedades documento de PrintDialog1 , PrintPreviewDialog1 e os controles PageSetupDialog1 PrintDocument1 .
No menu Ferramentas , clique em Customize Toolbox .
Na guia .NET Framework Components , clique em Procurar , clique para selecionar RichTextBoxPrintCtrl.dll e, em seguida, clique em OK .
Arraste RichTextBoxPrintCtrl da caixa de ferramentas para Form1.
No Solution Explorer, clique com o botão direito do mouse em Form1.cs e, em seguida, clique em View Code .
Acrescentar o código a seguir ao método InitializeComponent :
this.printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.printDocument1_BeginPrint);
this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
this.btnPrint.Click += new System.EventHandler(this.btnPrint_Click);
this.btnPrintPreview.Click += new System.EventHandler(this.btnPrintPreview_Click);
this.btnPageSetup.Click += new System.EventHandler(this.btnPageSetup_Click);
Adicione o seguinte código à classe Form1:
private int checkPrint;
private void btnPageSetup_Click(object sender, System.EventArgs e)
{
pageSetupDialog1.ShowDialog();
}
private void btnPrintPreview_Click(object sender, System.EventArgs e)
{
printPreviewDialog1.ShowDialog();
}
private void btnPrint_Click(object sender, System.EventArgs e)
{
if (printDialog1.ShowDialog() == DialogResult.OK)
printDocument1.Print();
}
private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
checkPrint = 0;
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
// Print the content of RichTextBox. Store the last character printed.
checkPrint = richTextBoxPrintCtrl1.Print(checkPrint, richTextBoxPrintCtrl1.TextLength, e);
// Check for more pages
if (checkPrint < richTextBoxPrintCtrl1.TextLength)
e.HasMorePages = true;
else
e.HasMorePages = false;
}
No menu Debug , clique em Iniciar para executar o aplicativo. Form1 é exibida.
Digite algum texto no RichTextBoxPrintCtrl.
Clique em Configurar página para definir as configurações de página.
Clique em Visualizar impressão para exibir a visualização de impressão da página.
Clique em Imprimir para imprimir o conteúdo da RichTextBoxPrintCtrl.
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: 812425
(http://support.microsoft.com/kb/812425/en-us/
)
Quanto esforço foi necessário para seguir os procedimentos deste artigo?
Muito baixo
Baixo
Moderado
Alto
Muito alto
Diga-nos o porque e o que podemos fazer para melhorar esta informação
Obrigado! Seus comentários são usados para nos ajudar a aperfeiçoar o conteúdo de suporte. Para obter mais opções de ajuda, visite a Home Page de Ajuda e Suporte.