C# - Editor de Texto com RichTextBox e PrintDocument - I


 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.

Eu já tratei dos controles RichTextBox e PrintDocument em outros artigos mas neste artigo eu vou usar esses controles em um mesmo projeto usando a linguagem C#. Dessa forma eu não vou entrar em detalhes das propriedades deste controles visto que eu já abordei isso em outros artigos. Vou apenas dar um pequeno resumo de cada um a título de recordação.

RichTextBox

O componente RichTextBox é similar com o controle TextBox mas fornece características mais avançadas que podemos explorar. Dentre elas temos a formatação de texto, cores e fontes. Da mesma forma que o controle TextBox o controle RichTextBox é baseado na classe TextBoxBase a qual é baseada na classe Control.

Ao acessar textos no controle RichTextBox temos duas opções:

  1. text - Trata o texto no formato normal
  2. rtf - Trata o texto no formato Rich Text Format

Além disto o controle RichTextBox fornece métodos para abrir e salvar arquivos e procurar strings:

- LoadFile - permite carregar um arquivo .RTF existente ou um arquivo Texto no controle. Você pode também carregar dados de um stream de dados já aberto.
- SaveFile - permite salvar para RTF ou ASCII texto. Você também pode salvar para um stream de dados aberto.
- Find -  permite localizar strings específicas no texto do controle

Você também pode inicializar o controle para dados armazenados em memória.  Se o texto no interior do controle contiver links para sítios web , você pode usar a propriedade DetectUrls para exibir o link apropriadamente no texto; pode também tratar o evento LinkClicked para realizar tarefas associada com o link.

A propriedade SelectionProtected permite proteger o texto no controle de manipulações por parte do usuário.

Com o texto protegido você pode gerenciar o evento Protected para determinar quando o usuário tentou modificar o texto ou alertar o usuário que o texto esta protegido.

PrintDocument

Para fornecer as funcionalidades básicas para imprimir em aplicações Windows Forms devemos estar familiarizados com a classe Graphics do namespace System.Drawing.

Para imprimir usamos o namespace System.Drawing.Printing onde a classe principal é a classe PrintDocument que representa um objeto que envia a saída para a impressora.

Para imprimir um texto ou um gráfico chamamos o método Print da classe PrintDocument e um dos eventos que o método Print invoca é o evento PrintPage. (Você precisa vincular um manipulador de evento a este evento e escrever o código para enviar a saída para a impressora. )

O manipulador de eventos irá receber um argumento do tipo PrintPageEventArgs contendo os dados relacionados ao evento PrintPage e uma das propriedades deste argumento é a propriedade Graphics a partir da qual você pode obter um objeto Graphics.

Este objeto Graphics representa uma página a ser impressa e para enviar uma string para a impressora, por exemplo, você pode usar o método DrawString da classe Graphics. Você pode chamar outros método desta classe como FillRectangle, DrawEllipse, etc.

Vamos reunir os recursos destes componentes e outros recursos dos controles Windows Forms e criar um pequeno editor de textos.

  • Recursos usados:

    Criando o Editor de Textos

    Então abra o VS Community 2013 clique em New Project;

    Selecione a linguagem C# e o template Windows Forms Application e informe o nome RichTextBox_Imprimir;

    No formulário form1.cs vamos incluir os seguintes controles:

    Disponha os controles conforme o leiaute da figura abaixo:

    Para criar as opções do menu no controle MenuStrip apenas digite diretamente no controle o texto das opções usando o caractere & na frente de uma letra que queira sublinhar. Ex: &Arquivo.

    As opções que iremos definir são:

    Para incluir os ícones no controle ToolStrip selecione o controle e na janela de propriedades clique em Items(Collection);

    Será aberta a janela Items Collection Editor onde a primeira coisa a fazer é incluir um item no menu. Para isso selecione o tipo do item (Button) e clique no botão Add;

    A seguir defina as propriedades definindo uma imagem pré-selecionada na propriedade Image e a seguir defina as propriedades Text informando o texto que irá aparecer quando o mouse repousar sobre o controle e a propriedade Name para definir o nome do controle.

    Dessa forma iremos definir os seguintes itens no ToolStrip:

    • Novo

    • Abrir

    • Salvar

    • Copiar

    • Colar

    • Negrito

    • Itálico

    • Sublinhado

    • Alterar Fonte

    • Visualizar Impressão

    • Imprimir

    • Ajuda

    • Sair

    Observe que a maioria das opções de texto do controle MenuStrip estão replicadas nos ícones do controle ToolStrip e assim o usuário poderá acessar cada opção ou clicando no menu com o texto ou clicando no respectivo ícone. Teremos assim dois caminhos para acessar a mesma funcionalidade.

    Os namespaces usados no formulário form1.cs são:

    using System;

    using System.Drawing;

    using System.IO;

    using System.Windows.Forms;

     

    A seguir, após a declaração do formulário, vamos incluir uma declaração para a variável leitor que será usada no projeto para ler o arquivo texto:

    StreamReader leitor = null;

    Definindo o código de cada funcionalidade do editor de texto

    Vamos agora definir o código para cada uma das opções do menu do editor de textos. Vamos fazer da seguinte forma:

    • Fazemos a chamada no evento Click do menu (texto)

    • Fazemos a mesma chamada do evento Click do ícone (imagem)

    • Definimos o código da funcionalidade

    Código Evento do MenuStrip (Texto) Código do Evento do ToolStrip (Ícone)
    Código da funcionalidade
    Nota: Poderíamos chamar via código o evento Click de outro controle. 
    
    Assim para o evento Click do item Copiar do menu temos o evento mnuCopiar_Click.
    
    Para acionar este evento Click a partir de outro controle usamos método PerformClick:
    
    private void toolStripCopiar_Click(object sender, EventArgs e)
    {
        //Copiar();
         mnuCopiar.PerformClick();
    }

            A opção Novo  permite criar um novo arquivo. Para isso antes chamamos o método ChamaSalvarArquivo() que pergunta ao usuário se ele deseja salvar o arquivo atual.

            Em caso positivo o método Salvar_Arquivo() será chamado. Esse método acionará a janela de diálogo Salvar Arquivo (SaveFileDialog) para que o usuário escolha o local e nome do arquivo a salvar.

            Após isso usamos os métodos Clear() e Focus() do RichTextBox para limpar o conteúdo do controle e colocar o foco no mesmo.

     private void mnuNovo_Click(object sender, EventArgs e)
     {
                ChamaSalvarArquivo();
                rtxtb1.Clear();
                rtxtb1.Focus();
     }

     private void toolStripNovo_Click(object sender, EventArgs e)
     {
                ChamaSalvarArquivo();
                rtxtb1.Clear();
                rtxtb1.Focus();
     }

    private void ChamaSalvarArquivo()
     {
                if (!string.IsNullOrEmpty(rtxtb1.Text))
                {
                    if ((MessageBox.Show("Deseja Salvar o arquivo ?", "Salvar Arquivo", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes))
                    {
                        Salvar_Arquivo();
                    }
                }
     }

            private void Salvar_Arquivo()
            {
                try
                {
                    // Pega o nome do arquivo para salvar
                    if (this.svdlg1.ShowDialog() == DialogResult.OK)
                    {
                        // abre um stream para escrita e cria um StreamWriter para implementar o stream
                        FileStream fs = new FileStream(svdlg1.FileName, FileMode.OpenOrCreate, FileAccess.Write);
                        StreamWriter m_streamWriter = new StreamWriter(fs);
                        m_streamWriter.Flush();
                        // Escreve para o arquivo usando a classe StreamWriter
                        m_streamWriter.BaseStream.Seek(0, SeekOrigin.Begin);
                        // escreve no controle richtextbox
                        m_streamWriter.Write(this.rtxtb1.Text);
                        // fecha o arquivo
                        m_streamWriter.Flush();
                        m_streamWriter.Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            A opção Abrir permite abrir um arquivo texto. Para isso será aberta a janela de diálogo Abrir Arquivo (OpenFileDialog) para o usuário selecionar o arquivo a ser aberto.

            private void mnuAbrir_Click(object sender, EventArgs e)
            {
                AbrirArquivo();
            }

            private void toolStripAbrir_Click(object sender, EventArgs e)
            {
                AbrirArquivo();
            }

     private void AbrirArquivo()
      {
                //define as propriedades do controle 
                //OpenFileDialog
                this.ofd1.Multiselect = true;
                this.ofd1.Title = "Selecionar Arquivo";
                ofd1.InitialDirectory = @"C:\Dados\";
                //filtra para exibir somente arquivos textos
                ofd1.Filter = "Images (*.TXT)|*.TXT|" + "All files (*.*)|*.*";
                ofd1.CheckFileExists = true;
                ofd1.CheckPathExists = true;
                ofd1.FilterIndex = 1;
                ofd1.RestoreDirectory = true;
                ofd1.ReadOnlyChecked = true;
                ofd1.ShowReadOnly = true;
                DialogResult dr = this.ofd1.ShowDialog();
                if (dr == System.Windows.Forms.DialogResult.OK)
                {
                    try
                    {
                        FileStream fs = new FileStream(ofd1.FileName, FileMode.Open, FileAccess.Read);
                        StreamReader m_streamReader = new StreamReader(fs);
                        // Lê o arquivo usando a classe StreamReader
                        m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin);
                        // Lê cada linha do stream e faz o parse até a última linha
                        this.rtxtb1.Text = "";
                        string strLine = m_streamReader.ReadLine();
                        while (strLine != null)
                        {
                            this.rtxtb1.Text += strLine + "\n";
                            strLine = m_streamReader.ReadLine();
                        }
                        // Fecha o stream
                        m_streamReader.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
        }

          private void mnuSalvar_Click(object sender, EventArgs e)
           {
                ChamaSalvarArquivo();
           }

     

         private void toolStripSalvar_Click(object sender, EventArgs e)
         {
                ChamaSalvarArquivo();
         }

     

    Nota:  o método ChamaSalvarArquivo() usado aqui é o mesmo usado na opção Novo.

     A opção Copiar usa o método Copy do controle RichTextBox para copiar um texto selecionado.

    Aqui estamos usando o método PerformClick() na opção Copiar do ToolStrip para chamar o evento Click do item menuCopiar do MenuStrip.

        private void mnuCopiar_Click(object sender, EventArgs e)
        {
                Copiar();
        }

         private void toolStripCopiar_Click(object sender, EventArgs e)
         {
                //Copiar();
                mnuCopiar.PerformClick();
         }

        private void Copiar()
        {
                if (rtxtb1.SelectionLength > 0)
                {
                    rtxtb1.Copy();
                }
        }

     A opção Colar usa o método Paste do controle RichTextBox para colar um texto selecionado em uma posição do texto atual.

          private void mnuColar_Click(object sender, EventArgs e)
          {
                Colar();
          }

         private void toolStripColar_Click(object sender, EventArgs e)
         {
                Colar();
         }

           private void Colar()
           {
                rtxtb1.Paste();
           }

     A opção Negrito permite negritar o texto selecionado. Para isso usamos a propriedade SelecionFont que obtém ou define a fonte de seleção ou de ponto de inserção de texto atual e definimos o estilo como Bold.

          private void mnuNegrito_Click(object sender, EventArgs e)
          {
                Negritar();
          }

       private void toolStripNegrito_Click(object sender, EventArgs e)
       {
              Negritar();
       }

           private void Negritar()
            {
                string nome_fonte = null;
                float tamanho_fonte = 0;
                bool negrito = false;
                nome_fonte = rtxtb1.Font.Name;
                tamanho_fonte = rtxtb1.Font.Size;
                negrito = rtxtb1.Font.Bold;
                if (negrito == false)
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Bold);
                }
                else
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Regular);
                }
            }

     A opção Itálico permite definir o estilo itálico para o texto selecionado. Para isso usamos a propriedade SelecionFont que obtém ou define a fonte de seleção ou de ponto de inserção de texto atual e definimos o estilo como Italic.

       private void mnuItalico_Click(object sender, EventArgs e)
        {
                Italico();
        }

        private void toolStripItalico_Click(object sender, EventArgs e)
         {
                Italico();
         } 
           private void Italico()
           {
                string nome_fonte = null;
                float tamanho_fonte = 0;
                bool italico = false;
                nome_fonte = rtxtb1.Font.Name;
                tamanho_fonte = rtxtb1.Font.Size;
                italico = rtxtb1.Font.Italic;
                if (italico == false)
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Italic);
                }
                else
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Italic);
                }
            }

     A opção Sublinhado permite definir o estilo itálico para o texto selecionado. Para isso usamos a propriedade SelecionFont que obtém ou define a fonte de seleção ou de ponto de inserção de texto atual e definimos o estilo como Underline.

         private void mnuSublinhado_Click(object sender, EventArgs e)
         {
                Sublinhar();
         }
         private void toolStripSublinhado_Click(object sender, EventArgs e)
         {
                Sublinhar();
         } 
            private void Sublinhar()
            {
                string nome_fonte = null;
                float tamanho_fonte = 0;
                bool sublinha = false;
                nome_fonte = rtxtb1.Font.Name;
                tamanho_fonte = rtxtb1.Font.Size;
                sublinha = rtxtb1.Font.Underline;
                if (sublinha == false)
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Underline);
                }
                else
                {
                    rtxtb1.SelectionFont = new Font(nome_fonte, tamanho_fonte, FontStyle.Underline);
                }
            }

    A opção Alterar Fonte permite alterar a fonte atual. Para isso é aberta uma janela de diálogo Fonte (FontDialog) onde o usuário pode escolher uma fonte e definir o seu estilo e tamanho.

          private void mnuAlteraFonte_Click(object sender, EventArgs e)
          {
                AlterarFonte();
          }

         private void toolStripFonte_Click(object sender, EventArgs e)
         {
                AlterarFonte();
         } 
            private void AlterarFonte()
            {
                DialogResult result = fontdlg1.ShowDialog();
                if (result == DialogResult.OK)
                {
                    if (rtxtb1.SelectionFont != null)
                    {
                        rtxtb1.SelectionFont = fontdlg1.Font;
                    }
                }
            }

     

    A opção Alinhar Texto permite alinhar o texto. Para isso usamos a propriedade SelectionAlignment que obtém ou define o alinhamento para aplicar a seleção ou o ponto de inserção atual.

    Temos 3 opções :

           private void mnuAlinharEsquerda_Click(object sender, EventArgs e)
           {
                rtxtb1.SelectionAlignment = HorizontalAlignment.Left;
           }
           private void mnuAlinhaDireita_Click(object sender, EventArgs e)
           {
                rtxtb1.SelectionAlignment = HorizontalAlignment.Right;
           }
           private void mnuAlinharCentro_Click(object sender, EventArgs e)
           {
                rtxtb1.SelectionAlignment = HorizontalAlignment.Center;
           }

    Na próxima parte do artigo vamos continuar implementando as funcionalidades de impressão para o texto do editor de texto.

    Disse-lhes Jesus: Em verdade, em verdade vos digo que antes que Abraão existisse, Eu Sou.
    João 8:58

    Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

    Quer migrar para o VB .NET ?

    Quer aprender C# ??

    Quer aprender os conceitos da Programação Orientada a objetos ?

    Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

      Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

    Referências:


    José Carlos Macoratti