Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Rich Text Drawing, Printing Preview and Printing to Paper (GDI only)

0.00/5 (No votes)
20 Mar 2006 1  
To help you build Rich Text Drawing, Print Preview, Printing to paper support report application quickly and easily, includes source code
richprintfirst.gif

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?

  1. We defined a rich text control within the header file of class: CTestRichEditPrintView, as below:
    // CRichEditCtrl for drawing.
    CRichEditCtrl m_DrawRTF;
  2. 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.

  3. 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.

richprintsecond.gif

Click here to view online profile and report bugs.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here