紧急求助-CRichEditView打印问题

Jackxan 2014-07-17 08:43:41
项目需要将CRichEditView里面的图文混排的内容打印出来
可是我打印的结果却不对啊
用了 FormatRange 和DisplayBand 方法 请先看图
打印前的内容如下


打印与打印预览的结果如下:



下面是我打印的代码请各位大神帮忙看看吧 比较着急哦 先谢过了!

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

...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackxan 2014-07-25
  • 打赏
  • 举报
回复
哎!难道就没人知道怎么弄吗?郁闷!
Jackxan 2014-07-17
  • 打赏
  • 举报
回复
大神都去哪了?赶紧现身帮忙啊
Sympastics 2014-07-17
  • 打赏
  • 举报
回复
太难了,心有余而力不足啊

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧