Back-End

21 ago, 2015

Editor de texto com RichTextBox e PrintDocument – Parte 02

Publicidade

No artigo de hoje vou mostrar como podemos criar um pequeno editor de textos usando os recursos do controle RichTextBox na linguagem C#. Veremos também como imprimir e visualizar a impressão do texto usando o PrintDocument.

Na primeira parte do artigo eu criei o projeto defini a interface com o usuário, além de implementar a maior parte das funcionalidades do editor de texto. Hoje eu vou implementar as funcionalidades para exibir as configurações da impressora, visualizar a impressão e imprimir o texto carregado no editor.

Recursos usados: Visual Studio Community 2013.

Implementando as opções de impressão do texto

Abra projeto RichTextBox_Imprimir criado no artigo anterior usando o VS Community 2013 clique em Open Project e selecione o projeto abrindo-o.

Nesta parte, iremos trabalhar com os componentes:

  • PrintDialog
  • PrintDocument
  • PrintPreviewDialog

Configurações da impressora

Nesta opção exibimos as configurações da impressora padrão. Esta rotina atribui o componente PrintDialog ao documento a ser impresso: prntdlg1.Document = prntdoc1.

Nota: Quando você cria uma instância de PrintDialog, as propriedades read/write são definidas para os valores iniciais os quais são:

Propriedade Valor Inicial
AllowSomePages false
AllowPrintToFile true
AllowSelection false
Document null (Nothing no VB)
PrinterSettings null (Nothing no VB)
PrintToFile false
ShowHelp false
ShowNetwork true

O diálogo é exibido usando o componente ShowDialog de maneira que o usuário pode definir as suas opções de impressão e decidir se imprime ou não o documento.

macoratti10

Visualizar impressão

Nesta opção usamos o componente PrintPreviewDialog para visualizar a impressão.

O componente PrintPreview também dispara o evento PrintPage, mas ao invés de direcionar para a impressora, a saída é direcionada para a tela de visualização.

macoratti11

Imprimir

Para realizar a impressão do documento usamos o método Print do componente PrintDocument. Para concluir a impressão precisamos definir o código no evento PrintPage.

O evento PrintPage é automaticamente chamado pelo sistema para imprimir a página selecionada. O evento é do tipo PrintPageEventArgs e contém o contexto do dispositivo e.Graphics usado para imprimir.

A propriedade PageBounds da classe PrintPageEventArgs representa um retângulo da página inteira, já a propriedade MarginBounds representa um retângulo da área do interior das margens, conforme mostra a figura ao lado.
Ambas as propriedades são usadas na unidade de 100 dpi, de maneira que um formato carta de 8.5 x 11 polegadas terá sempre um retângulo PageBounds de medida igual a {0, 0, 850, 1100}. Com uma margem padrão de 1 polegada, o retângulo MarginBounds terá as seguintes medidas {100, 100, 650, 900}.

A margem é útil porque muitas impressoras não podem imprimir a partir do início das bordas das páginas. Para evitar a perda de impressão nestes casos, o objeto Graphics que você manuseia quando você imprime, inicia a impressão no topo superior esquerdo da área de impressão da página.

c_prn14

Neste exemplo efetuamos a leitura de cada linha de texto do controle RichTextBox usando um StringReader que nos dá a habilidade de tratar uma string como um stream e tomar vantagem da função ReadLine para ler cada linha de texto no controle.

Podemos calcular a posição das linhas baseadas nas margens e na altura da fonte, e com o objetivo de prever a altura da fonte para a impressora, nós passamos para ela o contexto do dispositivo da impressora na função GetHeight (printFont.GetHeight(ev.Graphics()), pois a altura da fonte na tela em pixels é diferente da fonte na impressora.

O atributo HasMorePages da classe PrintPageEventArg é continuamente verificado de maneira que o evento PrintPage é disparado se existirem mais linhas do que a página atual pode suportar.

Captura de Tela 2015-08-20 às 11.05.49

Captura de Tela 2015-08-20 às 11.06.15

Ajuda

Na opção Ajuda exibimos o formulário form2.cs que contém o seguinte leiaute e é composto pelos controles: PictureBox, GroupBox, Label, LinkLabel e Button.

Para incluir o formulário no projeto, clique no menu PROJECT -> Add Windows Forms; (abaixo a direita vemos o código do form2.cs)

c_rctbp16

private void lnkurl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
       {
            lnkurl.LinkVisited = true;
            System.Diagnostics.Process.Start("http://www.macoratti.net");
       }
       private void btnFechar_Click(object sender, System.EventArgs e)
       {
            this.Close();
       }

Abaixo temos o código do formulário form1.cs que chama o método Sobre() para exibir o formulário form2.cs acima:

macoratti12

Sair

A opção Sair solicita ao usuário a confirmação para encerrar ou não a aplicação.

macoratti13

E assim temos as funcionalidades do nosso editor implementadas e prontas para serem usadas. Eu poderia continuar incluindo mais funcionalidades como o Refazer (Redo), Desfazer (Undo) etc.,  mas deixo como exercício para você.

Executando o projeto, temos uma visão do nosso editor em funcionamento abaixo:

c_rctbp17

Pegue o projeto completo aqui: RichTextBox_Imprimir.zip