Introduction
"Why do the drawing and printing preview of my rich text work fine, but when I tried to print to paper, it can't work?"
I found that many people asked this question several times and I hope this article and code can help you. This small application demonstrates how to draw rich text on the canvas, and then you can print preview or print to paper with the same look. The full source codes are contained within the zip file. There is no limit, you can use it freely.
How It Works?
- We defined a rich text control within the header file of class:
CTestRichEditPrintView
, as below:
CRichEditCtrl m_DrawRTF;
- We modify the
OnDraw
method of class: CTestRichEditPrintView
, the following codes are used for drawing to canvas:
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);
This code can be used for printing preview, it will work fine. But we can't use them for printing to paper.
- For printing to paper mode, we use the following code:
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);
We must change the map mode, window ext and viewport ext before starting to print, and when we finish printing, we need to get them back.
Click here to view online profile and report bugs.