15,979
社区成员
发帖
与我相关
我的任务
分享
void CReportView::FilePrint()
{
CRect rcClient;
GetRichEditCtrl().GetClientRect(&rcClient);
CDC ThePrintDC;
CPrintDialog PrintDialog(FALSE);
if(PrintDialog.DoModal( ) == IDOK)
{
ThePrintDC.Attach(PrintDialog.GetPrinterDC());
}
else
{
return ;
}
DEVMODE *devmode = (DEVMODE*)PrintDialog.m_pd.hDevMode;
devmode = (DEVMODE*)::GlobalLock(PrintDialog.m_pd.hDevMode);
DOCINFO di;
::ZeroMemory(&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = _T("TEST");
FORMATRANGE fr;
::ZeroMemory(&fr, sizeof(FORMATRANGE));
HDC hdc = ThePrintDC.GetSafeHdc();
fr.hdc = hdc;
fr.hdcTarget = hdc;
int ph = ThePrintDC.GetDeviceCaps(PHYSICALWIDTH);
int nHorizRes = ThePrintDC.GetDeviceCaps(HORZRES),
nVertRes = ThePrintDC.GetDeviceCaps(VERTRES),
nLogPixelsX = ThePrintDC.GetDeviceCaps(LOGPIXELSX),
nLogPixelsY = ThePrintDC.GetDeviceCaps(LOGPIXELSY);
fr.rcPage.left = 0;
fr.rcPage.top = 0;
fr.rcPage.right = (nHorizRes * 1440 / nLogPixelsX);
fr.rcPage.bottom = (nVertRes * 1440 / nLogPixelsY);
fr.rc.left = 0 ;
fr.rc.top = 0 ;
fr.rc.right = fr.rcPage.right;
fr.rc.bottom = fr.rcPage.bottom;
CHARRANGE &cr = fr.chrg;
cr.cpMin=0;
cr.cpMax=-1;
long CharRange = GetRichEditCtrl().GetTextLength();;
int ErrorStatus=0;
GetRichEditCtrl().DisplayBand(&rcClient);
ThePrintDC.StartDoc(&di);
long LastChar = -1;
do
{
ThePrintDC.StartPage();
cr.cpMin = LastChar + 1;
cr.cpMax = -1;
LastChar = GetRichEditCtrl().FormatRange( &fr, TRUE );
ErrorStatus=ThePrintDC.EndPage();
if (cr.cpMin >= LastChar)
break;
cr.cpMin = LastChar;
cr.cpMax = CharRange;
}while(LastChar < CharRange && ErrorStatus > 0);
switch(ErrorStatus)
{
case SP_ERROR:
{
ThePrintDC.AbortDoc();
BCGPMessageBox(_T("打印任务出错,请检查是否已连接打印机、打印机是否可以正常工作."), MB_OK | MB_ICONEXCLAMATION);
return ;
}
case SP_APPABORT:
{
ThePrintDC.AbortDoc();
return ;
}
case SP_USERABORT:
{
ThePrintDC.AbortDoc();
return ;
}
case SP_OUTOFDISK:
{
ThePrintDC.AbortDoc();
BCGPMessageBox(_T("out of disk"));
return ;
}
case SP_OUTOFMEMORY:
{
ThePrintDC.AbortDoc();
BCGPMessageBox(_T("out of memeory"));
return ;
}
default:
{
ThePrintDC.EndDoc();
return ;
}
}
}