Impresion con PrintDialog

04/08/2006 - 01:04 por Antonio | Informe spam
Hola de nuevo,
Ya parece que voy manejando algo el componente PrintDocument.
Hasta el momento me va todo bien si tengo que imprimir una pag. solo, pero
si las lineas que quiero imprimir sobre pasa la pag. ya no me va tan bien.
Os explico, cuando imprimo mas de una pag. me sobre escribe el texto en la
misma pag., os paso el codigo y si alguien sabe donde tengo que corregir le
agradeceria mucho que me lo indicase.

for (int i = 0; i <= wh.nodos.Length - 1; i++)

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

float lineasPag = ev.MarginBounds.Height /
letra.GetHeight(ev.Graphics);//calculamos las lineas que caben en la pag.

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos colocamos en posicion para escribir una
linea

cadena = wh.nodos[i].Text; //le asignamos el titulo...

ev.Graphics.DrawString(cadena, letra, Brushes.Black, ev.MarginBounds.Left,
posicionY);//...y lo imprimimos

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)// si el ancho de lineas supera el ancho de la hoja
creamos otra pag.

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

for (int j = 0; j <= texto.Lines.Length - 1; j++)//ahora imprimimos el texto
del marcador

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

cadena = texto.Lines[j];

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos volvemos a colocar en poscion para
imprimir otra linea

ev.Graphics.DrawString(cadena, letra, Brushes.Blue, ev.MarginBounds.Left,
posicionY);

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

}

}

}

LineasEscritas es de tipo entero que se va incrementando conforme voy
imprimiendo lineas.

Texto es un richTextBox.
 

Leer las respuestas

#1 Octavio Hernandez
04/08/2006 - 11:41 | Informe spam
Antonio,

El problema es que el evento PrintPage es llamado para cada página del
documento, y en cada llamada tú vuelves a empezar por i = 0...
Sugerencias:

a) Cambia el bucle for por un bucle while:

while (i < wh.nodos.Length)
{
// todo lo demás...
i++;
}

b) Saca la variable i FUERA del evento PrintPage, para que conserve su valor
entre llamadas:

private int i;

private void PrintPage( // etc...

c) Inicializa i a cero en el evento BeginPrint del PrintDocument, para que
empiece de cero cada vez que ordenes una nueva impresión.

OJO: No entiendo exactamente la lógica de impresión que utilizas,
probablemente tengas que hacer lo mismo con la variable 'j'.

Slds - Octavio



"Antonio" escribió en el mensaje
news:
Hola de nuevo,
Ya parece que voy manejando algo el componente PrintDocument.
Hasta el momento me va todo bien si tengo que imprimir una pag. solo, pero
si las lineas que quiero imprimir sobre pasa la pag. ya no me va tan bien.
Os explico, cuando imprimo mas de una pag. me sobre escribe el texto en la
misma pag., os paso el codigo y si alguien sabe donde tengo que corregir
le agradeceria mucho que me lo indicase.

for (int i = 0; i <= wh.nodos.Length - 1; i++)

{

letra = new Font("Bookman Old Style", 10, FontStyle.Italic);

float lineasPag = ev.MarginBounds.Height /
letra.GetHeight(ev.Graphics);//calculamos las lineas que caben en la pag.

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos colocamos en posicion para escribir
una linea

cadena = wh.nodos[i].Text; //le asignamos el titulo...

ev.Graphics.DrawString(cadena, letra, Brushes.Black, ev.MarginBounds.Left,
posicionY);//...y lo imprimimos

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)// si el ancho de lineas supera el ancho de la hoja
creamos otra pag.

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

for (int j = 0; j <= texto.Lines.Length - 1; j++)//ahora imprimimos el
texto del marcador

{

letra = new Font("Bookman Old Style", 10, FontStyle.Regular);

cadena = texto.Lines[j];

posicionY = ev.MarginBounds.Top + (lineasEscritas *
letra.GetHeight(ev.Graphics));//nos volvemos a colocar en poscion para
imprimir otra linea

ev.Graphics.DrawString(cadena, letra, Brushes.Blue, ev.MarginBounds.Left,
posicionY);

lineasEscritas++;

if ((lineasEscritas * letra.GetHeight(ev.Graphics)) >
ev.MarginBounds.Height)

{

lineasEscritas = 0;

ev.HasMorePages = true;

}

else

ev.HasMorePages = false;

}

}

}

LineasEscritas es de tipo entero que se va incrementando conforme voy
imprimiendo lineas.

Texto es un richTextBox.


Preguntas similares