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;
}
}