Printing Long CStrings to Multiple Pages
Posted
by Patrik Hoglund
on October 17th, 2001
Environment: VC6 SP4, NT4 SP3
This is an very easy example how to print a (long) CString buffer ( CStringList ) on several pages and how to get the Print Preview to work properly. I don't know if this is the right way to do this but I have looked everywhere but haven't found a good solution. I havent had time to figure out how to set the pInfo->SetMaxPage(nMaxPage); parameter yet. Maybe somebody could post it in the article.
void CPrintExampleView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CRect strRect(0,0,0,0);
CRect rcCalcText(0,0,0,0);
int nStringheight=0,nStringwidth=0, nRowSpace = 0;
TEXTMETRIC tm;
pDC->SetMapMode(MM_TEXT); // Sets the mapping mode
// Set the start of the Print Position
nPrintPos = m_PrintStrings.GetHeadPosition();
int nCurPage = (pInfo->m_nCurPage);
for ( int c=1; c <= nCurPage; c++)
{
int iY = 300; // Initial Y coordinate
for( nPrintPos; nPrintPos != NULL && (iY < m_iVerticalSize ); )
{
pDC->GetTextMetrics(&tm);
CString strTmp = m_PrintStrings.GetAt( nPrintPos );
// Space between rows depending on the fontsize.
nRowSpace = tm.tmExternalLeading;
// Calc the Height of the String, that can different
// if using newline etc.
pDC->DrawText(strTmp, rcCalcText, DT_CALCRECT);
nStringheight = rcCalcText.Height();
strRect.left=200;
strRect.right = pDC->GetDeviceCaps(HORZRES);
strRect.top=iY;
strRect.bottom = strRect.top + nStringheight;
//Draw the tabbed text to a specific position
CString tab1,tab2;
// Instead of \t I choosed to control my tab position myself.
int tabPos = strTmp.Find("\t");
if ( tabPos != -1 )
{
tab1 = strTmp.Left(tabPos);
tab2 = strTmp.Right(strTmp.GetLength()-tabPos-1);
// AfxMessageBox(tab2);
}
else
tab1 = strTmp;
// Draw the text..
if ( nCurPage == c )
{
// Attach header font to the header text.
pDC->SelectObject(&m_HeadingFont);
PrintPageHeader(pDC,pInfo);
// Attach Body font to the body text.
pDC->SelectObject(&m_BodyFont2);
pDC->DrawText( tab1,
strRect,
DT_WORDBREAK | DT_EXPANDTABS);
strRect.left=strRect.right/6*2;
pDC->SelectObject(&m_BodyFont);
pDC->DrawText( tab2,
strRect,
DT_WORDBREAK | DT_EXPANDTABS);
}
m_PrintStrings.GetNext( nPrintPos );
// Calculate the next start position
int x = strRect.bottom;
iY = ( nRowSpace + x);
}
if ((iY > m_iVerticalSize) && nCurPage == c)
break;
}
}

Comments
Patrik and Richard :Thanks
Posted by Legacy on 11/06/2003 12:00amOriginally posted by: vani
Using your codes i could create a successful Print feauture
Replycoloumns
Posted by Legacy on 11/03/2003 12:00amOriginally posted by: vanisri
How can i make this projects result to be displayed in 2 coloumns instead of only one ..in same page?
ReplyJdbTable Printing Components
Posted by Legacy on 07/19/2003 12:00amOriginally posted by: Nair
i m getting the problem to print the values of JdbTable so any body can help me in this case also these table values may exceed to the multiple pages ........tell me the solution with code material thnaks nasir
Replycould this be used other ways?
Posted by Legacy on 06/20/2003 12:00amOriginally posted by: yimingjiang
in the demo,you use MM_TEXT,can i use MM_LOENGLISH or other
Replymode?
1
Posted by Legacy on 04/22/2003 12:00amOriginally posted by: Kohinoor
ReplyZoom in
Posted by Legacy on 02/12/2003 12:00amOriginally posted by: Jorgen
ReplySetMaxPage
Posted by Legacy on 10/30/2002 12:00amOriginally posted by: John T. Edward
At the bottom of OnPrint, add the following:
if( !nPrintPos )
{
pInfo->SetMaxPage(nCurPage);
}
I am sure there is an easy way to calculate it beforehand based on the number of Strings in the list, but I am not smart enough to do it.
Reply
Print range
Posted by Legacy on 12/06/2001 12:00amOriginally posted by: Richard
If you leave "All" as selected when specifying a print range, you'll notice the program goes on to print quite a few pages....I got up to 1100 before I cancelled it!!
I'm not sure why this occurs at this point, but I'll try to remember to post a solution here if someone else doesn't beat me to it.
Richard
Reply