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 Microsoft Visual Basic .NET versão deste artigo, consulte 811401
(http://support.microsoft.com/kb/811401/EN-US/
)
.
Este artigo passo a passo descreve como imprimir o conteúdo de um controlo RichTextBox . O controlo RichTextBox não fornece qualquer método para imprimir o conteúdo do RichTextBox. Pode expandir a classe RichTextBox utilizar EM_FORMATRANGE mensagem para enviar o conteúdo de um controlo RichTextBox para um dispositivo de saída como impressora.
O exemplo que se segue descreve como expandir a classe RichTextBox e como utilizar EM_FORMATRANGE para imprimir o conteúdo do controlo RichTextBox .
No Visual C# .NET ou Visual C# 2005, crie um novo projecto de biblioteca de classes denominado RichTextBoxPrintCtrl. Por predefinição, é criado Class1.cs.
Altere o nome de Class1.cs para RichTextBoxPrintCtrl.cs.
No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em Add Reference .
Na caixa de diálogo Adicionar referência , faça duplo clique em System.Drawing.dll e System.Windows.Forms.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 criar , clique em criar soluções para criar RichTextBoxPrintCtrl.dll.
No Visual C# .NET ou Visual C# 2005, criar uma nova aplicação do Windows projecto. Por predefinição, é criado Form1.cs.
Nota O código deve ser alterado no Visual Studio 2005. Quando cria um projecto de Windows Forms, Visual C# adiciona um formulário ao projecto por predefinição. Este formulário é denominado Form1. Os dois ficheiros que representam o formulário são denominados Form1.cs e Form1.Designer.cs. Tem de escrever o código no Form1.cs. O ficheiro Designer.cs é onde o Windows Forms Designer escreve o código que implementa todas as acções efectuadas, adicionando controlos. Para obter mais informações sobre o Windows Forms Designer no Visual C# 2005, visite o seguinte Web site da Microsoft:
Arraste um controlo de botão da caixa de ferramentas ao Form1. Altere a propriedade Name para btnPageSetup e a propriedade de texto para Configurar página .
Arraste outro botão de controlo da caixa de ferramentas ao Form1. Altere a propriedade Name para btnPrintPreview e a propriedade de texto para Pré-visualização .
Arraste outro botão de controlo da caixa de ferramentas ao Form1. Altere a propriedade Name para btnPrint e a propriedade de texto para Imprimir .
Na caixa de ferramentas, faça duplo clique em PrintDialog , PrintPreviewDialog , PrintDocument e PageSetupDialog para adicionar estes controlos ao Form1.
Modificar as propriedades documentos de PrintDialog1 PrintPreviewDialog1 e os controlos PageSetupDialog1 PrintDocument1 .
No menu Ferramentas , clique em Personalizar caixa de ferramentas dos controlos .
No separador do .NET Framework Components , clique em Procurar , clique para seleccionar RichTextBoxPrintCtrl.dll e, em seguida, clique em OK .
Arraste RichTextBoxPrintCtrl da caixa de ferramentas ao Form1.
No Solution Explorer, clique com o botão direito do rato em Form1.cs e, em seguida, clique em Código .
Acrescentar o código seguinte 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 a aplicação. É apresentado o Form1.
Escreva algum texto em RichTextBoxPrintCtrl.
Clique em Configurar página para configurar as definições de página.
Faça clique sobre Pré-visualização para visualizar a impressão pré-visualização da página.
Clique em Imprimir para imprimir o conteúdo do 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 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: 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
O que podemos fazer para melhor estas informações?
Para proteger a sua privacidade, não inclua as informações de contacto nos comentários.
Obrigado! Os seus comentários serão utilizados para nos ajudar a melhorar o conteúdo do suporte. Para obter mais opções de assistência, visite a Home Page da Ajuda e Suporte.