IMPRIMIR USERCONTROL

PERCIFILHO 18/08/2016 16:09:28
#465954
Pessoal, boa tarde a todos!
Nesse meu formulário, eu estou mostrando na esquerda, um RichTextBox com a letra da música cifrada (com as notas de violão).
Aí eu fiz uma rotina para pegar as notas que estão sobre a letra da música e mostrar o acorde do violão através de um UserControl à direita da tela.
Agora, eu preciso incluir uma rotina que imprime essa letra da música cifrada e ao final, preciso mostrar os acordes.
Como eu faço para imprimir esses UserControls? Será que é possível?
Antes que alguém diga: depende de como você está fazendo.... vou postar a parte do código que faz esse trabalho todo:

// aqui eu crio uma List<> que busca a musica na tabela [Ô]Musica[Ô]
// usando o Inner Join com a tabela Indice para pegar o nome da musica e o nome do artista
List<Musica> _lista = new List<Musica>(new Musica().Get_All(
[Ô]Select m.*, i.NomeMusica, i.NomeArtista [Ô] +
[Ô]From Musica m [Ô] +
[Ô]Inner Join Indice i On i.IdMusica = m.IdMusica [Ô] +
[Ô]Where m.IdMusica = [ô][Ô] + lblIdMusica.Text + [Ô][ô][Ô] +
[Ô]Order By m.Linha[Ô]));

// aqui eu crio um array SortedSet do tipo string
var todas_notas = new SortedSet<string>();

// guarda a posicao da linha inicial
int n = 3;

// percorre a List<> para mostrar o resultado
foreach (var item in _lista)
{
rtbResultado.AppendText(item.Texto + [Ô]
[Ô]);
string linha = rtbResultado.Lines[n];
rtbResultado.Select(rtbResultado.GetFirstCharIndexFromLine(n), linha.Length);
// se for encontrado a palavra [Ô]Acorde[Ô] na linha,
// vai adicionar o valor dos acordes na array
// e mostrar na cor laranja
if (item.Tipo == [Ô]Acorde[Ô])
{
string s_linha = linha;
string[] notas = s_linha.Split([ô] [ô]);
foreach (string nota in notas)
{
todas_notas.Add(nota);
}
rtbResultado.SelectionColor = Color.OrangeRed;
}
// se for encontrado as palavras [Ô]Tom[Ô] ou [Ô]Intro[Ô] na linha,
// vai adicionar o valor os acordes na array
else if (item.Tipo == [Ô]Tom[Ô] || item.Tipo == [Ô]Intro[Ô])
{
string s_linha = linha;
string[] notas = s_linha.Split([ô] [ô]);
foreach (string nota in notas)
{
todas_notas.Add(nota);
}
// Start position
int start = (rtbResultado.GetFirstCharIndexFromLine(n) + linha.LastIndexOf([Ô]:[Ô]) + 1);

// Length
int length = linha.Substring(linha.LastIndexOf([Ô]:[Ô]), (linha.Length - (linha.LastIndexOf([Ô]:[Ô])))).Length;

// Make the selection
rtbResultado.SelectionStart = start;
rtbResultado.SelectionLength = length;

// Change the colour
rtbResultado.SelectionColor = Color.OrangeRed;
}
else if (item.Tipo == [Ô]Espaco[Ô] || item.Tipo == [Ô]Letra[Ô])
{
rtbResultado.SelectionColor = Color.Black;
}
n++;
}

// deixa o RichTextBox sem seleção nenhuma
rtbResultado.DeselectAll();

// retira os valores duplicados da array
todas_notas.Distinct().ToList();

// mostrar os acordes
foreach (var item in todas_notas)
{
List<Acorde> _acordes = new List<Acorde>(new Acorde().Get_All(
[Ô]Select * From Acorde Where NomeAcorde = [ô][Ô] + item.ToString() + [Ô][ô][Ô]
));

if (_acordes.Count != 0)
{
nome_da_nota = item.ToString();
MostrarAcorde();
}
}

rtbResultado.SelectionStart = 0;
this.ActiveControl = lblIdMusica;


       private void MostrarAcorde()
{
// busca o acorde na tabela [Ô]Acorde[Ô]
List<Acorde> _acordes = new List<Acorde>(new Acorde().Get_All(
[Ô]Select * From Acorde Where NomeAcorde = [ô][Ô] + nome_da_nota + [Ô][ô][Ô]));

// mostra todos os acordes da música
foreach (var item in _acordes)
{
Cifra _cifra = new Cifra();
_cifra.lblNomeAcorde.Text = item.NomeAcorde;
if (contagem == 1)
_cifra.Location = new Point(670, 10);
else if (contagem == 2)
_cifra.Location = new Point(775, 10);
else if (contagem == 3)
_cifra.Location = new Point(880, 10);
else if (contagem == 4)
_cifra.Location = new Point(985, 10);

else if (contagem == 5)
_cifra.Location = new Point(670, 180);
else if (contagem == 6)
_cifra.Location = new Point(775, 180);
else if (contagem == 7)
_cifra.Location = new Point(880, 180);
else if (contagem == 8)
_cifra.Location = new Point(985, 180);

else if (contagem == 9)
_cifra.Location = new Point(670, 350);
else if (contagem == 10)
_cifra.Location = new Point(775, 350);
else if (contagem == 11)
_cifra.Location = new Point(880, 350);
else if (contagem == 12)
_cifra.Location = new Point(985, 350);

else if (contagem == 13)
_cifra.Location = new Point(670, 520);
else if (contagem == 14)
_cifra.Location = new Point(775, 520);
else if (contagem == 15)
_cifra.Location = new Point(880, 520);
else if (contagem == 16)
_cifra.Location = new Point(985, 520);

this.Controls.Add(_cifra);

contagem ++;
}
}

KERPLUNK 20/08/2016 00:21:54
#466015
Veja bem, você mão imprime o UserControl em si. Você gera um relatório(report) daquilo que quer imprimir. Não sei qual seu conhecimento quanto à isso, mas é perfeitamente possível usar o Crystal para isso. Eu, no seu lugar, usaria HTML. Geraria o código HTML, passaria para um objeto WebBrowser, de onde faria a impressão. Ele já disponibiliza inclusive um [Ô]Preview[Ô] com o método [Ô]ShowPrintPreviewDialog[Ô]. E essa é a razão de eu simplesmente não entender porque ainda tem tanta gente que usa Crystal. é assim que tenho feito todos os meus relatórios, ficam muito mais simples, dinâmicos e bonitos, além de ser possível o envio por e-mail, publicação direta em qualquer ftp ou http, podem fazer uso de recursos externos, inclusive com AJAX ou qualquer outra coisa suportada em HTML.
PERCIFILHO 24/08/2016 12:47:31
#466132
Obrigado pela explicação Kerplunk, mas eu consegui como eu queria de outra forma, estou usando uma função que captura a imagem da tela (no meu caso, capturo somente as imagens dos acordes), aí, gero o arquivo em PDF da letra da música com as cifras e quando acabar a letra, eu imprimo a imagem dos acordes capturada.
Funcionou perfeitamente!
Tópico encerrado , respostas não são mais permitidas