65.9K
CodeProject is changing. Read more.
Home

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

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (9 votes)

Mar 21, 2006

CPOL

1 min read

viewsIcon

59520

downloadIcon

1874

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.