PDA

View Full Version : [visual c++] stampare pagine


Safhkit
03-02-2009, 12:21
Salve,

sto creando un programma di archiviazione di film (sorvolo le altre funzionalità) e ho bisogno di stampare la lista dei film che ho in memoria (visualizzata con una DataGridView). Riesco a stampare la prima pagina, ma ho bisogno di gestire l'aggiunta di pagine successive da stampare. Come dovrei fare?
Ho girato molto su internet e ho visto che tutti dicono la stessa cosa, accenando alla proprietà HasMorePages dell'PrintPageEventArgs.
Ho provato ad usarla (sto provando prima con l'anteprima di stampa per vedere se funziona tutto come dovrebbe) ma il risultato è che la printpreview dialogbox mi crea infinite pagine e sono io a dover premere su 'Annulla' per farlo smettere. Alla fine ho un numero di pagine pari a quelle che l'applicazione è riuscita a creare fino a quando ho premuto Annulla e tutte sono identiche alla prima pagina.

Qualcuno sa come devo fare??

Vi posto il codice della stampa:

private: System::Void prtDoc_PrintPage(System::Object^ sender, System::Drawing::Printing::PrintPageEventArgs^ e) {
System::Drawing::Font^ printFont;
printFont = gcnew System::Drawing::Font( "Arial",18,FontStyle::Bold );
float linesPerPage=0;
float yPos=0;
float leftMargin = (float)e->MarginBounds.Left;
float topMargin = (float)e->MarginBounds.Top;
String^ line = nullptr;
float PageRightMargin= (float)e->PageBounds.Right;
float NextyPos=0;
float PageHeigth=(float)e->MarginBounds.Bottom;


// Calculate the number of lines per page.
linesPerPage = e->MarginBounds.Height / printFont->GetHeight( e->Graphics );

//Stampa titolo
line=gcnew String("MyFilm - " + lblList->Text);
yPos = topMargin + (0 * printFont->GetHeight( e->Graphics ));
e->Graphics->DrawString( line, printFont, Brushes::Black, leftMargin, yPos, gcnew StringFormat );


printFont = gcnew System::Drawing::Font( "Arial",14,FontStyle::Bold);

//Stampa header tabella
line=gcnew String("Titolo");
yPos = topMargin + (3 * printFont->GetHeight( e->Graphics ));
e->Graphics->DrawString( line, printFont, Brushes::Black, leftMargin, yPos, gcnew StringFormat );

line= gcnew String("Genere");
e->Graphics->DrawString( line, printFont, Brushes::Black, ((PageRightMargin/2)+leftMargin/2), yPos, gcnew StringFormat);

line= gcnew String("Supporto/Tipo");
e->Graphics->DrawString( line, printFont, Brushes::Black, ((PageRightMargin/2)+2*leftMargin), yPos, gcnew StringFormat);


printFont = gcnew System::Drawing::Font( "Arial",10);

yPos = topMargin + ((0+6) * printFont->GetHeight( e->Graphics ));
//Stampa contenuto griglia
for (int i=0; i<grdFilm->RowCount; i++){
line=gcnew String(Convert::ToString(grdFilm->Rows[i]->Cells[0]->Value));
NextyPos=yPos+printFont->GetHeight( e->Graphics );
if (NextyPos<PageHeigth){
//e->HasMorePages=false; //*****QUI POTREI, MA NON SO SE è NECESSARIO, DIRE CHE non HO PIù DI UNA PAG. DA STAMPARE, PERCHè SONO ANCORA ALL'INTERNO DELLA PAGINA CORRENTE) ******//
yPos=NextyPos;
}
else{
//nuova pagina: creare newpage; yPos da inizializzare;
e->HasMorePages=true; //*****QUI DOVREI DIRE CHE HO PIù DI UNA PAG. DA STAMPARE, CREANDO LA SUCCESSIVA (PULITA E NON UGUALE ALLA PRIMA PAGINA) ******//
yPos = topMargin + ((0+6) * printFont->GetHeight( e->Graphics ));
}

e->Graphics->DrawString( line, printFont, Brushes::Black, leftMargin, yPos, gcnew StringFormat);

line= gcnew String(Convert::ToString(grdFilm->Rows[i]->Cells[1]->Value));
e->Graphics->DrawString( line, printFont, Brushes::Black, ((PageRightMargin/2)+leftMargin/2), yPos, gcnew StringFormat);

line= gcnew String(Convert::ToString(grdFilm->Rows[i]->Cells[2]->Value));
e->Graphics->DrawString( line, printFont, Brushes::Black, ((PageRightMargin/2)+2*leftMargin), yPos, gcnew StringFormat);

}



}