調用部分
    int printwidth = printdc.GetDeviceCaps(HORZRES);
    int printhigh = printdc.GetDeviceCaps(VERTRES);
long returnprint;
long alllength = printstring.GetLength();
CRect rectprint;
rectprint.SetRect(0,0,printwidth,printhigh);
while(alllength>0)
{
printdc.StartPage();
returnprint = LayoutDraw(&printdc,&rectprint,&printstring);
printstring = printstring.Right(printstring.GetLength()-returnprint);
alllength = alllength-returnprint;
printdc.EndPage();
}
printdc.EndDoc();
打印一頁
long LayoutDraw(CDC * pDC,CRect * pRect,CString * pStr)
{
CString strNow;
CString strRemain;
CFont fontNow;
TEXTMETRIC textMetric;
long lines;
long width;
long heigh;
long offsetLine;
long offsetStr;
long totalLength;
CSize lengSize;
long i; if(!pDC->GetTextMetrics(&textMetric))
{
return  -1;
} lines = (pRect->Height()) / (textMetric.tmHeight);
width = pRect->Width();
heigh = textMetric.tmHeight;
offsetStr = 0;
strRemain = pStr->Left(pStr->GetLength());
totalLength = pStr->GetLength(); i = 0;
while( offsetStr+1 < totalLength && i < lines )
{
offsetLine = strRemain.Find("\r\n");
if(offsetLine == 0)
{
strNow = "\r\n";
offsetLine = 2;
}
else if(offsetLine != -1)
{

strNow = strRemain.Left(offsetLine);
}
else
{
strNow = strRemain;
offsetLine = strNow.GetLength(); } if(!GetTextExtentPoint32(pDC->GetSafeHdc(),strNow,offsetLine,&lengSize))
{
return -1;
}
if( lengSize.cx > width)
{
while( lengSize.cx > width)
{
offsetLine --;
::GetTextExtentPoint32(pDC->GetSafeHdc(),strNow,offsetLine,&lengSize);
}
char ch = strNow.GetAt(offsetLine) ;

if((unsigned char)strNow.GetAt(offsetLine-1) >= 0x80)
{
long j;
j = 0;
if( offsetLine >0 && (unsigned char) strNow.GetAt(offsetLine-1)<0x80 )
{
offsetLine --;
}
else
{
while( j < offsetLine)
{
if((unsigned char )strNow.GetAt(j)>=0x80)
{
j+= 2;
}
else
{
j++;
}
}
if(j != offsetLine)
{
offsetLine--;
}
} }
else if( offsetLine < strNow.GetLength() && IsCharAlphaNumeric(strNow.GetAt(offsetLine-1)) && IsCharAlphaNumeric(strNow.GetAt(offsetLine)))
{
while(offsetLine> 0 && IsCharAlphaNumeric(strNow.GetAt(offsetLine-1)))
{
offsetLine--;
}

if( offsetLine == 0 )
{
offsetLine ++;///???
if(!GetTextExtentPoint32(pDC->GetSafeHdc(),strNow,offsetLine,&lengSize))
{
return -1;
}

while(offsetLine < strNow.GetLength() && IsCharAlphaNumeric(strNow.GetAt(offsetLine))&&lengSize.cx < width)
{
offsetLine++;
if(!GetTextExtentPoint32(pDC->GetSafeHdc(),strNow,offsetLine,&lengSize))
{
return -1;
}
}
offsetLine--;
}
if((unsigned char )strNow.GetAt(offsetLine)> 0x80)
{
offsetLine ++;
}
}
} strRemain = strRemain.Right(strRemain.GetLength() - offsetLine);
if(strRemain.GetAt(0) == '\r' && strRemain.GetAt(1) == '\n')
{
strRemain = strRemain.Right(strRemain.GetLength() - 2);
offsetStr += 2;
} strNow = strNow.Left(offsetLine);
offsetStr += offsetLine;

if(strNow.Find("\r\n") == 0)
{
strNow = "";
}
pDC->TextOut(pRect->left,pRect->top+i * heigh,strNow,strNow.GetLength());
i++; }
return offsetStr;
}