富文本绘制、打印预览和打印到纸张(仅 GDI)





2.00/5 (9投票s)
为了帮助您快速轻松地构建支持富文本绘制、打印预览和打印到纸张的报表应用程序,包含源代码

引言
“为什么我的富文本绘制和打印预览工作正常,但是当我尝试打印到纸张时,却无法工作?”
我发现很多人多次问过这个问题,希望这篇文章和代码能帮助您。这个小型应用程序演示了如何在画布上绘制富文本,然后您可以以相同的外观进行打印预览或打印到纸张。完整的源代码包含在压缩文件中。您可以自由使用,不受限制。
它是如何工作的?
- 我们在类头文件中定义了一个富文本控件:
CTestRichEditPrintView
,如下所示// CRichEditCtrl for drawing. CRichEditCtrl m_DrawRTF;
- 我们修改了类
CTestRichEditPrintView
的OnDraw
方法,以下代码用于在画布上绘制m_nLogPixelsX = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSX); m_nLogPixelsY = ::GetDeviceCaps(pDC->m_hDC, LOGPIXELSY); fmtRange.hdcTarget = pDC->m_hAttribDC; fmtRange.hdc = pDC->m_hDC; CRect rcPage; GetClientRect(&rcPage); if(m_bPrint) { rcPage = rcPrint; } RecalcRect(rcPage); fmtRange.rcPage = rcPage; rectText.bottom += foDefaultFontHeight; RecalcRect(rectText); fmtRange.rc = rectText; CHARRANGE chrg = { 0, -1 }; fmtRange.chrg = chrg; m_DrawRTF.FormatRange(NULL, FALSE); m_DrawRTF.FormatRange(&fmtRange, TRUE); m_DrawRTF.FormatRange(NULL, FALSE);
这段代码可以用于打印预览,它会工作正常。但是我们不能将其用于打印到纸张。
- 对于打印到纸张模式,我们使用以下代码
szWinExt = pDC->GetWindowExt(); szViewExt = pDC->GetViewportExt(); nMapMode = pDC->SetMapMode(MM_ANISOTROPIC); int printLogx = pDC->GetDeviceCaps(LOGPIXELSX); int printLogy = pDC->GetDeviceCaps(LOGPIXELSY); pDC->SetWindowExt(printLogx, printLogy); pDC->SetViewportExt(CSize(printLogx, printLogy)); fmtRange.hdcTarget = pDC->m_hAttribDC; fmtRange.hdc = pDC->m_hDC; CRect rcPage; GetClientRect(&rcPage); if(m_bPrint) { rcPage = rcPrint; } RecalcRect(rcPage); fmtRange.rcPage = rcPage; rectText.bottom += foDefaultFontHeight; RecalcRect(rectText); fmtRange.rc = rectText; CHARRANGE chrg = { 0, -1 }; fmtRange.chrg = chrg; m_DrawRTF.FormatRange(NULL, FALSE); m_DrawRTF.FormatRange(&fmtRange, TRUE); m_DrawRTF.FormatRange(NULL, FALSE); pDC->SetMapMode(nMapMode); pDC->SetWindowExt(szWinExt); pDC->SetViewportExt(szViewExt);
在开始打印之前,我们必须更改映射模式、窗口范围和视口范围,并在完成打印后将其恢复。

点击 这里查看在线资料并报告错误。