private void avancarEstadoDoAlgoritmo()
        {
            switch (estadoAtual)
            {
            case EstadoAlgoritmo.Parado:
                estadoAtual    = EstadoAlgoritmo.LendoEntrada;
                lblEstado.Text = "Estado: Lendo entrada e contando frequência";
                break;

            case EstadoAlgoritmo.LendoEntrada:
                estadoAtual    = EstadoAlgoritmo.ConstruindoArvore;
                lblEstado.Text = "Estado: Construindo árvore";
                break;

            case EstadoAlgoritmo.ConstruindoArvore:
                estadoAtual    = EstadoAlgoritmo.GerandoCodigo;
                lblEstado.Text = "Estado: Gerando o código de cada caractere";
                break;

            case EstadoAlgoritmo.GerandoCodigo:
                estadoAtual    = EstadoAlgoritmo.GerandoSaida;
                lblEstado.Text = "Estado: Gerando saída";
                caractereAtual = 0;
                break;

            case EstadoAlgoritmo.GerandoSaida:
                estadoAtual    = EstadoAlgoritmo.Parado;
                lblEstado.Text = "Estado: Saída gerada, fim do algoritmo";
                break;
            }
        }
        private void btnIniciarParar_Click(object sender, EventArgs e)
        {
            if (btnIniciarParar.Text == "Iniciar") // Iniciar
            {
                if (rtbEntrada.ForeColor == SystemColors.GrayText)
                {
                    MessageBox.Show(this, "Digite algo na caixa de texto de entrada!", "Impossível iniciar algoritmo");
                    return;
                }

                // Reiniciar variáveis
                caractereAtual = 0;
                estadoAtual    = EstadoAlgoritmo.Parado;
                avancarEstadoDoAlgoritmo();

                // Reiniciar controles
                btnIniciarParar.Text       = "Parar";
                btnPausarContinuar.Text    = "Pausar";
                btnPausarContinuar.Enabled = true;
                btnProximoPasso.Enabled    = true;
                tkbIntervaloPassos_Scroll(null, null); // Atualiza timerPasso.Interval e lblVelocidade.Text

                trvArvore.Nodes.Clear();
                dgvCaracteres.Rows.Clear();

                rtbSaidaBinario.Clear();
                rtbSaidaBytes1252.Clear();
                rtbSaidaBytesUTF8.Clear();
                lblInfoDiferenca.Text = "";
                lblInfoSaida.Text     = "Saída: ";

                // Preparar controles
                btnAbrirArquivo.Enabled   = false;
                txtCaminhoArquivo.Enabled = false;
                rtbEntrada.ReadOnly       = true;
                trocarTamanhoFonteSaida();
                SubstituirWindows1252InvalidosDaEntrada();

                // Iniciar passos
                timerPasso_Tick(null, null);
                timerPasso.Start();
            }
            else                                    // Parar
            {
                // Reiniciar variáveis
                estadoAtual    = EstadoAlgoritmo.Parado;
                lblEstado.Text = "Estado: Parado";

                // Reiniciar controles
                timerPasso.Stop();

                btnAbrirArquivo.Enabled   = true;
                txtCaminhoArquivo.Enabled = true;
                rtbEntrada.ReadOnly       = false;
                rtbEntrada.SelectAll();
                rtbEntrada.SelectionBackColor = SystemColors.Window;

                btnIniciarParar.Text       = "Iniciar";
                btnPausarContinuar.Text    = "Pausar";
                btnPausarContinuar.Enabled = false;
                btnProximoPasso.Enabled    = false;
            }
        }